Классы именования - как избежать вызова всего "Менеджера <WhatEver>"?

Давным-давно я прочитал статью (я считаю запись в блоге), которая поставила меня на "правильный" трек на именование объектов: будьте очень скрупулезны в том, что именовать вещи в вашей программе.

Например, если мое приложение (как обычное деловое приложение) обрабатывало пользователей, компании и адреса, у меня был бы класс User, Company и Address - и, вероятно, где-то a UserManager, a CompanyManager и AddressManager появятся, что обрабатывает эти вещи.

Итак, можете ли вы сказать, что делают те UserManager, CompanyManager и AddressManager? Нет, потому что Менеджер - очень общий термин, который подходит ко всему, что вы можете сделать с объектами домена.

В статье, которую я прочитал, рекомендуется использовать очень конкретные имена. Если это было приложение С++, а задание UserManager предназначалось для выделения и освобождения пользователей из кучи, оно не управляло бы пользователями, а защищало бы их рождение и смерть. Хм, может быть, мы могли бы назвать это UserShepherd.

Или, может быть, задание UserManager должно проверять данные каждого объекта пользователя и подписать данные криптографически. Тогда у нас будет UserRecordsClerk.

Теперь, когда эта идея застряла со мной, я пытаюсь применить ее. И найти эту простую идею удивительно сложно.

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

В конечном счете, я хотел бы иметь в виду что-то вроде каталога шаблонов (часто шаблоны проектирования легко предоставляют имена объектов, например factory)

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

  • и т.д.

Итак, как вы справляетесь с этой проблемой? У вас есть фиксированный словарный запас, вы изобретаете новые имена на лету или считаете, что имена не так важны или неправильны?

P.S.: Я также интересуюсь ссылками на статьи и блоги, которые обсуждают эту проблему. В начале, вот оригинальная статья, которая заставила меня задуматься над этим: Именование классов Java без "Менеджера"


Обновление: краткое изложение ответов

Вот небольшое резюме того, что я узнал из этого вопроса тем временем.

  • Старайтесь не создавать новые метафоры (няня)
  • Посмотрите, что другие фреймворки

Другие статьи/книги по этой теме:

И текущий список названий префиксов/суффиксов, которые я собрал (субъективно!) из ответов:

  • Координатор
  • Builder
  • Writer
  • Считыватель
  • Обработчик
  • Контейнер
  • Протокол
  • Цель
  • Преобразователь
  • контроллер
  • Вид
  • Factory
  • Entity
  • Ковш

И хороший совет для дороги:

Не вводите паралич имен. Да, имена очень важны, но они недостаточно важны, чтобы тратить огромное количество времени. Если вы не можете придумать хорошее имя за 10 минут, переходите.

818
08 дек. '09 в 15:55
источник поделиться
13 ответов

Я задал аналогичный вопрос, но там, где это возможно, я пытаюсь скопировать имена уже в .NET Framework, и я ищу идеи в рамках Java и Android.

Кажется, что Helper, Manager и Util - это неизбежные существительные, которые вы присоединяете для координирования классов, которые не содержат состояния и, как правило, процедурные и статические. Альтернативой является Coordinator.

Вы можете получить особенно фиолетовый проси с именами и пойти на такие вещи, как Minder, Overseer, Supervisor, Administrator и Master, но, как я уже сказал, я предпочитаю хранить его как имена фреймов вы используете.

Некоторые другие общие суффиксы (если это правильный термин), которые вы также найдете в платформе .NET:

  • Builder
  • Writer
  • Reader
  • Handler
  • Container
131
15 янв. '10 в 16:31
источник

Связанные вопросы


Похожие вопросы

Вы можете взглянуть на source-code-wordle.de, я проанализировал там наиболее часто используемые суффиксы имен классов платформы .NET и некоторых других библиотек.

Топ-20:

  • атрибут
  • типа
  • помощник
  • коллекция
  • Преобразователь
  • обработчиком
  • Информация
  • поставщик
  • исключение
  • услуги
  • Элемент
  • менеджер
  • node
  • опции
  • factory
  • Контекст
  • элемент
  • дизайнер
  • база
  • редактор
74
03 мая '12 в 0:44
источник

У меня все хорошие имена, и я часто пишу о важности заботы при выборе имен для вещей. По этой же причине я опасаюсь метафор, когда называет вещи. В исходном вопросе "factory" и "synchronizer" выглядят как хорошие имена для того, что они означают. Однако "пастух" и "няня" не являются, потому что они основаны на метафорах. Класс в вашем коде не может быть буквально няней; вы называете это няней, потому что она заботится о некоторых вещах, очень похожих на настоящую няню, которая заботится о детях или детях. Это нормально в неофициальной речи, но не в порядке (на мой взгляд) для обозначения классов в коде, который должен поддерживаться тем, кто знает, кто знает, когда.

