Как плохо одиночные элементы?

Так....

Существует, очевидно, много вопросов, что всех спросили об Одиночных элементах, Глобальных Переменных состояния и всем этом большом материале. Мой вопрос,

Если Singletons и Globals Так Плохи, Почему они используются так часто?

Следующими примерами являются просто первое, что пришло на ум, что я верю, используются хорошим блоком людей.

Я даю Вам функцию от CodeIgniter, который использует psuedo-одноэлементную функцию:

(system\codeigniter\Common.php Строка 89)

/**
* Class registry
*
* This function acts as a singleton.  If the requested class does not
* exist it is instantiated and set to a static variable.  If it has
* previously been instantiated the variable is returned.
*
* ......
*/
function &load_class($class, $instantiate = TRUE)
{
    static $objects = array();

    // Does the class exist?  If so, we're done...
    if (isset($objects[$class]))
    {
        return $objects[$class];
    }
  .......
}

Путем размещения каждого объекта в единственный реестр Вы не можете использовать их функцию load_class для создания нескольких экземпляров чего-либо. Это особенно неудобно, когда Вы хотите использовать классы в качестве структур данных.

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

Вся Система Wordpress, которая работает главным образом на глобальных переменных. Все данные для цикличного выполнения через сообщения усыпаны о в различном globals.

(wp-includes\query.php Строка 2644)

/**
 * Setup global post data.
 *
 *....
 */
function setup_postdata($post) {
    global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;

    $id = (int) $post->ID;

    $authordata = get_userdata($post->post_author);
    ....
}

Это всего два основных примера Платформ, которые используют Singleton/Globals в качестве основания для их всей системы!

Так.. это просто, потому что эти системы не поймали до методологии ООП? Это просто не имеет смысла, когда у Вас есть столько людей, говорящих Вам не использовать Глобальные переменные или Одиночные элементы, сделать Вашу всю систему на основе упомянутых методов.

Конечно, существует аргумент о назад-совместимости с PHP4. Я все еще думаю, что были способы сделать программирование ООП в PHP4, поскольку классы были все еще доступны.

6
задан Tyler Carter 3 January 2010 в 21:00
поделиться

7 ответов

Потому что работать с синглонами относительно просто, и работа без них требует гораздо более детального планирования структуры вашего приложения. Некоторое время назад я задал вопрос об альтернативах и получил на него интересные ответы.

9
ответ дан 8 December 2019 в 04:52
поделиться

Причины в приложениях, основанных на PHP4, таких как WP или CI, частично объясняются худшей поддержкой ООП конструкций в PHP4.

Глобусы и синглеты также просты: Для того, чтобы сделать что-нибудь глобально, нужно гораздо меньше думать, чем строить это с помощью правильных ООП-практик. К ним тоже проще получить доступ, просто наведите код на имя и все, вместо того, чтобы передавать объект откуда-то еще.

Одним из отрицательных побочных эффектов глобального состояния (глобальные переменные, синглоны и т.д.) является то, что это значительно усложняет юнит-тестирование.

ps: По моему опыту wordpress в целом имеет довольно плохое качество кода. Я бы не стал использовать его в качестве метрики чего-либо...

.
3
ответ дан 8 December 2019 в 04:52
поделиться

Если синглеты и шарики такие плохие, Почему их так часто используют?

Я думаю, суть в том, что синглеты все упрощают. По крайней мере, с первого взгляда. У меня не хватает опыта в этом вопросе, чтобы сказать что-то более полезное, однако я нашел следующее хорошее прочтение:

Singleton Considered Stupid (Steve Yegge)

2
ответ дан 8 December 2019 в 04:52
поделиться
  1. Глобальные переменные и синглоны популярны, потому что они просты и удобны.
  2. Введение зависимостей, единственная разумно удобная замена глобальным вещам, до сих пор довольно неизвестна в PHP-сообществе.
  3. PHP-сообщество часто предпочитает простые взломы, а не правильные решения.
  4. Многие PHP-разработчики совершенно не разбираются в программировании и едва ли знают достаточно, чтобы заставить их программы работать.
2
ответ дан 8 December 2019 в 04:52
поделиться

В процессе уборки Одиночка будет представлять собой скрытие грязи в темном углу вместо уборки.

Это так широко используется, потому что это очень хорошо помогает скрыть проблемы.

Это хорошо для тех, кто должен убирать, но не хочет.

Это плохо для тех, кто действительно должен что-то убирать.

Рассмотрим впрыск зависимостей http://martinfowler.com/articles/injection.html если синглтон создает проблему, которую вы больше не можете скрывать.

1
ответ дан 8 December 2019 в 04:52
поделиться

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

Я полагаю, что они до сих пор используются так часто, потому что программисты ленивы . Мы не хотим тратить время на то, чтобы код был организован и красив , мы просто хотим выполнить свою работу . Гораздо проще просто написать глобальную функцию / переменную / что угодно, чем разбить ее на модули, и как только вы начнете идти по этому пути, становится слишком больно возвращаться и рефакторинг . Может быть, в этом причина: они начали так и просто больше не повернули.

4
ответ дан 8 December 2019 в 04:52
поделиться

Вероятно, это связано с книгой Design Patterns (Дизайн шаблонов) GoF. Она стала слишком распространенной, и люди относятся к ней как к непогрешимой.

3
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: