Про регистр

Духовность™

Продвинутый новичок
Про регистр

Решил почитать об этом паттерне. Нашел более-менее внятный обзор и пример кода на PHP: http://mabp.kiev.ua/2008/04/17/pattern-registry/

Я так понимаю, основное предназначение регистра это:

- имитация глобалсов
- попытка содержать в себе все популярные объекты
- и, как я понял, что самое важное - абстрагирование от имени класса

Т.е. вместо

PHP:
$b = new B();
делаем
PHP:
// Или короткий способ
$b = Registry::get("B");
или вместо

PHP:
$db = Database::getInstance();
примерно вот это:
PHP:
// Создание обычного объекта c параметрами
$db = Registry::factory("Database",array(...));
И там и там мы привязываемся к идентификатору - класса или ключа регистра. В чем особая разница? Реальный смысл этого?
 

Adelf

Administrator
Команда форума
Registry::set("Database", new MySQLDB());
or
Registry::set("Database", new OracleDB());
?

Или
Registry::set("MainDatabase", new OracleDB('login", ...));
Registry::set("SystemDatabase", new OracleDB('another_login", ...));

Наверно это и есть преимущества идентификатора-ключа.
 

whirlwind

TDD infected, paranoid
Ну и где в Registry::get абстрагирование от имени класса? Реестр - это сохранил/получил. Lazy load - это фабрика.
 

fixxxer

К.О.
Партнер клуба
// Создание обычного объекта c параметрами
$db = Registry::factory("Database",array(...));

оп-па, это уже фабрика :)
 

Adelf

Administrator
Команда форума
>> Ну и где в Registry::get абстрагирование от имени класса?

А что мы там по имени класса достаем объекты что-ли?
 

fixxxer

К.О.
Партнер клуба
http://www.phppatterns.com/docs/design/the_registry

хотя я (и как щас выяснил - Фаулер тоже) считаю что должен быть не set а add:

PHP:
class Registry {

    protected $cache_stack;
    
    private function __construct() {
        $this->clear();
    }

    private function __clone() {}

    public function add($key, $item) {
        if ($this->has($key)) {
            throw new LogicException("Entry '$key' already exists");
        }
        $this->replace($key, $item);
        return $this;
    }

    public function replace($key, $item) {
        $this->cache_stack[0][$key] = $item;
        return $this;
    }

    public function get($key) {
        if (!$this->has($key)) {
            throw new OutOfBoundsException("Entry '$key' not found in registry");
        }
        return $this->cache_stack[0][$key];
    }

    public function has($key) {
        return array_key_exists($key, $this->cache_stack[0]);
    }

    public function clear() {
        $this->cache_stack = array(array());
        return $this;
    }

    public static function getInstance() {
        static $instance = false;
        if (!$instance) {
            $instance = new self;
        }
        return $instance;
    }

    public function save() {
        array_unshift($this->cache_stack, array());
        if (!count($this->cache_stack)) {
            throw new LogicException('Registry lost');
        }
        return $this;
    }

    public function restore() {
        array_shift($this->cache_stack);
        return $this;
    }

}
 

zerkms

TDD infected
Команда форума
fixxxer
какая элегантная реализация стека на пхп! (не стёб)
 

fixxxer

К.О.
Партнер клуба
а это я вот там по ссылке спер. :) хотя на самом деле впервые такое увидел у Маркуса Бейкера (simpletest, phemto ..)

-~{}~ 11.12.09 02:47:

triumvirat
для юнит-тестирования, прежде всего
 

Духовность™

Продвинутый новичок
fixxxer
тогда возвращаясь к моему вопросу "а как регистр должен выглядеть без фабрики": лично я в этом ригистре не увидел ничего "интересного" (читай - полезного). ОО-Обертка над голобалсами. Или я не прав?
 

zerkms

TDD infected
Команда форума
для юнит-тестирования, прежде всего
живой пример, когда использование паттернов (реестра, в частности) не уменьшает связанности кода и какбе намекает нам на то, что пора начинать читать больше о IoC/DI, а также когда недостатки проектирования заставляют в код вносить методы, предназначенные только для обеспечения тестируемости кода :)

-~{}~ 11.12.09 09:55:

triumvirat
это вопрос (и придирка тоже) концептуальный. по своей природе registry это как раз исключительно
ОО-Обертка над голобалсами
. если он выполняет какую-то ещё дополнительную работу (вроде создания объектов, обеспечения единственности экземпляра объекта в программе, ленивой инстанциации, итд итп), тогда это не реестр в чистом виде, а симбиоз реестра + фабрики, синглтона, прокси/лейзи-лоад, итд итп
 

fixxxer

К.О.
Партнер клуба
>>не уменьшает связанности кода и какбе намекает нам на то, что пора начинать читать больше о IoC/DI

ага.

потому я его и не использую. собственно этот код был выброшен подальше от транка где то через 20 минут после написания =)

сейчас вообще считаю, что все депенденсы должны передаваться через конструктор и/или сеттеры. где IoC а где явно - зависит от контекста и здравого смысла )
 
Сверху