Почему? Потому что метафоры зависят от культуры и часто зависят от личности. Для вас, назвав класс "нянькой", может быть очень ясным, но, возможно, это не так понятно кому-то другому. Мы не должны полагаться на это, если вы не пишете код, который предназначен только для личного использования.

В любом случае соглашение может сделать или сломать метафору. Использование "factory" само по себе основано на метафоре, но в течение довольно долгого времени и в настоящее время довольно хорошо известно в мире программирования, поэтому я бы сказал, что он безопасен в использовании. Однако "няня" и "пастух" неприемлемы.

40
08 дек. '09 в 19:43
источник

Мы могли бы обойтись без классов xxxFactory, xxxManager или xxxRepository, если бы мы правильно смоделировали реальный мир:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

; -)

35
15 янв. '10 в 16:51
источник

Это звучит как скользкий склон к тому, что было бы размещено на thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages" и т.д.

Я полагаю, что один монолитный класс Менеджера не очень хороший дизайн, но использование "Менеджера" неплохое. Вместо UserManager мы можем разбить его на UserAccountManager, UserProfileManager, UserSecurityManager и т.д.

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

28
08 дек. '09 в 16:26
источник

Поскольку вас интересуют статьи в этой области, вам может быть интересна статья Стивена Егге "Выполнение в Королевстве существительных":

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

19
15 янв. '10 в 17:44
источник

Когда я думаю об использовании Manager или Helper в имени класса, я считаю его запахом кода, что означает, что я еще не нашел правильную абстракцию и/или нарушаю принцип единой ответственности, поэтому рефакторинг и привлечение большего внимания к дизайну часто упрощают именование.

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

Классы бизнес-моделей могут быть трудными, потому что они разные для каждого домена. Есть несколько терминов, которые я использую много, например Policy для классов стратегии внутри домена (например, LateRentalPolicy), но они обычно вытекают из попытки создать "вездесущий язык", который вы можете поделиться с бизнес-пользователями, проектировать и именовать классы, чтобы они моделировали реальные идеи, объекты, действия и события в реальном мире.

Классы технической инфраструктуры немного проще, потому что они описывают домены, которые мы знаем очень хорошо. Я предпочитаю включать имена шаблонов дизайна в имена классов, например InsertUserCommand, CustomerRepository, или SapAdapter.. Я понимаю озабоченность по поводу передачи реализации вместо намерения, но шаблоны дизайна выходят за эти два аспекта дизайна классов - по крайней мере, работа с инфраструктурой, где вы хотите, чтобы дизайн реализации был прозрачным, даже когда вы скрываете детали.

11
15 янв. '10 в 17:22
источник

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

8
08 дек. '09 в 15:59
источник

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

6
03 мая '12 в 23:51
источник

Специфично для С#, я нашел "Руководство по дизайну рамок: условные обозначения, идиомы и шаблоны для многоразовых библиотек .NET" , чтобы иметь много хорошая информация о логике именования.

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

4
08 дек. '09 в 16:13
источник

Я думаю, что самое важное, о чем нужно помнить, - это достаточно описательное имя? Можете ли вы рассказать, глядя на имя, которое должен выполнять класс? Использование таких слов, как "Менеджер", "Сервис" или "Обработчик" в именах классов, может считаться слишком общим, но поскольку многие программисты используют их, он также помогает понять, для чего предназначен класс.

Я сам много использовал фасад-образ (по крайней мере, я думаю, что он называется). Я мог бы иметь класс User, который описывает только одного пользователя, и класс Users, который отслеживает мою "коллекцию пользователей". Я не называю класс a UserManager, потому что мне не нравятся менеджеры в реальной жизни, и я не хочу напоминать им:) Просто использование формы множественного числа помогает мне понять, что делает класс.

3
08 дек. '09 в 16:18
источник

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

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

1
08 дек. '09 в 16:02
источник

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

Например, UserRecordsClerk может быть лучше объяснен как расширение общего интерфейса RecordsClerk, который реализуется как UserRecordsClerk, так и CompanyRecordsClerk, а затем специализируется на нем, то есть можно посмотреть на методы в интерфейсе, чтобы увидеть, что делают его подклассы в целом.

См. книгу, например Design Patterns для информации, это отличная книга и может помочь вам разобраться, где вы собираетесь быть с вашим кодом - если вы еще не используете его!; o)

Я считаю, что если ваш шаблон хорошо выбран и используется насколько это уместно, тогда достаточно достаточно непроницательных простых имен классов!

1
08 дек. '09 в 16:12
источник

Посмотрите другие вопросы по меткам или Задайте вопрос