Мне нравились служебные классы, заполненные статическими методами. Они сделали большую консолидацию вспомогательных методов, которые в противном случае лежали бы вокруг, создавая избыточность и поддерживая ад. Они очень просты в использовании, не создаются, не уничтожаются, просто не срабатывают. Я предполагаю, что это была моя первая нечаянная попытка создания сервис-ориентированной архитектуры - множество служб без гражданства, которые только что сделали свою работу, и ничего больше. Однако, когда система растет, драконы будут приближаться.
полиморфизм
Скажем, у нас есть метод UtilityClass.SomeMethod, который счастливо гудит вместе. Внезапно нам нужно немного изменить функциональность. Большая часть функциональности одна и та же, но мы должны изменить пару частей, тем не менее. Если бы это не был статический метод, мы могли бы сделать класс деривации и изменить содержание метода по мере необходимости. Поскольку это статический метод, мы не можем. Конечно, если нам просто нужно добавить функциональность до или после старого метода, мы можем создать новый класс и называть его старым, но это просто грубо.
Интерфейс беды
Статические методы не могут быть определены через интерфейсы для логических причин. И поскольку мы не можем переопределять статические методы, статические классы бесполезны, когда нам нужно передать их своим интерфейсом. Это позволяет нам не использовать статические классы как часть шаблона стратегии. Мы можем исправить некоторые проблемы до passing delegates instead of interfaces.
Тестирование
В основном это идет рука об руку с интерфейсом беды, упомянутых выше. Поскольку наша способность взаимозаменяемых реализаций очень ограничена, у нас также возникнет проблема с заменой производственного кода на тестовый код. Опять же, мы можем их обернуть, но это потребует от нас изменить большую часть нашего кода, чтобы иметь возможность принимать обертки вместо реальных объектов.
Фостерс BLOBS
Как статические методы обычно используются в качестве вспомогательных методов и полезных методов, как правило, будет иметь различные цели, мы быстро закончить с большим классом, заполненным с некогерентной функциональностью - в идеале, каждый класс должны иметь единую цель в системе. Я бы предпочел в пять раз больше классов, пока их цели четко определены.
параметров ползучести
Начнем с того, что мало милые и невинные статический метод может принимать один параметр. По мере роста функциональности добавляется пара новых параметров. Вскоре добавляются дополнительные параметры, которые являются необязательными, поэтому мы создаем перегрузки метода (или просто добавляем значения по умолчанию на языках, которые их поддерживают). Вскоре у нас есть метод, который принимает 10 параметров. Только первые три действительно необходимы, параметры 4-7 являются необязательными. Но если параметр 6 указан, необходимо заполнить 7-9 ... Если бы мы создали класс с единственной целью сделать то, что сделал этот статический метод, мы могли бы решить это, взяв требуемые параметры в конструктор и позволяет пользователю устанавливать необязательные значения через свойства или методы для одновременного задания нескольких взаимозависимых значений. Кроме того, если метод вырос до такого уровня сложности, он, скорее всего, должен быть в своем собственном классе.
Требуя потребителей, чтобы создать экземпляр класса без причины
Одним из наиболее распространенных аргументов, почему спрос, что потребители нашего класса создать экземпляр для вызова этого один метод, при этом не имея использовать для экземпляра после этого? Создание экземпляра класса - очень дешевая операция на большинстве языков, поэтому скорость не является проблемой. Добавление лишней строки кода для потребителя - это низкая стоимость заложить основу для гораздо более удобного решения в будущем. И, наконец, если вы хотите избежать создания экземпляров, просто создайте одноэлементную оболочку своего класса, которая позволяет легко повторное использование, хотя это и делает требование о том, чтобы ваш класс не имел гражданства. Если он не является апатридом, вы все равно можете создавать статические методы-обертки, которые обрабатывают все, сохраняя при этом все преимущества в долгосрочной перспективе. Наконец, вы также можете создать класс, который скрывает экземпляр, как если бы он был singleton: MyWrapper.Экземпляр - свойство, которое просто возвращает новый MyClass();
Только дело ситхов в абсолюте
Конечно, есть исключения из моей нелюбви статических методов. Истинные классы полезности, которые не представляют опасности для вздутия, являются отличными случаями для статических методов - например, System.Convert. Если ваш проект является одноразовым, без требований к будущему обслуживанию, общая архитектура действительно не очень важна - статическая или не статическая, на самом деле не имеет значения - скорость разработки, однако.
Стандарты, стандарты, стандарты!
Использование методов экземпляра не мешает вам использовать статические методы и наоборот. Пока есть основания для дифференциации и стандартизированы. Нет ничего хуже, чем просматривать бизнес-уровень, разрастающийся различными способами реализации.
-1 «Классы, которые существуют только для их методов, должны оставаться статическими». – Rookian 2011-08-13 16:00:06
@Rookian, почему вы не согласны с этим? – jjnguy 2011-08-14 15:27:04
примером будет шаблон репозитория. Класс содержит только методы. После вашего подхода не разрешается использовать интерфейсы. => увеличить связь – Rookian 2011-08-14 16:23:14