2009-08-13 2 views
17

Есть ли у вас какие-либо сведения о том, как организовать и назвать классы полезности?Согласование и структура именования для классов и методов полезности

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

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

Примеры:

ParseCommaSeparatedIntegersFromString(string) 
CreateCommaSeparatedStringFromIntegers(int[]) 
CleanHtmlTags(string) 
GetListOfIdsFromCollectionOfX(CollectionX) 
CompressByteData(byte[]) 

Обычно именования сказать вам, чтобы назвать свой класс в качестве существительного. Я часто получаю много классов, таких как HtmlHelper, CompressHelper, но они не очень информативны. Я также попытался быть действительно конкретным, как HtmlTagCleaner, который обычно заканчивается одним классом для каждого метода утилиты.

Есть ли у вас идеи о том, как назвать и сгруппировать эти вспомогательные методы?

ответ

12

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

  1. Один класс (так называемый Helper), с несколькими методами
  2. Один пакет (так называемый помощник), с несколько классов (называемых XXXHelper), каждый класс имеет несколько методов. Альтернативно, классы могут быть разделены в нескольких несерверных пакетах, если они подходят.
  3. Один проект (называемый помощником) с несколькими пакетами (называемый XXX), каждый пакет с ... В качестве альтернативы пакеты можно разделить на несколько несерверных пакетов, если они подходят.
  4. Несколько вспомогательных проектов (разделение по уровням, используемой библиотекой или иным образом) ...

На каждом уровне группировки (пакет, класс):

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

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

  • единицы груза: некоторые ожидаемые результаты или продукты будут иметь банку, те, которые не нуждаются в ней не будет),
  • выразить зависимости: например, бизнес-проект не зависит от помощников веб-уровня; выразив, что в зависимостях проектов мы улучшили кажущуюся сложность, хорошо для нас; или найти такую ​​зависимость, мы знаем, что что-то не так, и начинаем исследовать ...; Кроме того, за счет уменьшения зависимости, мы можем ускорить компиляцию и строительство ....
  • классифицировать код, чтобы найти его быстрее: только тогда, когда это огромный, я говорю о тысячах классов в проекте

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


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

Статические методы (кроме тех, которые используют статические члены класса) работают без контекста, все данные должны передаваться как параметры. Мы все знаем, что в коде OO это не самый предпочтительный способ. Теоретически мы должны искать объект, наиболее соответствующий методу, и перемещать этот метод на этот объект. Помните, что обмен кодами не обязательно должен быть статическим, он должен быть общедоступным (или иным образом видимым).

Примеры того, где, чтобы переместить статический метод:

  1. Если имеется только один параметр, к этому параметру.
  2. Если есть несколько параметров, выбор между перемещением метод на:
    • параметра, который используется больше всего: один с несколькими полями или методами, используемыми, или используемые условными (в идеале, некоторые conditionnals будут удалены subclasses overriding) ...
    • один существующий объект, который уже имеет хороший доступ к некоторым параметрам.
    • построить новый класс для этой потребности

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

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

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

7

Helper суффикс хорошее соглашение, так как он используется на многих языках (по крайней мере, в Java, используются рельсы IIRC).

Целью вашего помощника должно быть trasported по методу name, используйте класс только как заполнитель. Например ParseCommaSeparatedIntegersFromString плохое название для нескольких причин:

  • слишком долго, на самом деле
  • он является излишним, в статически типизированных языках вы можете удалить FromString суффикс, так как он выводится из подписи

Что вы думаете о:

CSVHelper.parse(String) 
CSVHelper.create(int[]) 
HTMLHelper.clean(String) 
... 
+7

Лично я переименовываю CSVHelper в CommaSeparatedValues. Его длиннее, но помощник просто приспосабливает его 6 символов, которые ничего не добавляют, в то время как CommaSe ... все имеет смысл. IDE auto завершен, поэтому кому это нужно, если он немного длинный. –

Смежные вопросы