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

    −40

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    class Cms extends Object
    {
    
      static $tree;
    
      static $routes;
    
      static $smartyVars;
    
    
      function &getInstance()
      {
        static $instance = array();
    
        if (!$instance) {
          $instance[0] = new Cms();
        }
        return $instance[0];
      }

    Класс полностью не писал в 100 строк не влезет , так и не понял что делает метод getInstance
    это радость в недо-ЦМС с элементами CakePhp

    Запостил: als_1984, 26 Января 2017

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

    • Паттерн «Одиночка» (Singleton). Если объект не инициализировался, создаём экземпляр. Если экземпляр уже создан, возвращаем его.

      Смущает только массив. Задел на будущее, если вдруг понадобится создать несколько экземпляров?
      Ответить
      • Синглтон легко превращается из одиночки в не одиночку!
        function &getInstance()
          {
            static $instance = array();
            static $i = 0;
        
            $instance[i] = new Cms();
        
            return $instance[i++];
          }
        Ответить
        • multiton? manyton? mangleton?
          Ответить
          • фабрика!
            Ответить
            • паттерна "фабрика" не существует
              Ответить
            • но фабрика как правило не хранит указателей на созданные объекты.

              конвеер?
              Ответить
              • > но фабрика как правило не хранит указателей на созданные объекты.
                Паттерн godfather:

                Good. Someday, and that day may never come, I'll call upon you to do a service for me. But until that day, accept this instance as a gift on my daughter's wedding day.
                Ответить
      • не удивит если какие пышники пробенчмаркнули и установили что проверка наличия элементов в массиве быстрее чем проверка поинтера. там на php.net таких завались.
        Ответить
      • singleton activerecord найди 10 отличий
        <?php
        /**
        * @package ActiveRecord
        */
        namespace ActiveRecord;
        /**
        * This implementation of the singleton pattern does not conform to the strong definition
        * given by the "Gang of Four." The __construct() method has not be privatized so that
        * a singleton pattern is capable of being achieved; however, multiple instantiations are also
        * possible. This allows the user more freedom with this pattern.
        *
        * @package ActiveRecord
        */
        abstract class Singleton
        {
        /**
        * Array of cached singleton objects.
        *
        * @var array
        */
        private static $instances = array();
        /**
        * Static method for instantiating a singleton object.
        *
        * @return object
        */
        final public static function instance()
        {
        $class_name = get_called_class();
        if (!isset(self::$instances[$class_name]))
        self::$instances[$class_name] = new $class_name;
        return self::$instances[$class_name];
        }
        /**
        * Singleton objects should not be cloned.
        *
        * @return void
        */
        Ответить
        • ох лол, это Универсальный Синглетон: по объекту на класс чтоли?

          Вообще конечно говно. В нормальных ЯП синглетон делается одной строчкой
          Ответить
          • и какие языки нормальные? пример из с++
            // Singleton.h
            class Singleton
            {
            private:
            static Singleton * p_instance;
            // Конструкторы и оператор присваивания недоступны клиентам
            Singleton() {}
            Singleton( const Singleton& );
            Singleton& operator=( Singleton& );
            public:
            static Singleton * getInstance() {
            if(!p_instance)
            p_instance = new Singleton();
            return p_instance;
            }
            };

            // Singleton.cpp
            #include "Singleton.h"

            Singleton* Singleton::p_instance = 0;
            Ответить
            • Плюсы не очень лаконичный язык, но от них и не ждут такого. А вот скриптовые языки могли бы, но пхп не осилил.

              В котлине
              object MySingleton


              В питоне. Создаем метакласс, потом юзаем
              class Singleton(type):
                  _instances = {}
                  def __call__(cls, *args, **kwargs):
                      if cls not in cls._instances:
                          cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
                      return cls._instances[cls]


              И потом просто:
              class MySingleton:
                  __metaclass__ = Singleton


              Груви:
              @Singleton //Аннотация такая 
              class MySingleton {
              }


              Руби
              class MySingleton
                 include Singleton # https://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html
              end


              В общем пых, как всегда, доказал свою ущербность
              Ответить
              • Пример с include честный?
                Ответить
                • не знаю, тут так написано
                  https://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html ;)

                  зы: ну честный конечно, что не так?
                  Ответить
                  • Содержимое инклюдника:

                    class << Singleton # :nodoc:
                        def __init__(klass) # :nodoc:
                          klass.instance_eval {
                            @singleton__instance__ = nil
                            @singleton__mutex__ = Mutex.new
                          }
                          def klass.instance # :nodoc:
                            return @singleton__instance__ if @singleton__instance__
                            @singleton__mutex__.synchronize {
                              return @singleton__instance__ if @singleton__instance__
                              @singleton__instance__ = new()
                            }
                            @singleton__instance__
                          end
                          klass
                        end
                    
                        private
                    
                        # extending an object with Singleton is a bad idea
                        undef_method :extend_object
                    
                        def append_features(mod)
                          #  help out people counting on transitive mixins
                          unless mod.instance_of?(Class)
                            raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}"
                          end
                          super
                        end
                    
                        def included(klass)
                          super
                          klass.private_class_method :new, :allocate
                          klass.extend SingletonClassMethods
                          Singleton.__init__(klass)
                        end
                      end


                    Это только фрагмент. Всё в комментарий не влезет.
                    Ответить
                    • а не похую-ли что там написано, если это есть уже готовое?
                      Ответить
                      • Ну тогда почти на любом языке можно найти фреймворк/библиотеку, где лежит уже готовый класс Singleton.
                        Ответить
              • > Плюсы не очень лаконичный язык, но от них и не ждут такого.

                Я вас умоляю... Написал один раз шаблон и делай себе Singleton<MyClazz>::get(). Другое дело, что синглетоны не нужны.
                Ответить
                • Ну речь же шла не о написании, а о стандартной либе. Или такойтшаблон уже есть?

                  Синглтоны нужны, но управлять ими должен DI. Самопись не нужна, правда
                  Ответить
          • PHP не Питон. В PHP чуть ли не любой код можно записать в одну строчку.
            Ответить
            • оказалось что в петоне многобуквеннее всего,ибо там нет в поставке синглетона
              http://govnokod.ru/22043#comment368652

              победил котлин
              Ответить
          • да и весь прикол в логике, свойство $instance должно быть в классе, но никак не в методе, да и я не видел чтоб singleton наследовался
            Ответить
        • Нашёл одно: в недо-ЦМС ссылка на экземпляр всегда пишется в нулевой элемент массива, а в activerecord запись производится по ключу, соответствующему имени класса. Т. е. в activerecord оставлен задел для наследования класса Singleton без доработки, а в недо-ЦМС каждый синглтон нужно писа́ть с нуля.
          Ответить
    • Technical post. RSS fixed.
      Ответить

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