1. PHP / Говнокод #4296

    +167

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    // seen in real project
    
    class SomeClass extends AnotherClass {
        protected $_AnotherClass = null;
        
        public function __construct() {
            $this->_AnotherClass = new AnotherClass();
        }
    }

    Сочная вырезка из структуры классов.

    Запостил: shizzard, 20 Сентября 2010

    Комментарии (13) RSS

    • И что, таки это работает?
      Ответить
      • А почему это не должно работать? Просто по некоторым причинам все вызовы объекта SomeClass делегируются объекту AnotherClass. Да-да, через __call(), __get(), __set()
        Ответить
        • нет, я это понял)

          я имел ввиду -- и что, этот код живет в продакшене?
          зачем он?

          Я знаю, как работает паттерн wrapper (он же decorator), но тут-то он ничерта не делает!
          Ответить
          • А разгадка одна - ORM. Не помню точно, но имя таблицы для выполнения запросов каким-то образом транслируется из имени класса. А просто заюзать AnotherClass не получается. Тоже по определенным причинам :)
            Ответить
            • круто!
              Но ведь в PHP принято давать таблицам префиксы (что бы можно было разместить восемь версий приложения на одной базе, и не платить хостингу два доллара за еще одну базу).

              Так что нужно давать классу префикс.
              Если представить, что в системе например есть 20 классов, которые надо сохранять в базе, то в мануале можно написать так:

              Q: Как мне поддержать префикс таблицы?
              A: Создайте класс следующего содержания:
              class <ВАШ_ПРЕФИКС>_SomeClass extends AnotherClass {
                  protected $_AnotherClass = null;
                  
                  public function __construct() {
                      $this->_AnotherClass = new AnotherClass();
                  }
              }

              для каждого из классов
              Ответить
              • эмм... Кажется, можно уже и без префиксов, в 5.3 пыхе наконец появились неймспейсы
                Ответить
              • Ну я бы не сказал, что так принято.
                И вообще, вся эта вырвиглазная херня была написана для того чтобы не вносить изменения в существующий код ORM. Да, можно рефакторить, но это, как обычно, "когда-нибудь потом".
                Ответить
          • ого, тут даже не то, что бы декоратор, а прокси
            Ответить
            • Вы правы.
              Декоратор должен добавлять новый функционал, а этот ичего не добавляет.

              Шиззард уже пояснил -- зачем такое надо.
              Ответить
              • немного оффтопа. почему-то я привык, что шаблон проектирования - это wrapper, обертка. А "декоратор" мне напоминает про АОП
                Ответить
                • Вообще официально он wrapper, но gang of 4 пишут: "так же известен как decorator"
                  Ответить

    Добавить комментарий