Очень длинные имена классов - PullRequest
21 голосов
/ 10 июля 2010

Я стараюсь назвать класс (также члены, свойства и т. Д.) Как можно точнее. Но иногда я не уверен, насколько это умно, если имя класса становится огромным (50 символов и более). Обработка настолько неудобна, что код становится трудно читать.

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

Обновление

Как и просил здесь пример такого длинного имени класса.

ProjectContractChargingPeriodProjectAccountReferenceVM

Первый Project представляет домен, его можно опустить, поскольку пространство имен уже подразумевает, что оно обрабатывает проекты. Проблема в том, что если я делаю это с этим именем класса, то я должен делать это со всеми классами этого пространства имен, и это мне определенно не нравится, потому что тогда многие (короткие) имена классов этого пространства имен потеряют свои выразительность. [Project] ContractChargingPeriod описывает объект, для которого используется этот класс, а ProjectAccountReference означает, что класс является ссылкой на ProjectAccount. С ProjectAccount такая же проблема, как с ProjectContract . Только использование Account не имеет смысла, потому что в приложении существуют и другие Account-классы. Reference немного слабоват, потому что на самом деле это немного больше, чем просто ссылка, но это общая цель. VM - это аббревиатура, которую я всегда использую, и она обозначает ViewModel . Я думаю, что это законно, потому что каждый, кто работает с WPF, знает, что означает VM .

Я должен сказать, что класс используется для обёртывания класса в ORM, созданный с помощью более старого инструмента, который я создал давным-давно. Классы там представляют квази 1: 1 ERM, и я знаю, что это не оптимально, но изменить это было бы серьезным усилием.

Ответы [ 7 ]

14 голосов
/ 10 июля 2010

(я использую Java / C ++ и использовал другие языки OO, но не C #, что я здесь говорю, в значительной степени относится ко всем языкам, которые я использовал)

Я использую описательные имена классов.Я не думаю, что я сделал это до 50 символов :-) Обычно длинные имена классов не являются публичными и обычно скрыты за интерфейсом и фабрикой.Имя интерфейса имеет гораздо более короткое имя, чем классы.

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

9 голосов
/ 10 июля 2010

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

Ни. Никаких аббревиатур, кроме очень хорошо известных, таких как URL или HTTP. И, возможно, для локальных переменных с очень маленькой областью действия. В противном случае подумайте о том, как получить имена, которые являются описательными и не очень длинными (я бы сказал, что более 30 символов слишком длинные).

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

5 голосов
/ 10 июля 2010

Как другие люди справляются с этим?У вас есть приблизительный верхний предел, а затем делайте аббревиатуры или стоит обрабатывать такие длинные имена?

Предполагается, что класс представляет тип вещи: это существительное (не глагол,и, конечно, не целое предложение).

Мне нравится описывать свои вещи, используя одно или два слова, может быть, три: только одно существительное или составное существительное (как в немецком языке), или, возможно, прилагательное исуществительное.

Например, вот список некоторых из моих классов в одном проекте:

Ancestors.cs
Block.cs
BlockCollection.cs
BlockDocument.cs
BlockInline.cs
BlockInlineText.cs
BlockListBullet.cs
BlockListItem.cs
BlockP.cs
BlockSequence.cs
BlockTable.cs
BlockText.cs
BlockTextParent.cs
Border.cs
BorderEdges.cs
Box.cs
Canvass.cs
CaretLocation.cs
CaretLocationAndNode.cs
CaretLocationAndPoint.cs
CaretLocationData
CaretLocationPair.cs
CaretLocationPairAndPoint.cs
CaretsInBlock.cs
DebugDumpDom.cs
DebugOutput.cs
Display.cs
Displayed.cs
DocumentHandle.cs
DomDocument.cs
DomDocumentFragment.cs
DomElementBody
DomElementHandle.cs
DomElementTag.cs
DomEvent.cs
DomList.cs
DomNode.cs
DomNodeChild.cs
DomRange.cs
DomRangeBase.cs
DomTextBody.cs
DomTextHandle.cs
Edge.cs
Editing.cs
EditingState.cs
Editor.cs
EditorAction
EditorActions
EditorMutations.cs
EditorTransaction
EventListeners.cs
ExtractedRangeInDomDocument.cs
ExtraDebugInformation.cs
FormControl.cs
... etc ...

Как видите, большинство имен классов представляют собой всего два слова (составное существительное).

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

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

3 голосов
/ 06 февраля 2015

Каждый раз, когда вы плохо относитесь к своим длинным именам, попробуйте смотреть на этот класс более 5 секунд.Я даю вам:

И его старшая сестра:

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

3 голосов
/ 11 июля 2010

Что касается примера ProjectContractChargingPeriodProjectAccountReferenceVM, вы можете преобразовать его в нечто вроде этого:

namespace Project
{
  public class ContractChargingPeriod implements IAccountReference
  {
    ...
  }

  public interface IAccountReference
  {
    ...
  }
}

ContractChargingPeriod имеет дело со всей бизнес-логикой, связанной с периодами начисления контракта.Тот факт, что он реализует IAccountReference, также говорит о том, что объект ссылается на учетную запись, но без указания этого в имени класса.

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

2 голосов
/ 10 июля 2010

Длинное имя класса может указывать на то, что у вашего класса есть много обязанностей (обратите внимание, я сказал «может»).

Подробнее см. SRP (извините, я спешу ^^).

1 голос
/ 10 июля 2010

50 символов выдвигает большой конец имен классов, но не является немыслимым. Что касается Java, максимальный предел для полного имени класса (включая пакет) составляет 2 байта .

В дикой природе библиотеки Spring славятся длинными именами классов. Например, класс AbstractTransactionalDataSourceSpringContextTests имеет длину 49 символов. Это обеспечивает модульное тестирование с впрыском бобов весной (SpringContextTests); внедрение источника данных (DataSource); тесты осведомлены о транзакциях (Transactional); рассматриваемый класс является абстрактным (Abstract).

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

...