Добавление данных в объект - проверка * затем * добавление или проверка при добавлении? - PullRequest
0 голосов
/ 18 апреля 2011

Возьмите следующий пример,

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 ]

1 голос
/ 18 апреля 2011

Сначала проверьте все элементы.

Это учитывает поведение транзакций, что, как правило, хорошо.Это гарантирует, что поведение легко понять и отладить.

Мудрость производительности, это также предпочтительнее.

Однако, если ваша цель - «выполнить как можно больше работы», то проверьтеэлемент и добавьте его, если это возможно - если один элемент выходит из строя, просто перейдите к следующему.Это редкий случай использования.

0 голосов
/ 18 апреля 2011

Я бы сказал, это зависит от того, хотите ли вы добавить добавление «Кубков» как транзакцию или нет.Вы хотите, чтобы добавление всех чашек завершилось неудачей, если одна или несколько чашек (с) не работают, используйте метод 1. В противном случае, метод 2.

Насколько я знаю, оба метода жизнеспособны и имеют свое собственное использование.-cases.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...