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

    +162

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    class Program implements ProgramProvider {
            
            public static function getInstance() {
                    return new Program();
            }
    }

    Гениальная реализация singleton!

    Запостил: viktor_poltorak, 29 Марта 2012

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

    • > return new Program();
      разве будет работать?)
      Ответить
      • о, ещё как
        Ответить
      • Ну так а не вызывай getInstance несколько раз! Вызови один раз, положи в глобальную переменную... с синглтонами работать не умеешь, что ли?

        :)
        Ответить
    • а кто сказал, что это должен быть singleton?
      Ответить
      • Здравый смысл и getInstance?
        Ответить
      • Как говорят американцы если что то выглядит как собака, лает как собака то это собака. А это сингелтон.
        Ответить
    • class Program
      {
      	private static $_instance;
      
      	public static function getInstance()
      	{
      		if(self::$_instance === null){
      			// ...
      			self::$_instance = new self();
      		}
      		return self::$_instance;
      	}
      }
      Ответить
      • а наследники этого синглтона таковыми уже не будут
        Ответить
      • Теперь внимание: что помешает написать new Program() там, где я захочу?
        Ответить
        • приватный конструктор например
          Ответить
          • На него и был намёк (не вижу в сниппете приватного конструктора). Он же нужен для предотвращения наследования (которое с синглтонами ну никак не сочетается).
            Ответить
            • для предотвращения наследования используется слово final
              Ответить
              • Oh, really? :)
                От использования приватного конструктора эффект будет тот же самый
                Ответить
                • эффект далеко не тот же самый.
                  и если увидишь ебанутого, который зачем-то использует приватный конструктор вместо final, скажи, что он делает неправильно
                  Ответить
                  • Прятать все конструкторы приходится тогда, когда класс сам осуществляет контроль над созданием своих экземпляров (например, имеет фабрику ala EnumSet в java). Есть приятный? побочный эффект - если все конструкторы приватные, то унаследоваться от этого класса нельзя. final без приватного конструктора означает, что детали реализации критичны для приложения (к примеру, это верно для String, Integer и т.п.), но клиент волен сам создавать инстансы класса.

                    Т.е. имеют смысл 2 разных юзкейса:
                    1. Класс сам следит за инстансами, наследоваться нельза автоматически (final не нужен) - наш Singleton.
                    2. Клиент создаёт инстансы, final нужен для уверенности в выполнении неких инвариантов - String из java (jvm полагается на то, что строки immutable).
                    Ответить
                    • это конечно замечательно, но в php можно наследовать от класса с приватным конструктором
                      Ответить
                      • Понял, спасибо за разъяснение. Ни в Java, ни в c#, ни в с++ (насколько я могу судить из своих скудных знаний об этом языке http://ideone.com/53c8q) такого сделать нельзя. Тогда, конечно, без final никак.

                        PHP такой PHP...
                        Ответить
                        • В пхп много чего разрешено явно и еще больше можно сделать немного извернувшись, а в результате имеем несбалансированное, кривое, трудноотлаживамое говно.Ява-скрипт тоже страдает от своей вседозволенности, но там хоть нет бремени совместимости с предыдущими версиями.
                          Хотя... Именно говно-то там легко отлаживать. Большими кучами.
                          Ответить
    • Синглтон не нужен
      Ответить
      • особенно в юнит-тестах, когда для каждого теста нужно создавать отдельный экземпляр класса. бывает такое
        Ответить
      • в пхп - не особо
        Ответить
    • Дальше по коду частенько встречается
      $program = Program::getInstance();
      или того хуже
      $someVar = Program::getInstance()->callSomeMethod();
      Так что это скорее задумывалось как singleton
      Ответить
    • Сигнлтон или не синглтон, но афтар нарушил логику именования методов, ибо это - createInstance()
      Ответить
    • показать все, что скрытоvanished
      Ответить

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