Именование классов - как не называть все «менеджером» ‹WhatEver›?

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

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

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

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

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

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

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

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

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

  • и т. д. и т. д.

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

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


Обновление: сводка ответов

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

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

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

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

  • Координатор
  • Строитель
  • Писатель
  • Читатель
  • Обработчик
  • Контейнер
  • Протокол
  • Цель
  • Конвертер
  • Контроллер
  • Вид
  • Фабрика
  • Организация
  • Ведро

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

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


person Community    schedule 08.12.2009    source источник
comment
Он принадлежит вики сообщества, потому что нет лучшего ответа. Это обсуждение.   -  person DOK    schedule 08.12.2009
comment
Это противоречит интуиции. Разве они не должны называть это форумом? Я бы подумал, что вики-сайт будет для сбора фактов, а не мнений.   -  person AaronLS    schedule 08.12.2009
comment
Если вам нужен объект «Няня», это означает, что его можно нарушить инварианты классов - лучше переделайте свой класс imho   -  person jk.    schedule 08.12.2009
comment
Я согласен с предложением CW. Это хороший вопрос, но на самом деле нет однозначного правильного ответа. Как заметил Lazarus ниже, соглашения об именах могут (и должны) быть изменены в соответствии с конкретным доменом приложения и / или компанией.   -  person Richard J Foster    schedule 08.12.2009
comment
см. эти темы: stackoverflow.com/questions/1274577/class-naming-chaos stackoverflow.com/questions/38019/   -  person Peter    schedule 08.12.2009
comment
@DOK: Я не думаю, что CW означает, что нет одного «лучшего» ответа. Если бы это было так, то ответы вообще не получали бы баллов, и было бы невозможно принять один как лучший ответ. Но да ладно, здесь не место этой дискуссии ...   -  person Frank    schedule 15.01.2010
comment
Спасибо, что держите это в курсе, но, тьфу, последний совет - ужасный совет! Если вы не можете придумать хорошее имя за 10 минут, вероятно, что-то не так с вашим классом. (Со стандартными оговорками: 1) идеальное - враг хорошего, 2) доставка - это особенность - просто помните, что вы несете технический долг.   -  person Jeff Sternal    schedule 15.01.2010
comment
Можно ли перечислять имена префиксов / суффиксов, которых следует избегать? Я думаю о Processor здесь, это неоднозначно и может быть чем угодно, что принимает входные данные и производит выходные. Также в аналогичном смысле следует избегать SubSomething.   -  person Esko    schedule 16.01.2010
comment
@ anton1980 См. первый комментарий, это вот почему это неконструктивно. Я не буду открывать его повторно, но не стесняйтесь поднимать его на Meta Stack Overflow, если вам нужен вид сообщества.   -  person casperOne    schedule 12.02.2013
comment
Если вы не можете придумать хорошее имя за 10 минут, обратитесь за помощью к коллеге. Не сдавайся.   -  person    schedule 16.01.2014
comment
С опозданием на несколько лет, но я начал использовать суффикс Clerk. Наверное, так же плохо, как и менеджер, но клерки IRL могут выполнять функции только в соответствии со строгим набором бизнес-правил. Клерк указывает потребителю, что у этого типа объекта доступны только такие функции. Если вы не можете найти то, что вам нужно, необходимо расширить клерка или создать нового клерка для выполнения необходимой вам работы.   -  person WhiskerBiscuit    schedule 19.07.2014
comment
@JamesM., Я просто подумал о том же. В этом случае закрытие является окончательным голосом за, и, хотя оно не соответствует формату вопросов и ответов, действительно следует сделать поправку на что-то вроде Не строго Вопросы и ответы, но очень четкие и полезные, поэтому разрешены.   -  person    schedule 28.03.2015
comment
@JamesM. Хотя такая информация полезна, не будет ли Programmers.SE более подходящей?   -  person All Workers Are Essential    schedule 12.05.2015
comment
хороший список. еще пара, которую я использовал в прошлом: Драйвер, Арбитр, Декларация, Экземпляр.   -  person Dominic Birmingham    schedule 10.02.2016
comment
Если вы не можете придумать хорошее имя за 10 минут, попробуйте объяснить его своим коллегам; они могут придумать хорошее имя (user338195), но попытка объяснить его, вероятно, поможет вам понять, что с ним не так (Джефф).   -  person WillC    schedule 12.02.2016
comment
Я использую SomeEngine для замены Manager.   -  person Please_Dont_Bully_Me_SO_Lords    schedule 02.05.2017
comment
Если вы не можете придумать хорошее имя за 10 минут, проблема не в том, что у вас не будет хорошего имени. Проблема в том, что у вас, скорее всего, будет плохой дизайн. Другими словами, неспособность найти четкое название - это не проблема сама по себе, а показатель конструктивных недостатков, которые лежат глубже.   -  person Konrad Morawski    schedule 22.01.2018
comment
Вы бы назвали их классами менеджеров, когда они ничего не делают;) [каламбур] - я видел ту же схему в случае * Util * Helper - когда сомневаешься, люди назовут его помощником и будут жить долго и счастливо. Трудно придумать правильные имена, и большинство разработчиков не придавали бы им большого значения, поэтому они просто выбирают самый простой путь. Это общие проблемы, на которые я пытаюсь указать во время проверки кода.   -  person software.wikipedia    schedule 25.04.2018
comment
Добавьте в список Parser & Formatter, если хотите   -  person nitsas    schedule 20.09.2018
comment
Мне нравится идея конкретного наименования, но мне не нравится подход к использованию названий человеческих профессий, поскольку это отвлекает от темы.   -  person Nicolas    schedule 29.10.2018
comment
Любой желающий может прочитать Выполнение в царстве существительных   -  person sampathsris    schedule 31.01.2019
comment
Я думаю, что имена классов можно условно разделить на две группы: 1, классы, обрабатывающие данные; 2, классифицируется как результат некоторого процесса / преобразования. Я бы добавил к именам первого класса глагол, а второй класс - существительным. Например, UserDataProcessor, DateFormatter, MonetaryConvertor, UtilityHelper, ApplicationLauncher, ExceptionHandler, URLEncoder, InputValidator, ObjectMapper, PatternChecker для класса 1 и ProviderResponse, UserIDNameCompositeKey, ConnectionClient, LocalizedMessage для класса 2.   -  person WesternGun    schedule 03.06.2019
comment
Но я также думаю, что это очень субъективно, например, XxxService или Utils тоже хорошие имена для меня (классы, обрабатывающие данные, но с именем существительного). Условность важна; но самое главное, читабельность.   -  person WesternGun    schedule 03.06.2019
comment
Класс для пользователя, затем класс для создания пользователя, затем еще один класс для управления распределением памяти пользователя - идя по этому пути, вы обнаружите, что имеете базу кода, содержащую в 3 раза больше классов, которые вам действительно нужны для выполнения работы. готово, где все разделено на свой собственный маленький класс, который делает только одно, потому что Боб - ваш дядя. Я имею в виду, SOLID хорош, но, чувак, не переборщи!   -  person Zohar Peled    schedule 20.06.2019
comment
Парень прав, если вы не можете придумать имя за 10 минут (я бы сделал это за 1 минуту), двигайтесь дальше. Поскольку вы используете TDD (да, не так ли?), Вы собираетесь ре-факторизовать код по ходу работы, и либо дизайн будет развиваться, и имя станет понятным после рефакторинга, либо вы подойдете с именем, как вы работаете.   -  person Richard Moore    schedule 26.09.2019
comment
все это названия процедурного кода, претендующего на объектно-ориентированный подход. Будьте честны с вашими процедурами: если ваша User<Manag|Help|Controll|Process|Handl|>er содержит процедуру с именем create, извлеките ее в отдельный класс команд: CreateUser. у вас меньше шансов скрыть не связанные проблемы в CreateUser, чем в UserManager. Ваши списки процедур и их сложность выходят из-под контроля - это запах того, что что-то можно извлечь в модели, которые не нуждаются в суффиксах, вам просто нужно их найти. мир без людей возможен.   -  person Ty Cobb    schedule 19.07.2021


