Давным-давно я прочитал статью (я полагаю, запись в блоге), которая направила меня на «правильный» путь по именованию объектов: будьте очень щепетильны при именовании вещей в вашей программе.
Например, если бы мое приложение (как типичное бизнес-приложение) обрабатывало пользователей, компании и адреса, у меня были бы User
, Company
и Address
доменные классы - и, вероятно, где-нибудь появятся UserManager
, CompanyManager
и AddressManager
, которые обрабатывают те вещи.
Так вы можете сказать, что делают эти UserManager
, CompanyManager
и AddressManager
? Нет, потому что менеджер - это очень общий термин, который подходит ко всему, что вы можете делать с объектами своей области.
В статье, которую я прочитал, рекомендуется использовать очень конкретные имена. Если бы это было приложение C ++, и задача UserManager
заключалась в выделении и освобождении пользователей из кучи, он не управлял бы пользователями, а охранял бы их рождение и смерть. Хм, может, мы могли бы назвать это UserShepherd
.
Или, может быть, работа UserManager
состоит в том, чтобы проверять данные каждого объекта User и криптографически подписывать их. Тогда у нас будет UserRecordsClerk
.
Теперь, когда эта идея запомнилась мне, я пытаюсь ее применить. И найти эту простую идею невероятно трудной.
Я могу описать, что делают классы, и (если я не скатываюсь к быстрому и грязному кодированию) классы, которые я пишу, делают в точности одну вещь. Чего мне не хватает, чтобы перейти от этого описания к именам, так это некоего каталога имен, словаря, который сопоставляет понятия с именами.
В конечном итоге я хотел бы иметь в уме что-то вроде каталога шаблонов (часто шаблоны проектирования легко предоставляют имена объектов, например, factory)
- Factory - Создает другие объекты (название взято из шаблона проектирования)
- Пастух - пастырь управляет временем жизни объектов, их созданием и отключением.
- Синхронизатор - копирует данные между двумя или более объектами (или иерархиями объектов).
Няня - помогает объектам достичь "пригодного для использования" состояния после создания - например, путем подключения к другим объектам.
и т. д. и т. д.
Итак, как вы справляетесь с этой проблемой? У вас есть фиксированный словарный запас, вы на ходу придумываете новые имена или считаете, что называть вещи не столь важными или неправильными?
P.S .: Еще меня интересуют ссылки на статьи и блоги, в которых обсуждается данная проблема. Для начала приведу исходную статью, которая заставила меня задуматься об этом: Именование классов Java без "Менеджера"
Обновление: сводка ответов
Вот небольшое резюме того, что я тем временем узнал из этого вопроса.
- Старайтесь не создавать новых метафор (няня)
- Посмотрите, что делают другие фреймворки
Дополнительные статьи / книги по этой теме:
- Какие имена вы обнаруживаете в начале / добавлении к уроки регулярно?
- Каков наилучший подход к именованию классов?
- Книга: Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения (твердый переплет)
- Книга: Шаблоны архитектуры корпоративных приложений (в твердом переплете)
- Книга: Шаблоны реализации (в мягкой обложке)
И текущий список префиксов / суффиксов имен, который я собрал (субъективно!) Из ответов:
- Координатор
- Строитель
- Писатель
- Читатель
- Обработчик
- Контейнер
- Протокол
- Цель
- Конвертер
- Контроллер
- Вид
- Фабрика
- Организация
- Ведро
И хороший совет в дорогу:
Не получайте именной паралич. Да, имена очень важны, но они недостаточно важны, чтобы тратить на это огромное количество времени. Если вы не можете придумать хорошее имя за 10 минут, продолжайте.
Processor
здесь, это неоднозначно и может быть чем угодно, что принимает входные данные и производит выходные. Также в аналогичном смысле следует избегатьSubSomething
. - person Esko   schedule 16.01.2010UserDataProcessor
,DateFormatter
,MonetaryConvertor
,UtilityHelper
,ApplicationLauncher
,ExceptionHandler
,URLEncoder
,InputValidator
,ObjectMapper
,PatternChecker
для класса 1 иProviderResponse
,UserIDNameCompositeKey
,ConnectionClient
,LocalizedMessage
для класса 2. - person WesternGun   schedule 03.06.2019XxxService
илиUtils
тоже хорошие имена для меня (классы, обрабатывающие данные, но с именем существительного). Условность важна; но самое главное, читабельность. - person WesternGun   schedule 03.06.2019User<Manag|Help|Controll|Process|Handl|>er
содержит процедуру с именемcreate
, извлеките ее в отдельный класс команд:CreateUser
. у вас меньше шансов скрыть не связанные проблемы вCreateUser
, чем вUserManager
. Ваши списки процедур и их сложность выходят из-под контроля - это запах того, что что-то можно извлечь в модели, которые не нуждаются в суффиксах, вам просто нужно их найти. мир без людей возможен. - person Ty Cobb   schedule 19.07.2021