向对象添加数据 - 验证*然后*添加,或在添加时验证?

时间:2011-04-18 10:46:02

标签: php oop design-patterns

采取以下示例,

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,因为如果你抛出异常,你不应该继续执行执行吗?

我很想知道是否有一个具体的设计模式可以遵循,或者不是人们的意见。

感谢。

2 个答案:

答案 0 :(得分:1)

先检查所有项目。

这允许交易行为,这通常是一件好事。这可以确保行为易于理解和调试。

性能方面,这也是可取的。

但是,如果你的目标是“做尽可能多的工作”,那么检查每个项目并尽可能添加它 - 如果一个项目失败,只需跳到下一个项目。不过,这是一个罕见的用例。

答案 1 :(得分:0)

我会说这取决于你是否愿意将“杯子”作为交易加入。当一个或几个杯子失败时,你想要加入所有的杯子吗?使用方法1.否则,方法2.

据我所知,这两种方法都是可行的并且有自己的用例。