Ответы (12)


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

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

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


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

  • Builder
  • Writer
  • Reader
  • Handler
  • Container
person Community    schedule 15.01.2010
comment
Они мне очень нравятся. Они не попадают в ловушку плохих или неизвестных метафор, потому что они уже используются .NET Framework. Было бы интересно взглянуть на другие библиотеки (Java), чтобы получить больше информации о том, что обычно используется. - person froh42; 15.01.2010
comment
Хочу предложить Conductor, как дирижера музыкального оркестра. Это, безусловно, важная роль, в зависимости от характера сотрудничества, которое вам нужно проводить (другие объекты являются очень специализированными субъектами, которые должны реагировать на централизованные команды и не слишком беспокоиться о каждом другом сотруднике). - person heltonbiker; 07.12.2015
comment
Я не верю, что решение для классов -er состоит в том, чтобы придумать другое имя. Как я читал во многих других сообщениях и пытаюсь узнать ответ, вам нужно изменить архитектуру, а не только используемое имя. - person Michael Ozeryansky; 03.11.2019
comment
Очень легко переосмыслить названия для использования, это антипаттерн. - person John Stock; 25.11.2020

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

В топ-20 входят:

  • атрибут
  • тип
  • помощник
  • коллекция
  • конвертер
  • обработчик
  • Информация
  • провайдер
  • исключение
  • услуга
  • элемент
  • управляющий делами
  • узел
  • вариант
  • фабрика
  • контекст
  • пункт
  • дизайнер
  • база
  • редактор
