Лучшая практика для класса коммунальных услуг? - PullRequest
5 голосов
/ 30 марта 2010

В настоящее время у нас есть класс утилит, который обрабатывает много форматирования строк, отображение даты и аналогичные функции, и это общий / статический класс.

Является ли это «правильным» способом ведения дел или мы должны создавать экземпляр класса утилит, как и когда нам это нужно?

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

PS. Мы используем .NET 2.0

Ответы [ 6 ]

4 голосов
/ 30 марта 2010

Является ли это «правильным» способом ведения дел или мы должны создавать экземпляр класса утилит, как и когда нам это нужно?

С точки зрения OOD это зависит: -)

Для чистых функций вы должны использовать статические методы в Java / C #. В C # вы также можете попытаться использовать методы расширения, как описывают другие.

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

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

Однако в практике Java «аргумент насмешливости» обычно имеет предшествующее значение, поскольку он не позволяет имитировать статические методы.

3 голосов
/ 30 марта 2010

Если в классе вообще есть какое-либо состояние, то лучше всего сделать из него объекты. Синглтоны - это боль в отношении объектных зависимостей и безопасности потоков.

Если в классе нет состояния, выбор того, будет ли он статическим или нет, не окажет заметного влияния на объем памяти.

3 голосов
/ 30 марта 2010

Если вы используете .NET, изучали ли вы методы расширения? Я обнаружил, что при правильном использовании мне вообще может не понадобиться служебный класс.

0 голосов
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

Если ваш язык поддерживает это, сделайте эти функции частью пакета / пространства имен / модуля вместо класса.

Если нет, статические методы класса в порядке. Вы должны пометить класс как окончательный / закрытый / не виртуальный / не расширяемый, если ваш язык поддерживает его.

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

0 голосов
/ 30 марта 2010

Это в .NET? Если так, возможно, лучше предоставить методы расширения. Например. если у вас есть служебный метод, который форматирует строку, измените ее сигнатуру с

public static string SpecialFormat(string text)

до

public static string SpecialFormat(this string text)

Таким образом, метод SpecialFormat будет гораздо более обнаружим, поскольку он будет отображаться как метод для строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...