Какой лучший подход к занятиям по именованию?

Придумать хорошие, точные названия для классов, как известно, сложно. Сделано правильно, он делает код более самодокументированным и предоставляет словарь для рассуждения о коде на более высоком уровне абстракции.

Классам, которые реализуют конкретный шаблон проектирования, может быть присвоено имя на основе известного имени паттерна (например, FooFactory, FooFacade), а классы, которые непосредственно моделируют концепции домена, могут принимать свои имена из проблемной области, но как насчет других классов? Есть ли что-то вроде тезауруса-программиста, к которому я могу обратиться, когда мне не хватает вдохновения, и не хочу использовать общие имена классов (например, FooHandler, FooProcessor, FooUtils и FooManager)?

Ответ 1

Я приведу несколько отрывков из Шаблоны реализации от Кента Бек:

Имя простого суперкласса

"[...] Имена должны быть короткими и пробитыми. Однако, чтобы сделать имена точными иногда кажется, что требуется несколько слова. Выход из этой дилеммы выбирая сильную метафору для вычисление. С учетом метафоры, даже отдельные слова приносят с собой богатая сеть ассоциаций, связей, и последствия. Например, в Рамка чертежа HotDraw, моя первая имя объекта на чертеже было DrawingObject. Пришел Уорд Каннингем наряду с метафорой типографии: рисунок похож на напечатанный, выложенный стр. Графические элементы на странице: цифры, поэтому класс стал Рисунок. В контексте метафоры Рисунокодновременно короче, богаче и более точным, чем DrawingObject."

Квалифицированное имя подкласса

"Имена подклассов имеют два задания. Им нужно сообщить, какой класс они похожи и как они другой. [...] В отличие от имен в корни иерархий, подкласс имена arent, используемые почти так же часто в беседы, чтобы они могли быть выразительным ценой кратким. [...]

Дайте подклассы, которые служат корни иерархий их собственные простые имена. Например, HotDraw имеет класс Ручка, в которой представлена ​​фигура- операции редактирования, когда фигура выбран. Он называется просто Ручканесмотря на расширение Рисунок. Там есть целое семейство ручек, и они наиболее подходящие имена StretchyHandle и TransparencyHandle. Поскольку Ручка - это корень иерархии, он заслуживает простого имя суперкласса больше, чем квалифицированное имя подкласса.

Еще одна морщина в присвоение подкласса является многоуровневым Иерархии. [...] Вместо слепого добавьте модификаторы к немедленному суперкласс, подумайте о названии из читателей перспективы. Какой класс ему нужно знать, что этот класс как? Используйте этот суперкласс в качестве основы для имени подкласса."

Интерфейс

Два стиля именования интерфейсов зависят от того, как вы думаете об интерфейсах. Интерфейсы как классы без реализаций должны быть названы так, как если бы они были классами (Простое имя суперкласса, Квалифицированное имя подкласса). Одна проблема с этим стилем Именование - это то, что хорошие имена используются до того, как вы перейдете на классы именования. интерфейс под названием Файл нуждается в классе реализации, называемом чем-то вроде ActualFile, ConcreteFile или (yuck!) FileImpl (как суффикс, так и сокращение). В общем, сообщая, имеет ли дело конкретный или абстрактный объект важен, реализуется ли абстрактный объект как интерфейс или суперкласс менее важен. Откладывая различие между интерфейсы и суперклассы хорошо поддерживаются этим стилем именования, оставляя вас чтобы изменить свое мнение позже, если это станет необходимым.

Иногда упоминание конкретных классов просто более важно для общения, чем скрывая использование интерфейсов. В этом случае имена интерфейсов префикса с "I". Если интерфейс называется IFile, класс можно просто назвать Файл.

Для более подробного обсуждения купите книгу! Это того стоит!:)

Ответ 2

Всегда идите для MyClassA, MyClassB - он позволяет красивую альфа-сортировку.

Я шучу!

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

Проблема реальная?

У меня были занятия слишком много. Если вы попытаетесь придерживаться принципа принципа единой ответственности, это сделает все, что собралось, намного приятнее. Вместо одного монолитного класса PrintHandler вы можете сломать это вниз в PageHandler, PageFormatter (и т.д.), а затем иметь мастер-класс принтера, который объединяет все это.

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

Я бы не, но рекомендовал помещать такие вещи, как имена шаблонов, в имя класса. Интерфейс классов должен сделать это очевидным (например, скрывать конструктор для singleton). Нет ничего плохого в родовом имени, если класс служит общей цели.

Удачи!

Ответ 3

Джош Блох отлично говорит о имеет несколько хороших советов:

  • Классы должны делать одно и делать это хорошо.
  • Если класс трудно назвать или объяснить, он, вероятно, не будет следовать советам в предыдущей точке.
  • Имя класса должно немедленно сообщить, что такое класс.
  • Хорошие имена управляют хорошими проектами.

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

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

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

Ответ 4

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

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

Ответ 5

Если хорошее имя не относится к spring, я бы, вероятно, поставил вопрос, есть ли более глубокая проблема - это класс, который служит хорошей цели? Если это так, называть это должно быть довольно просто.

Ответ 6

Если ваш "FooProcessor" действительно обрабатывает foos, то не отказывайтесь давать ему это имя только потому, что у вас уже есть BarProcessor, BazProcessor и т.д. Когда сомневаетесь, очевидно, что лучше. Другие разработчики, которые должны прочитать ваш код, могут не использовать тот же самый тезаурус.

Тем не менее, более конкретная спецификация не повредит для этого конкретного примера. "Процесс" - довольно широкое слово. Это действительно "FooUpdateProcessor" (который может стать "FooUpdater" ), например? Вам не нужно слишком "созидаться" по поводу именования, но если вы написали код, у вас, вероятно, есть неплохая идея о том, что он делает и чего не делает.

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