person Community    schedule 02.05.2012
comment
Давным-давно в одной компании я знал одного инженера, которого так надоело абсурдное и растущее множество суффиксных правил, преследующих компанию, что он демонстративно заканчивал каждый урок с Thingy. - person ; 28.03.2015
comment
Этот список имен сам по себе не так полезен без контекста, к которому следует применять суффикс. - person Fred; 16.08.2018

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

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

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

person Community    schedule 08.12.2009
comment
Этот аргумент действительно рушится, поскольку очевидно, что сама Factory является метафорой. Часто метафоры действительно проясняют, в чем может быть хорош объект, тогда как расплывчатость или обобщенность автоматически гарантирует, что единственный способ выяснить, что делает код, - это прочитать его полностью! Худший сценарий. - person Kzqai; 04.04.2017
comment
+1 за отказ от "милых" имен. Я думаю, что это здорово - говорить с языком настолько прямо, насколько это возможно. (Конечно, не всегда легко быть прямым, лаконичным, точным и одновременно…) - person andrewf; 23.07.2018
comment
Изобретательный выбор глагола + er обычно будет более ясным для конкретных классов, чем красочная аналогия. С другой стороны, новые абстракции - вещи, представляющие собой новую концепцию, новый вид вещей, а не просто новые вещи - часто хорошо работают как метафоры (компоненты Java, линзы Haskell, окна GUI, обещания многих языков). Однако в большинстве кодовых баз не будет таких настоящих изобретений. - person Malnormalulo; 03.05.2019
comment
Метафоры могут быть полезны, когда выбранное слово часто используется или используется как имя для центральной сущности в вашем приложении. Однажды мы использовали ДНК в качестве суффикса для класса сущностей, которые как однозначно идентифицируют что-то, так и несут некоторые дополнительные метаданные. Единственная причина, по которой это имя сработало, заключается в том, что ничто другое не называется ДНК, поэтому каждый всегда сразу знал, для чего предназначена эта сущность. Универсальный суффикс, такой как ID, никогда не сможет этого сделать, поскольку ID используется во многих других вещах. Конечно, новые разработчики не сразу понимали этот термин и то, что он должен означать. - person enzi; 08.01.2021

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

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

;-)

