design-patterns - русском - naming classes




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

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

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

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

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

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

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

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

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

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

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

  • и т.д.

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

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

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

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

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

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

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

  • координатор
  • строитель
  • писатель
  • читатель
  • укротитель
  • Контейнер
  • протокол
  • цель
  • конвертер
  • контроллер
  • Посмотреть
  • завод
  • сущность
  • ведро

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

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


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

Лучшие 20:

  • атрибут
  • тип
  • помощник
  • коллекция
  • конвертер
  • обработчик
  • Информация
  • поставщик
  • исключение
  • оказание услуг
  • элемент
  • менеджер
  • узел
  • вариант
  • завод
  • контекст
  • вещь
  • дизайнер
  • база
  • редактор

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

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

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

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


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

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

;-)


Специфично для C #, я нашел «Framework Design Guidelines: Conventions, Idioms и Patterns for Reusable .NET Libraries», чтобы иметь много хорошей информации о логике именования.

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


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

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

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


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

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

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

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


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

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


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

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





naming