Pull to refresh

Comments 26

В джаве есть ключевые слова extends и implements, а в C# нет, поэтому без префикса не понятно от чего отнаследован класс. Да и удобно это: если смотреть через Object Browser, то все типа расположены в алфавитном порядке, поэтому все интерфейсы располагаются рядом. И опять же IntelliSense никто не отменял.
Если бы стандартной нотацией был вариант, взятый из Java, то интерфейсы отображались бы цельной группой над или под группой классов.

Касательно наследования вижу как минимум такой вариант: класс всегда идет первым, остальные перечисленные — интерфейсы ввиду отсутствия множественного наследования в языке C#.
class A: B, C, D { }
И вот как понять, B — это базовый класс или интерфейс? )
Первый разумный аргумент в пользу нотации I :)
А аргументы? Кроме того, что это стандартная нотация, используемая и продвигаемая Microsoft?
А еще? Одного маловато :)
Вам их уже привели достаточно)
Я понимаю, что это общепринято, вопрос в том, разумно ли это. Т.е. нравится ли нам стандартная нотация потому, что это хорошая нотация, или потому, что это _стандартная_ нотация?
Потому что это удобно. Даже открывая чужой код (если конечно его не писал урод), мы видим, что у нас интерфейсы, а что классы. Да и новичкам удобно, жаль, что в Джаве такого не сделали.
Ок, рассмотрим все объявляемые элементы языка C#:
1. классы
2. интерфейсы
3. перечисления
4. делегаты

Еще можно отдельно выделить абстрактные классы. Так почему же мы не выделяем их, соответственно, как C, I, E, D, A? :)
Если честно, то я, в свое время, сходу принял венгерскую нотацию и с удовольствием ей следовал.
Отвечу по-порядку:
1. Классу нет нужды быть с приставкой, их можно оставить, как есть, всем понятно, что это переменная, это экземпляр класса, а не примитивный тип (который, вдобавок, в интелисенс и выделяется по-особому). И потом, некоторых товарищей просто воротит от MFC модели именования классов.
2. Уже.
3. И да и нет. Было бы неплохо их отделить, но не критично в прочтении кода. Вдобавок, их можно рассматривать как класс с открытыми переменными.
4. Делегаты это члены класса, это не объекты и они не могут существовать вне рамок своих хозяев.
5. Абстрактные классы. Они нам ни к чему, мы можем иметь объект приведенный к какому-либу интерфейсу, но нам ни к чему такой же объект приведенный к абстрактному классу. Мы ведь не можем вызывать его методы, т.к. в отличии от интерфейса никто не проследит, кем он реализован и не запустит нужный метод.
6. Структуры. Фактически, те же классы. Неплохо было бы отделять, но то же не критично.
1. Согласен в виду их преобладания
2. :)
3. Спорно, но пропущу
4. Где это вы видели делегаты как члены класса? Делегат это вполне себе тип, который наследуется от MulticastDelegate и объявляется с помощью ключевого слова delegate. По хорошему каждый делегат объявляется в отдельном файле, как и классы, и, соответственно, Конвенция DEventHandler была бы вполне ничего ;) Хотя здесь есть выход — все делегаты и так заканчиваются на Handler.
5. Не скажите, в некоторых местах знать, что в метод передается абстрактный класс, так же важно, как знать, что передается интерфейс или конкретный класс. Так что вполне себе нотация — AController
6. Одно из правил, которому я неизменно следую — Structures are evil :) Хотя здесь SPoint смотрелось бы вполне ничего.

Итого из удобных мест, где можно использовать такую же нотацию, выделяем:
1. Перечисления
2. Абстрактные классы (Можно дописывать суффикс Base)
3. Структуры

Почему в стандартной нотации эти элементы не выделяются? :)
1. В проектах писали либо EnumXXX либо XXXEnum
2. Слово Base очень кстати для абстрактных классов
3. Не вижу необходимости, скорее всего из-за того, что крайне редко пользуюсь ими

«Почему в стандартной нотации эти элементы не выделяются? :) „
— этот момент остаётся на усмотрение команды/разработчика.
1. Немножко ugly, не считаете?
2. Согласен, что-то типа ControlBase или ControllerBase очень нравится
3. Аналогично, но вопрос остается открытым для тех, кто ими пользуется
1. Возможно. Но команда решила так. Да и привычка — дело наживное.
Суффикс Base дописывается в большинстве случаев. Исключений, даже в .NET библиотеке, я на вскидку не припомню (MulticastDelegate не в счет, это делегат, а не просто абстрактный класс).
Кстати, по поводу делегатов, вы их много наследуете? :) Нет же, их чаще всего используют с ключевым словом delegate и все. Понятно, что они специфичны, но у каждого из них (абстрактного и потомка) есть ключевое слово Delegate в названии. Стоит игра свеч?

Другое дело, что есть блоги, в которых разработчики из Microsoft пишут следующее: blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx

Почитайте в основном комментарии. Народ не любит венгерскую запись, да и в официальном руководстве по C# эта нотация не одобряется. Вот и получается, именовать как-то надо, но кто-то против даже простых суффиксов или префиксов, кто-то предлагает свой вариант, а пока нету стандартов, то всякий делает по-своему. И это ребята из MS, которые занимаются разработкой фреймворка.
Делегаты, объявленные через delegate, всегда в отдельный файл. Да, редко. Но в отдельный :)

По ссылочке хорошее мнение. Та же история — всему свое место. И Base — тоже.

З.Ы. Венгерская нотация недооценена и неправильно понята ;)
Да это разумно, потому что если этот проект будет писать другой программист, то он не будет ломать голову над тем, почему интерфейс без префикса I.

Мне префикс ни разу не мешал, а иногда даже помогал. Например, когда производиться рефакторинг и из класса X нужно удалить зависимость от класса Y, я ввожу интерфейс IY, который реализует Y, и уже от которого зависит X. Фишка в том, что я не думаю над именем этого интерфейса. Программируя на Java, я бы завис на процессе выбора имени:)
1. Резонно, но дискуссия немного не о стандартности нотации, а о ее полезности («а что было бы, если бы ЭТА нотация была стандартной?»)

2. Хороший пример :) +1 в сторону «I»

Я и сам ярый сторонник нотации I, просто стало интересно — это сила привычки и нелюбви к джаве (хаха, мы не в джаве, у нас есть «I»!) или такой подход несет определенные объективные выгоды?
С теоретической точки зрения — разработчику должно быть пофиг однородно, класс это или интерфейс в коде, где он используется. Это Java, она «правильная».

С другой стороны, более практичным оказывается разделять класс и «чистый» класс-интерфейс. Это С#, он несколько более практичный.

Ну и капелька религиозности — .net это улучшеный COM, а там ISomething — это закон :)
Sign up to leave a comment.

Articles