Это был бы комментарий к упоминанию Грега Хьюгилла «Одиночки - патологические лжецы», но я пока не могу комментировать.
Эта статья убедительно доказывает, но его гнев неверно направлен. Как отметили несколько комментаторов в своем блоге, его проблема действительно глобальное состояние. Его исправление кода все еще может использовать синглтоны и все же получить точное увеличение ясности и тестируемости.
Перечитайте статью. Он не обеспокоен тем, что OfflineQueue нуждается в инициализированном экземпляре базы данных или что CreditCardProcessor нуждается в инициализированном OfflineQueue. Он обеспокоен тем, что эти зависимости не видны, что вызывает проблемы с ремонтопригодностью и тестируемостью.
Его проблема с секретным глобальным состоянием ( это заставляет меня звучать как теоретик заговора? ).
Тем не менее, он (imo) неверно истолковывает это секретное глобальное состояние как ошибку одиноких.
Это не значит, что я за синглтоны, где они не нужны - конечно, у них есть недостатки (в том числе очевидная возможность узкого места в потоке). Но я предпочитаю четко понимать, какие практики я избегаю.
Кстати, я бы пошел дальше в своем рефакторинге - основываясь на именах классов, я бы утверждал в обзоре кода, что CreditCardProcessor должен, ну, в общем, обрабатывать начисления, поэтому вместо его:
card.charge(cardProcessor, 100);
Вместо этого я бы получил:
cardProcessor.chargeCard (card, 100);
(и да, я заменил его имена переменных c
и ccp
именами, которые я считал более читабельными)