person Community    schedule 15.01.2010
comment
Как бы вы попали в параллельные вселенные и альтернативные измерения? - person tster; 15.01.2010
comment
Это просто: Omniverse.Instance.Dimensions [Ours] .Universes [Ours] .Galaxies ... ... хорошо, хорошо, я признаю, что это потребует перекомпиляции. ;-) - person herzmeister; 15.01.2010
comment
Обновление: это было добавлено в .NET 4.0: Universe.Instance.ToParallel();) - person Connell; 04.07.2013
comment
Но нарушает закон Деметры! - person Jonas G. Drange; 14.02.2017
comment
Это объекты и члены, а не имена классов - person Harry Berry; 11.04.2017
comment
Я усмехнулся, но не могу не ворчать. Во-первых, @HarryBerry на высоте. Во-вторых, правильно смоделировал реальный мир и .WorkingFor["Initech, USA"] действительно не играет вместе. /*...*/.WorkingFor(Universe./*...*/.Planets["Earth"].Continents["North America"].Countries["USA"].Companies["Initech"])./*...*/ по крайней мере будет последовательным. И почему выбор типа контейнера для именованных сущностей? А почему выбор ключа? Что, если я позвоню .CreateNew("John Doe"); во второй раз? Выкинуть исключение? В чем же тогда ключ? "John Doe 2"? Пробелы в ключах? - person Johannes Pille; 04.05.2019
comment
В дополнение к Гарри Берри: каким будет имя класса, который создает User (к какому классу принадлежит CreateNew). Ваш ответ вообще не касается этого, делая ваше утверждение Мы могли бы обойтись без каких-либо классов xxxFactory, xxxManager или xxxRepository, если бы мы смоделировали реальный мир правильно: недостаточно. Вы предполагаете, что весь наш код касается чистых данных, что часто не так. Речь также идет о различных стратегиях обработки этих данных, которые мы называем бизнес-уровнем. - person HimBromBeere; 01.07.2019
comment
Тем не менее, нарушает закон Деметры! Также я тогда не учел чеки на null, возможно, для краткости. ;) ———— Это объекты и члены, а не имена классов: Planets - это коллекция / список объектов типа Planet, я бы подумал, что это говорит само за себя. ;) ——— А почему выбор ключа ?: Это было просто для иллюстрации, тоже может быть Guid. - person herzmeister; 31.08.2019
comment
Каким будет имя класса, который создает User: Да, действительно хороший момент, похоже, тогда я имел в виду метод расширения, но это определенно выглядит не очень чисто. Думаю, тогда LINQ был совершенно новым и блестящим, и я переоценил магию, которую он мог творить. Итак, следуя предложению Йоханнеса, я сейчас просто выполняю ..._ 2_. И, конечно же, у вас есть одна из тех волшебных фреймворков ORM, которые отслеживают такие изменения. - person herzmeister; 31.08.2019
comment
Проблема: в случае universe...user.store(universe...database) пользовательский объект должен знать, как хранить себя во всех типах хранилищ данных. В случае universe...database.store(universe...user) объект базы данных должен знать, как хранить каждый вид объекта. Поэтому всегда нужно что-то вроде менеджеров. - person Toxiro; 02.02.2020

Звучит как скользкая дорожка к тому, что будет размещено на thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages" и т. Д.

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

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

person Mr. Boy    schedule 08.12.2009
comment
А как насчет UserAccounter, UserProfiler и UserSecurer? Если вы избавитесь от Manager, вам придется дать конкретное определение, что, на мой взгляд, хорошо. - person Didier A.; 23.09.2013
comment
А как насчет UserAccount, UserProfile, UserSecurity oO? - person clime; 07.12.2013
comment
Я бы назвал это MortageOwnersManager - person volter9; 03.12.2014
comment
Иногда у домена есть определенные имена. Как MortageHolder, который может быть лучше, чем MortageOwner - person borjab; 13.10.2016
comment
Менеджер совсем неплох, он десятилетиями отлично работал в программной инженерии. - person John Stock; 25.11.2020
comment
Менеджер отлично подходит для многих случаев, но в более сложных ситуациях его не хватает. Что делать, если для определенного лица существует 3 типа менеджеров? (и единый монолитный менеджер не работает). Вот когда общие имена, такие как Manager, Utility, Handler или Helper, терпят неудачу, потому что никто не знает, находится ли метод X в MortgageManager или MortgageHandler, или он просто может быть в MortgageHelper. - person enzi; 08.01.2021

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

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

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

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

person Community    schedule 15.01.2010
comment
Мне очень нравится идея использовать суффикс Policy для классов, содержащих бизнес-логику. - person jtate; 21.06.2017
comment
+1 за упоминание запаха кода, связанного с такими именами, как Manager и Helper. Я считаю, что если у меня нет четких названий для вещей, это обычно происходит, по крайней мере, частично из-за некоторой нечеткости в моем понимании предметной области, будь то коммерческое или техническое. Почти равносильно это может означать, что я просто реактивно разбиваю классы, потому что они стали слишком большими, что для меня также является признаком неадекватного моделирования. Это должен быть самый популярный ответ. - person nclark; 28.12.2019
comment
да, это ответ. Лично я борюсь с суффиксами шаблонов и соглашениями об именах, в основном предпочитаю соглашения об именах (в любом случае прямо сейчас). InsertUser - это глагол, вы знаете, что это будет команда. Customers во множественном числе, это хранилище (собрание) сущностей. Я обычно придерживаюсь CustomerRepo, на который локально ссылаются как customers, что является большей частью этого предпочтения. в остальном названия типов слишком похожи визуально. - person Ty Cobb; 19.07.2021

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

