PHP OOP理论-类内或类外的错误检查?
我正在过渡到在我所有的项目中使用OOP,从历史上看,我构建的所有东西都非常小,OOP似乎不是一个有效的选择,但现在在大型项目中它是。然而,最近我遇到了越来越多的“最佳实践”问题,我无法找到答案 例如,假设我有以下内容:PHP OOP理论-类内或类外的错误检查?,php,oop,Php,Oop,我正在过渡到在我所有的项目中使用OOP,从历史上看,我构建的所有东西都非常小,OOP似乎不是一个有效的选择,但现在在大型项目中它是。然而,最近我遇到了越来越多的“最佳实践”问题,我无法找到答案 例如,假设我有以下内容: class numbers{ function __construct($number){ $this->number = (int)$number; } function add($add){ $this->
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();
}
}
现在让我们假设我想应用加
,然后乘
,然后减
。每个阶段都可能失败(我没有在示例中包括这一点,但想象一下它就在那里)。这就是我的问题所在,我应该:
$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();
}
很抱歉,如果这个例子冗长(也忽略错误,我在这里写它只是为了概述我正在尝试做什么,这不是我正在使用的代码…),但是我不知道如果没有一个例子,如何表达这个问题。基本上,我应该在类内部检查错误,还是在调用类时在外部检查错误 在类内部的更新上强制一致性几乎总是有意义的(即,任何时候一个方法可以改变类的内部状态,请检查输入)。然后,如果输入格式不正确,或者该操作将违反某些类不变量,则使用将其作为调用方的问题。在类内部执行的错误检查应考虑该类的方法失败的可能性。换句话说,如果你的数字类有一个除法,它应该检查以确保分母不是零 对类实例(类外部)执行的错误检查应该是验证返回的属性或类方法的结果是否正确。由于设计良好的类通常不应该出现这种情况,所以您通常会检查极端情况
然而,当你开始有一个类来跟踪多个事情,比如你的案例时,我通常会进一步分离这个类。创建处理数学函数的类,然后让数字类使用这些数学类。通过这种方式,您可以更好地分离关注点、更整洁的代码和更容易的测试。就我个人而言,我不想在第二个示例中尝试在构造函数中执行什么。它对实现进行硬编码,并违反了。否则,当您执行
$num=newnumber(8)时,不知道类在内部做什么代码>,很难理解你为什么要拿回47
。。。它也违反了不
至于方法,我觉得不错。在这些情况下,您可能希望抛出异常或返回布尔值。您选择的是一个比这里讨论的因素多得多的因素(例如您的偏好、类到底在做什么、惯例等等)
哦,你们班上有一些无限循环的问题<代码>函数编号()
应为:
function number() {
return $this->number;
}
error()
…@fructedWithFormsDesigner也一样:为什么要编辑?该方法称为“减号”——在这种情况下使用动词形式是完全可以接受的。我认为你的编辑使这个问题更加混乱,而不是更少。@Gian:当使用方法名称作为动词时,通常最好清楚地表明你所说的是方法,而不是一般的、更类似的动词。这句话:“我想加
,然后乘
,然后减
”清楚地表明,你说的是调用减
方法,而不是试图将“减”这个词误用为动词。在英语国家,它被称为减法。减号是一个符号。@我同意,这是一个更好的编辑,我想@hopeseekr,这完全忽略了OP将方法命名为“减号”的事实,因此术语的一致性表明继续使用相同的术语(对或错)比依赖外部定义更有意义。方法名称也可以是“苹果”、“梨”和“香蕉”,然后句子会是“我想要苹果,然后是梨,然后是香蕉”。这是非标准用法,但在英语中肯定有优先权(而且,我也是母语人士)。+1来自我。比我(现在已删除)的回答更好地陈述了情况。我还没喝咖啡呢,那你就应该对我的答案投赞成票。虽然我做的很少,但我确实为每一件可能出错的事情添加了检查(除了像缺乏记忆这样的疯狂事情)。