Возьмите следующий пример,
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, потому что, если вы сгенерировали исключение, вам все равно не следует продолжать выполнение?
Я бы хотел знать, есть ли конкретный шаблон проектирования, которому можно следовать по этому, или нет мнения людей.
Спасибо.