我正在过渡到使用OOP进行我的所有项目,历史上我所构建的一切都非常小,OOP似乎不是一个有效的选择,但现在有大型项目。然而,最近我遇到了越来越多的“最佳实践”问题,我找不到答案。
例如,假设我有以下内容:
class numbers{
function __construct($number){
$this->number = (int)$number;
}
function add($add){
$this->added = $this->number + $add;
}
function multiply($multiply){
$this->multiplied = $this->number * $multiply;
}
function minus($minus){
$this->minused = $this->number - $minus;
}
function number(){
return $this->number();
}
}
现在假设我要应用add
,然后multiply
,然后minus
。每个阶段都可能失败(我没有在示例中包含它,但想象它就在那里)。这就是我的问题所在,我应该这样做:
$numbers = new numbers(8);
if($numbers->add(7)){
if($numbers->multiply(6)){
if($numbers->minus(7){
echo $numbers->number();
}else{
echo 'error minusing';
}
}else{
echo 'error multiplying number';
}
}else{
echo 'error adding number';
}
或者我应该在构造函数中包含该部分,例如:
class numbers{
function __construct($number){
$this->add(6);
$this->multiply(9);
$this->minus(7);
if($this->error){
return false;
}else{
return true;
}
}
function add($add){
$this->added = $this->number + $add;
if(!this->added){
$this->error = "couldn't be added";
}
}
function multiply($multiply){
$this->multiplied = $this->number * $multiply;
if(!this->multiplied){
$this->error = "couldn't be multiplied";
}
}
function minus($minus){
$this->minused = $this->number - $minus;
if(!this->minused){
$this->error = "couldn't be minused";
}
}
function number(){
return $this->number();
}
function error(){
return $this->error();
}
}
然后简单地做:
$numbers = new numbers(5);
if($numbers){
echo $numbers->number();
}else{
echo $numbers->error();
}
很抱歉,如果示例是长篇大论(也忽略了错误,我在这里写的只是为了概述我正在尝试做的事情,这不是我正在使用的代码......)但我不知道如何在没有例子的情况下表达问题。基本上,我应该检查班级内部的错误,还是应该在我打电话给班级时在外面做?
答案 0 :(得分:11)
在类内部更新上强制执行一致性几乎总是有意义的(即,任何时候方法都可以改变类的内部状态,检查输入)。如果输入格式不正确,或者该操作违反某些类不变量,则使用exceptions使其成为调用者的问题。
答案 1 :(得分:0)
在类中执行错误检查应该考虑该类方法失败的可能性。换句话说,如果你的数字类有一个除法,它应该检查以确保分母不是零。
对类的实例(类外)执行的错误检查应该验证是否返回了属性或类方法的正确结果。因为通常这不应该在设计良好的类中发生,所以通常会检查极端情况。
但是,当你开始有一个跟踪多个事情的课程时,我通常会进一步分类。创建用于处理数学函数的类,然后让您的数字类使用这些数学类。通过这种方式,您可以更好地分离关注点,更简洁的代码以及更轻松的测试。
答案 2 :(得分:0)
就个人而言,我会在第二个例子中远离你在构造函数中尝试做的事情。它硬编码实施,违反了information hiding principal。否则,不知道类内部的作用,当你执行$num = new Number(8);
时,很难理解为什么你会47
返回...它也违反了no magic number principal ... < / p>
至于方法,它们看起来很好。您可能希望在这些情况下抛出异常或返回布尔值。您选择的是比这里讨论的要多得多的因素(例如您的偏好,课程的具体内容,惯例等)......
哦,你班上有一些无限循环问题。 function number()
应该是:
function number() {
return $this->number;
}
同样适用于error()
...