Соглашение об именах для классов утилиты в Java

При написании классов утилиты на Java, какие хорошие рекомендации следует соблюдать?

Должны ли пакеты быть "util" или "utils"? Это ClassUtil или ClassUtils? Когда класс "Помощник" или "Утилита"? Утилита или коммунальные услуги? Или вы используете их смесь?

Стандартная библиотека Java использует как Utils, так и Utilities:

  • javax.swing.Utilities
  • javax.print.attribute.AttributeSetUtilities
  • javax.swing.plaf.basic.BasicGraphicsUtils

Apache использует множество Util и Utils, хотя в основном Utils:

  • org.apache.commons.modeler.util.DomUtil
  • org.apache.commons.modeler.util.IntrospectionUtils
  • org.apache.commons.io.FileSystemUtils
  • org.apache.lucene.wordnet.AnalyzerUtil
  • org.apache.lucene.util.ArrayUtil
  • org.apache.lucene.xmlparser.DOMUtils

Spring использует много классов Helper и Utils:

  • org.springframework.web.util.UrlPathHelper
  • org.springframework.core.ReflectiveVisitorHelper
  • org.springframework.core.NestedExceptionUtils
  • org.springframework.util.NumberUtils

Итак, как вы называете свои классы утилит?

Ответ 1

Как и многие подобные соглашения, важно не столько то, что вы используете, сколько то, что вы используете его последовательно. Например, если у вас есть три класса утилиты, и вы называете их CustomerUtil, ProductUtils и StoreUtility, другие люди, пытающиеся использовать ваши классы, будут постоянно путаться и ошибочно набирать CustomerUtils, должны искать их, проклинать вас несколько раз, и т.д. (я услышал лекцию о согласованности, когда спикер поднял слайд, изображающий контур своей речи с тремя основными пунктами, обозначенными "1", "2-й" и "C".)

Никогда не создавайте два имени, которые отличаются только некоторой тонкостью написания, например, с CustomerUtil и CustomerUtility. Если есть веская причина сделать два класса, то в них должно быть что-то другое, и имя должно хотя бы дать нам понять, что это за разница. Если один содержит служебные функции, связанные с именем и адресом, а другой содержит служебные функции, связанные с заказами, то назовите их CustomerNameAndAddressUtil и CustomerOrderUtil или некоторые из них. Я регулярно схожу с ума, когда вижу бессмысленные тонкие различия в именах. Как и вчера, я работал над программой, в которой было три поля для фрахтовых расходов, называемых "фрахт", "фрахт" и "frght". Мне пришлось изучить код, чтобы выяснить, какая разница между ними.

Ответ 2

Для этого в стандарте Java нет стандартного правила/соглашения. Тем не менее, я предпочитаю добавлять "s" в конце названия класса, упомянутого в @colinD.

Это кажется довольно стандартным для того, что Мастер java API Designer Джош Блох делает (коллекция java, а также коллекция google)

Пока Helper и Util идут, я буду называть что-то помощником, когда у него есть API, которые помогают достичь определенной функциональности пакета (с учетом пакета для реализации модуля); означает, что Util может быть вызван в любом контексте.

Например, в приложении, относящемся к банковским счетам, все статические API-интерфейсы, специфичные для каждого номера, будут идти в org.mycompany.util.Numbers

Все "конкретные" бизнес-правила, поддерживающие "учетную запись", помогают API-интерфейсам перейти на

org.mycompany.account.AccountHelper

В конце концов, это вопрос обеспечения лучшей документации и более чистого кода.

Ответ 3

Мне нравится соглашение о просто добавлении "s" к имени типа, когда тип является интерфейсом или классом, который вы не контролируете. Примеры этого в JDK включают Collections и Executors. Это также соглашение, используемое в Коллекциях Google.

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

Ответ 4

Я думаю, что "utils" должно быть именем пакета. Имена классов должны указывать цель логики внутри нее. Добавление sufix -util (s) является избыточным.

Ответ 5

Я уверен, что слова "помощники" и "утилиты" используются взаимозаменяемо. В любом случае, судя по приведенным вами примерам, я бы сказал, что если ваше имя класса является аббревиатурой (или имеет аббревиатуры в нем, как "DomUtil" ), тогда позвоните в свой пакет "whatever.WhateverUtil" (или Utils, если в вашем пакете есть более одной утилиты). Иначе, если у него есть полное имя вместо аббревиатуры, тогда назовите его "whatever.WhateverUtilities".

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