person Brian Agnew    schedule 08.12.2009
comment
Для меня Fowler - хороший справочник, но GOF - отличная рекомендация. - person Lazarus; 08.12.2009
comment
Простите мое незнание. Какую книгу Фаулера вы имеете в виду? - person Brian Agnew; 08.12.2009
comment
comment
Мое плохое, хотел вставить ссылку! Дох! - person Lazarus; 08.12.2009
comment
Хм, иногда это работает (например, Factory или Strategy), но в других случаях я чувствую, что это действительно передает способ реализации (я использовал шаблон!) Больше, чем намерение и задание класса. Например, самое важное для синглтона - это то, что он представляет, а не то, что это синглтон. Столь строгое именование используемых шаблонов похоже на строгое именование используемых типов. Например, венгерская нотация, неправильно примененная группой Windows Systems (описывающая тип данных C вместо типа намерения) - person froh42; 08.12.2009
comment
@ froh42 - это хороший аргумент. разоблачая реализацию. Определенно необходимо соблюдать некоторую осторожность. - person Brian Agnew; 08.12.2009
comment
Для классов технической инфраструктуры обычно желательно сделать реализацию прозрачной - и большинство канонических имен шаблонов проектирования сообщают как о реализации, так и о намерениях. Другое дело - классы модели предметной области. - person Jeff Sternal; 15.01.2010

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

person Community    schedule 03.05.2012

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

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

person Droozle    schedule 08.12.2009
comment
Мне также очень нравится этот подход, потому что он упрощает идею управления объектами сверху вниз. Группа пользователей с большей вероятностью будет подразумевать, что работа выполняется между пользователями, а не из UserManager вниз. Кроме того, наличие у Пользователя ссылки на Пользователи не так странно, как владение UserManager. Он более открыт для относительного мышления, чем для строго ООП. - person Seph Reed; 19.02.2019
comment
Проблема с этим подходом заключается в том, что становится очень сложно искать в вашем коде Users, особенно если вы передаете объект менеджера. this.users = new Users() Но тогда в любом другом месте вашего кода users будет ссылаться на массив User. - person Snowman; 20.02.2020
comment
Как вы говорите, «Пользователи» действительно подразумевают набор пользователей - набор сущностей с отслеживанием состояния. Но SRP будет означать, что вы не захотите связывать управление пользователями (функциональность и бизнес-логику) с пользовательскими данными (состоянием). Не говорю, что вы ошибаетесь, просто UserManager подходит, если класс отвечает за управление пользователями, а не только за хранение их состояния и базового CRUD. - person Richard Moore; 15.05.2020

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

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

person AaronLS    schedule 08.12.2009

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

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

person Lazarus    schedule 08.12.2009
comment
Тем не менее, последовательное, хотя и немного неинтуитивное соглашение лучше, чем просто начинать собственное соглашение. Люди, работающие над проектом, очень быстро усвоят любое согласованное соглашение и вскоре забудут, что функциональность не совсем та, которую можно было бы ожидать на первый взгляд. - person Mr. Boy; 08.12.2009
comment
@ Джон, это именно то, что я сказал. Соглашение должно быть принято группой, и если вы работаете в компании, посмотрите, существует ли соглашение компании. Под компанией я имею в виду любую группу, будь то проектная группа с открытым исходным кодом или разрозненный набор программистов. Если бы каждый просто взял то, что было доступно, что почти соответствовало их требованиям, тогда, я думаю, нам бы сильно не хватало инноваций. - person Lazarus; 08.01.2010

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

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

См. Такую книгу, как Шаблоны дизайна для info, это отличная книга, которая может помочь вам понять, к чему вы стремитесь со своим кодом - если вы еще не используете его! ; о)

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

person Caroline    schedule 08.12.2009
comment
Я прокомментировал это в ответе Брайана Агнью. Я не считаю, что имена шаблонов являются хорошими именами классов только в некоторых случаях (Factory, Strategy), но не в других (Singleton). Я хочу, чтобы имена отражали работу класса, а не то, как я ее реализовал. - person froh42; 08.12.2009