多年来,我一直在办公室管理应用程序上写作(断断续续)。我需要重写它,因为代码变得不可维护,所以我将选择一个PHP框架,并将业务逻辑重写为类。
现在我陷入了一个基本问题:我还需要返回结果吗?如果需要,我该如何获取结果?一些伪代码来澄清我的问题:
function a( $1, $2, $3 ) {
doThis( if ... return TRUE; if ... return FALSE; );
if ( doThis() != TRUE ) { return; }
doThat();
}
与
class example {
private $1;
private $2;
private $3;
public function go() { $this->doThis(); $this->doThat(); }
private function doThis(){}
private function doThat(){}
}
$a = new example;
$a->go();
如果doThis()-方法没有按预期执行,我该如何停止go()方法的执行?如果某个属性设置为false,我想我不应该返回布尔值并检查每个方法内部?或者,如果出现问题,我只是抛出一个Exception,如果一切正常,我什么都不做?
这很基本,我知道。。。
Thx!
异常是针对exceptional behaviour
的,所以不要因为代码不处于首选状态就抛出异常。当谈到编写OOP时,有些人仍然设法在使用面向对象的框架的同时编写过程性的,显然你想避免这种情况,一个简单的经验法则是不要编写God对象。
现在我猜你想做的是调用两个应该按特定顺序调用的函数,有几种方法可以做到这一点,实际上可以归结为,你有什么样的类。假设您有一个类型为Person
的对象,那么您可能想从其他地方对该对象调用不同的方法:
$john = new Person();
$john->tryToWakeUp();
if($john->isAwake) {
$john->brushTeeth();
} else {
echo "John is still sleeping!";
}
另一方面,您可能有一个类型为Engine
的对象,它可能想在内部为某些操作做一些事情,比如start:
class Engine {
public function start() {
$this->checkFuel();
if($this->hasFuel()) {
try {
$this->initializeSomethingThatHasToDoWithEngineStartUp();
} catch (EngineException $ee) {
$this->engineState = BAD_ENGINE;
Logger::log("Engine did not start");
}
}
}
}
我建议你在尝试转换所有业务规则之前,先阅读一下面向对象的设计,并尝试一下它,因为很可能在转换到一半的时候,你会意识到你设计的一切都错了。面向对象设计并不容易,但它确实有意义编辑:(它应该有意义)。