почему? что там такого outstanding, что заставляет Вас так говорить? На всякий случай — говоря о лимбе, я имел ввиду стиль, код и подход к решению определенных задач
Я «пришел» в php из Flash/Flex, имея вобщем-то немалый «багаж» в архитектурировании приложений. Продирался довольно долго через отсутствие полноценного контекста приложения. Упрощал сам несколько раз решения, отказывался от шаблонов проектирования, к которым привык. Что-то вырисовал для себя, чем сейчас и пльзуюсь.
Интерфейсы абсолютно не лишние (по крайней мере для меня). Самый простой пример — инверсия зависимостей (базовые зависимости — это интерфейсные зависимости) Это отлично применимо и к динамическим языкам и к любым другим. Еще один пример — реализация паттерна Наблюдатель в интерфейсах. Отличная вещь, которая в купе с memcached, паттерном ActiveRecord и IdentityMap позволила выжить довольно сложному высоконагруженному проекту и показать производительность на 30% выше при прочих равных в сравнении с процедурным кодом.
айайай! Вы даже не удосужились глянуть на страницу www.php.net/~helly/php/ext/spl/ — страницу этой самой библиотеки.
Все дело в том, что эта библиотека дала возможность использовать нативные интерфейсы RecursiveIterator, IteratorAggregate, OuterIterator, Countable, SplObserver и достаточное количество абстрактных классов для построения сложных систем.
А нужны они по одной простой причине — для написания качественного, расширяемого кода.
Посмотрите limb, onPHP, mzz — сложные и интересные объектные струтктуры — и Ваш сарказм заметно поубавится :)
Итерировать по исключению не есть гуд. Не нагружайте инструмент лишним функционалом. FormValidator - отдельно, FormValidationException - отдельно, с кодом ошибки и сообщением (const FIRST_FIELD_ERROR, const LAST_FIELD_ERROR ....).
Несколько скомканный пример, а в целом хорошо. Исключения - очень хорошая практика ИМХО.
public function offsetGet($offset) {
if (isset($this->attributes[$offset]))
return $this->attributes[$offset];
throw new Exception("Атрибута [$offset] не существует");
}
public function offsetExists($offset) {
return isset($this->attributes[$offset]);
}
--------------------------------------------------------
Метод offsetGet необходимо переписать с учетом существования метода offsetExists
молодцы, отличная работа! успехов вам!
Бюджет — 25тыс.
Делаем за 20, 5 — лично Вам на подарки жене и детям ;)
Интерфейсы абсолютно не лишние (по крайней мере для меня). Самый простой пример — инверсия зависимостей (базовые зависимости — это интерфейсные зависимости) Это отлично применимо и к динамическим языкам и к любым другим. Еще один пример — реализация паттерна Наблюдатель в интерфейсах. Отличная вещь, которая в купе с memcached, паттерном ActiveRecord и IdentityMap позволила выжить довольно сложному высоконагруженному проекту и показать производительность на 30% выше при прочих равных в сравнении с процедурным кодом.
А то, что кто-то не поленился — честь и хвала :)
Все дело в том, что эта библиотека дала возможность использовать нативные интерфейсы RecursiveIterator, IteratorAggregate, OuterIterator, Countable, SplObserver и достаточное количество абстрактных классов для построения сложных систем.
А нужны они по одной простой причине — для написания качественного, расширяемого кода.
Посмотрите limb, onPHP, mzz — сложные и интересные объектные струтктуры — и Ваш сарказм заметно поубавится :)
а с -1 никогда не пробовали переписывать?
Несколько скомканный пример, а в целом хорошо. Исключения - очень хорошая практика ИМХО.
if (isset($this->attributes[$offset]))
return $this->attributes[$offset];
throw new Exception("Атрибута [$offset] не существует");
}
public function offsetExists($offset) {
return isset($this->attributes[$offset]);
}
--------------------------------------------------------
Метод offsetGet необходимо переписать с учетом существования метода offsetExists