看看下面的例子,将数据添加到对象 - 验证*然后*添加或验证添加?
class Cup {}
class MyObject {
protected $cups = array();
public function addCup(Cup $cup) {
if (!in_array($cup, $this->getCups())) {
array_push($this->cups, $cup);
}
return $this;
}
public function addCups(array $cups) {
// Add cups logic, see below
}
public function getCups() {
return $this->cups;
}
public function setCups(array $cups) {
// Set cups logic, see below
}
}
在这个类,我们可以添加使用$myObject->addCup()
一个Cup
,但我们也可以使用$myObject->addCups()
与$myObject->setCups()
添加多个杯子,或者重写任何现有的杯子。
我的问题是,在addCups()
和setCups()
方法,你验证所有传入的数据是有效的前加入他们,或者你验证为你加入他们吗?
方案1,验证之前添加:
public function addCups(array $cups) {
foreach($cups as $cup) {
if (!($cup instanceof Cup)) {
throw new InvalidArgumentException();
}
}
foreach($cups as $cup) {
$this->addCup($cup);
}
}
方案2,验证为添加:
public function addCups(array $cups) {
foreach($cups as $cup) {
if (!($cup instanceof Cup)) {
throw new InvalidArgumentException();
}
$this->addCup($cup);
}
}
我明白没有太大的区别在代码中,但它从根本上改变了对象如何添加/设置数据。在场景1中,如果要添加的所有数据都是有效的,则只能将新数据添加到对象,而场景2中的数据实际上将添加到错误点。
我个人一直在使用场景1,但是我不禁觉得你可能会使用场景2,因为如果你抛出异常,你不应该继续执行这个执行吗?
我很想知道是否有一个具体的设计模式可以遵循这一点,或者如果没有人的意见。
谢谢。
继续PerHolmäng的回答我会同意。我可以想到使用场景2的很少的用例。我现在坚持1,因为它也适合我需要的场景。欢呼为理智检查。 – 2011-04-18 10:56:58