php:过程到对象-结构


php: procedural to objects - structure?

多年来,我一直在办公室管理应用程序上写作(断断续续)。我需要重写它,因为代码变得不可维护,所以我将选择一个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");
            }
        }
    }
}

我建议你在尝试转换所有业务规则之前,先阅读一下面向对象的设计,并尝试一下它,因为很可能在转换到一半的时候,你会意识到你设计的一切都错了。面向对象设计并不容易,但它确实有意义编辑:(它应该有意义)。