Лучшая практика для подклассов имен


10

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

Например: Общий "DoiGraphNode" А "DoiGraphNode", представляющий ресурс А "DoiGraphNode", представляющий ресурс Java А "DoiGraphNode" с соответствующим пути и т.д. и т.п.

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


Вариант 1: Всегда начинайте с названия концепции.

Таким образом: DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath и т.д.

Pro: Совершенно ясно, что я имею дело с, то легко увидеть все варианты у меня есть

Con: Не очень естественно? Все выглядит одинаково?


Вариант 2: Поместите специальные материалы в начале.

Таким образом: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, и т.д., и т.д.

Pro: очень ясно, когда я вижу его в коде

Con: Нахождение это может быть трудно, особенно если я не помню название, отсутствие визуальной согласованности


Вариант 3: Установите специальный материал и удалить некоторые из дублирующего текста

Таким образом: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

Pro: Не так много, чтобы писать и читать Con: Похоже, кр * р, очень противоречивой, могут конфликтовать с другими именами

4

Имя им за то, что они есть.

Если обозначение их сложно или неоднозначно, это часто признак того, что класс делает слишком много (принцип единой ответственности).

Чтобы избежать конфликтов имен, выберите соответствующие пространства имен.

Personnally, я бы использовал 3

+1

Я также выбрал третий вариант. В первых двух существует опасность прекращения «лабиринта извилистых длинных имен, все немного отличающихся», где вам трудно читать их и даже помнить, какое имя соответствует той концепции. 22 фев. 092009-02-22 08:52:59


5

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

Для чего это стоит, я обычно использую вариант 3, и из моего опыта, глядя на вариант 2 кода других людей, вероятно, более распространены, чем вариант 1.


0

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

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


2

Вы можете найти руководство в документе стандартов кодирования, например, есть документ IDesign для C# here.

Лично я предпочитаю вариант 2. Как правило, .NET Framework называет его объекты. Например, посмотрите классы атрибутов. Все они заканчиваются атрибутом (TestMethodAttribute). То же самое касается EventHandlers: OnClickEventHandler - рекомендуемое имя для обработчика событий, который обрабатывает событие Click.

Обычно я стараюсь следовать этому при разработке собственного кода и интерфейсов. Таким образом, IUnitWriter создает StringUnitWriter и DataTableUnitWriter. Таким образом, я всегда знаю, что их базовый класс, и он читает более естественно. Самодокументирующийся код является конечной целью для всех гибких разработчиков, поэтому мне кажется, что это хорошо работает для меня!


1

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

Хотя я обычно использовал вариант 2 ранее в своей карьере программирования, я избегаю его сейчас, потому что, как вы говорите, он «непоследователен» и не кажется очень ортогональным.

Я часто использую опцию 3, когда подкласс обеспечивает существенное расширение или спецификацию, или если имена будут довольно длинными. Например, мои файлы классы имени системы выводятся из строки , но они значительно расширяют класс String, и имеют существенно различное использования/значение:

Directory_entry_name, полученный из строки добавляет широкие функциональные возможности. File_name, полученное из Directory_entry_name, имеет довольно специализированные функции. Имя_каталога, производное от Directory_entry_name, также имеет довольно специализированные функции.

Также наряду с вариантом 1 я обычно использую неквалифицированное имя для класса интерфейса. Например, я мог бы иметь класс interence цепь:

  • Текст (интерфейс)
  • Text_abstract (абстрактные (основание) обобщение класс)
  • Text_ASCII (конкретный класс специфичных для ASCII кодирования)
  • Text_unicode (конкретный класс, специфичный для кодирования в Юникоде)

Мне очень нравится, что интерфейс и абстрактный базовый класс автоматически отображаются сначала в отсортированном списке.