采取以下示例,
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
}
}
在这个课程中,我们可以使用Cup
添加$myObject->addCup()
,但我们也可以使用$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,因为如果你抛出异常,你不应该继续执行执行吗?
我很想知道是否有一个具体的设计模式可以遵循,或者不是人们的意见。
感谢。
答案 0 :(得分:1)
先检查所有项目。
这允许交易行为,这通常是一件好事。这可以确保行为易于理解和调试。
性能方面,这也是可取的。
但是,如果你的目标是“做尽可能多的工作”,那么检查每个项目并尽可能添加它 - 如果一个项目失败,只需跳到下一个项目。不过,这是一个罕见的用例。
答案 1 :(得分:0)
我会说这取决于你是否愿意将“杯子”作为交易加入。当一个或几个杯子失败时,你想要加入所有的杯子吗?使用方法1.否则,方法2.
据我所知,这两种方法都是可行的并且有自己的用例。