Сообщество C # настолько повсеместно использовало префикс «I» для обозначения интерфейса, что его знают даже самые неопытные программисты.
Почему же тогда мы не ставим префиксы перечислений, абстрактных классов или структур (возможно, с «E», «A» и «S» соответственно)?
Например, если бы мы пометили все абстрактные классы буквой «А», это дало бы ценную информацию об этом типе, которая, хотя и может быть выведена, не сразу очевидна.
Пожалуйста, обратите внимание, что я не защищаю это изменение, я просто пытаюсь понять, почему мы так не поступаем.
Этот поток отвечает, почему мы используем префикс «I», но не отвечает, почему мы не используем другие префиксы.
c#
.net
coding-standards
source-code
Стивен
источник
источник
Ответы:
Смысл соглашения об именах для интерфейсов состоит в том, чтобы обеспечить быстрое, простое решение о том, как называть интерфейс, который реализует ваш класс. Если у вас есть
Frobnicator
, но вы должны объявить интерфейс для разъединения или по какой-либо другой причине, тогда решение назвать его неIFrobnicator
требует осознанной мысли, и это хорошо.Та же проблема не относится к другим конструкциям, которые вы называете. Перечисления и структуры полезны, но не обязательно находить второе , короткое, прозрачное, явно связанное имя в дополнение к самому имени. Следовательно, нет никакого давления, чтобы наложить «E» на имя перечисления или структуры.
(Абстрактные классы чем-то похожи на интерфейсы, так как вам нужно предоставить второй, конкретный класс, чтобы что-то сделать, поэтому они могли бы получить соглашение, начинающееся с 'A', но по какой-то причине они этого не сделали. Мне позволено строить догадки, я думаю, что «я», будучи особенно узким письмом, могло иметь к этому какое-то отношение.)
источник
AnimalBase
и различные вкусыAnimalGiraffe
, иAnimalLion
т.д.List
как они очень технически названыArrayList
иLinkedList
являются названиями реализаций. (C #, я полагаю, имеетIList
как интерфейс, так иList
список массивов)Point p = myPoints[3]; p.X += 3;
, повлияет ли этоmyPoints[3].X
. Оглядываясь назад, я бы предпочел, чтобы C # использовалvar->field
для доступаvar.field
к полям классов и для доступа к структурным полям, но, очевидно, это не так. Тем не менее, казалось бы, на первый взгляд могут быть полезны средства их различения.Я думаю, что он мало используется, потому что:
Из этого последнего пункта и некоторой интерпретации вы можете сделать вывод. Системы венгерские (префиксный тип) плохие и не должны использоваться. Приложения венгерские (вид префикса) он использует.
Возвращаясь к вашему вопросу, я думаю, что предложенная вами нотация является формой Apps венгерского языка, и если вы чувствуете, что добавленная стоимость увеличивает затраты, и вы последовательно внедряете ее в свою кодовую базу, это просто замечательно. Но так как вы должны учитывать это для каждого проекта, это не должно быть общим правилом.
Я думаю, что люди заметили, что это имеет значение для интерфейсов чаще, и поэтому стало общим правилом для интерфейсов.
источник
Просто (надеюсь, применимо) мысль:
Существует очевидная тенденция к «кодированию для интерфейсов», а не к конкретным классам. «В наше время» кажется почти более выгодным иметь соглашение об именах для классов, например начинать их с «C», а не с буквы «I» для интерфейса.
Я только что закончил Java-проект, в котором все интерфейсы на самом деле назывались Model. Да, соглашение об именах интерфейсов заключалось в том, чтобы заканчивать имя на «Model» ..., а затем в «DataTransferObject / DTO» реализовать интерфейс как :
тогда как в C #
Переоснащение моего мозга, чтобы держать это прямо, больно, но я понимаю, как это может помочь в терминах программирования для интерфейса.
источник