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

    +157

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    class WP_Post {
    	public static function get_instance( $post_id ) {
    		...
            }
    	public function __construct( $post ) {
    		foreach ( get_object_vars( $post ) as $key => $value )
    			$this->$key = $value;
    	}

    Вордпресс 3.9.1. Создать объект можно только из объекта. Ну или передав айдишник записи (что само по себе еще логично), но называется эта хуйня почему-то get_instance(), словно это синглтон.

    Запостил: Fike, 02 Июля 2014

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

    • get_instance - получить экземпляр. Почему синглтон? Если бы было get_unique_instance тогда еще можно было бы понять жалобы.
      Ответить
      • Потому что во всех синглтонах используют именно это наименование для получения инстанса, и, естественно, ожидается именно такое поведение. Да и функционал немного отличен от простого получения экземпляра.
        Ответить
        • Ну мало ли где используют, а если во всех самолетах используют алюминиевый сплав для деталей, это ж не значит, что его нельзя использовать в велосипедах.
          Ответить
        • в сингелтонах конструктор объявляется приватным.
          Ответить
          • Сингелтоны нинужны.
            Ответить
            • Никогда не понимал нах нужен классический синглтон. Есть же статичный класс.
              Ответить
              • Ну, синглтон, имхо, все же лучше класса с пачкой статических членов. По крайней мере его легче сконвертить в обычный класс, если вдруг всё-таки понадобится несколько инстансов.
                Ответить
                • Имхо таки расширения раз в 100 лет происходит. Обычно синглтон в коде означает - смотрите, я умею паттерны!
                  Ответить
                  • Кому означает?
                    Ответить
                  • есть случаи когда нужен сингелтон или сам следи что бы не было нескольких инстансов пример логера уже наверное классический.
                    Ответить
                    • Ну вот о чем я и говорю - сингелтон нинужен*.

                      * За исключением пары-тройки относительно редких случаев типа логгера или какой-нибудь фабрики.
                      Ответить
                      • Согласен. Я говорю о том же. Ну я больше хейтер, да
                        Ответить
                    • Есть еще вот такой вариант - пусть инстансы сами следят, что некая деталь реализации у них в единственном экземпляре. Т.е. экземпляры разные, одновременно их может существовать хоть 100500, но часть данных у них общая, и они не дерутся. Запамятовал, как по-научному называется этот паттерн. Monostate что-ли. Пусть Кегдан напомнит.

                      У этой штуки есть несколько плюсов:
                      + в отличие от синглтона единственность не торчит наружу, а является всего лишь деталью реализации;
                      + всегда можно сделать так, чтобы часть инстансов работала с одним блоком данных, а часть - с другим (например поюзав thread local storage).
                      Ответить
                      • Т.е. использование того же логгера может выглядеть так:
                        class some_handler {
                        public:
                            some_handler(session_id_t sid) :
                                sid(sid)
                            {
                                log.set_prefix("[SESS " + std::to_string(sid) + "]");
                                // ...
                                log.info("Handler created");
                            }
                        
                            ~some_handler() {
                                log.info("Handler destroyed");
                            }
                        
                            void handle(const Message &msg) {
                                log.info("Incoming message");
                            }
                        
                        private:
                            log_source log;
                            session_id_t sid;
                        };
                        И никакая "уникальность логгера", "сингелтоны" и "статические классы" тут нахер не сдались, и будут только мешать.
                        Ответить
                      • приватные статические свойства/методы ?
                        Ответить
                        • > приватные статические свойства/методы ?
                          Можно так. А можно по-другому, например каким-нибудь приватным синглтоном, доступным только внутри реализации либы. И это абсолютно неважно, т.к. является деталью реализации такого класса. На уникальность тут ничего не намекает, кроме, возможно, заметок в документации в духе "не пидорасит лог-файл даже если создать 100500 инстансов log_source (при этом каждый из них не потокобезопасен)", или "не бойтесь создавать инстансы, когда они вам нужны, т.к. таблицу переводов они подгрузят всего один раз".
                          Ответить
                          • P.S. В общем что я хотел сказать: синглтон - это говнопаттерн, приводящий к нарушению инкапсуляции. Наружу утекает такая никому не интересная деталь реализации, как единственность некой херни. Из-за ленивой инициализации единственного экземпляра - нельзя передать параметры в конструктор, из-за насильственной единственности - нельзя подкрутить какие-то локальные настройки.

                            Фактически, синглтон с его get_instance() ничем не лучше r/o глобальной переменной. Даже хуже - больше писанины.
                            Ответить
                            • А особо извращенные способы написания синглтона через рефлексию вообще поражают
                              Ответить
                      • Чет я такого паттерна не помню. Ну в качества примера можно флайвейт наверное привести - По виду обьектов хоть жопой ешь, а по сути - парачка уникальных, которые все ююзают по очереди. Типа буквы - по виду букв а много, а по факту буква везде одна и таже
                        Ответить
                      • > Т.е. экземпляры разные, одновременно их может существовать хоть 100500, но часть данных у них общая, и они не дерутся.

                        и вообще, это все детали реализации, которая сокрыта. вот без доки и сорцов нет же гарантии, что фабричный метод вернет тот же класс, возьмет из пула или будет плодить сущности.

                        а есть еще интересная штука, когда экземпляр один, но в зависимости от места\времени использования данные различны. что-то вроде прокси

                        заебался я играть в эти игры "назови код Паттерном": код одинаковый, а называется в зависимости от точки зрения по-разному
                        Ответить
              • > статичный класс

                унылый маразм для странных людей, не могущих в свободные функции
                Ответить
                • > унылый маразм для странных людей, не могущих в свободные функции
                  Java и C# - унылый маразм от странных людей, не умевших в свободные функции.
                  Ответить
                  • Что есть свободные функции?
                    Ответить
                    • которые не нужно оборачивать в class MyShitApplication, они и так работают, по имени
                      ваш кэп
                      Ответить
                      • Я думал что то умное, а это опять нытье в стиле "Мне дали светло-синий фломастер. а я хотел голубой!"
                        Ответить
                        • пф, вы просто никогда не пробовали нормальных перегрузок и статического полиморфизма.
                          Ответить
              • Каст к интерфейсу, наследование, ленивая инициализация.
                Ответить
                • Первые 2 встречаются чуть реже чем никогда, в нормальных языках у статических классов тоже отложенная инициализация
                  Ответить
                  • У меня все синглтоны для чтения данных используются как раз через интерфейс и унаследованы от абстрактного класса, умеющего работать с базой ;)
                    Ответить
                    • Ну тут да. Но я бы скорее назвал это шлюзом
                      Ответить
                      • Отличительная чирта синглтона - единственность экземпляра, так что они точно синглтоны :)
                        А по поводу шлюза надо ещё думать, подходят они под его определение или нет...
                        Ответить
                        • Шлюз - класс или уровень, инкапсулирующий общение с внешними данными
                          Ответить
                          • Просто там немного иная архитектура, поэтому шлюзом их считать скорее всего неправильно, для этого есть другие классы.
                            Ответить
              • нах статические классы есть же функции.
                Ответить
                • > нах статические классы есть же функции.
                  У шарпеев и жабистов их нет.
                  Ответить
          • Ох, Василий, ну что ж вы меня просвещаете-то.
            Ответить
    • s/get_instance/find_by_id/g
      fixed?
      Ответить
    • клонирование прямо в конструкторе, заебись.
      Ответить
      • Конструктор копирования, как в крестах.
        Ответить
        • Пыха вообще младший брат крестов
          Ответить
          • младший вовсе был дурак?
            Ответить
            • Старший тоже не отличался умом и сообразительностью
              Ответить
              • Семья уродов.
                Ответить
                • В семье не без урода. Особенно в семье уродов

                  Там еще папа дохлый страус

                  Ответить
                • Цепочка эволюции (как у покемонов)
                  Крестонуб -> Крестец -> Программист на плюсах -> Крестовик -> Крестоблядь -> Начальник кладбища -> Бог-кресторатор
                  Ответить
                  • -> Бог-кресторатор -> defecate++
                    Ответить
                  • Кстати, а почему бог? Наверное все же Лич-Кресторатор или Крестомант, раз после кладбища.
                    Ответить

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