DEA7H
@DEA7H
.NET/C#/ASP.NET MVC Developer

Правила объявления интерфейсов. «I» или «!I»?

Всем привет.

Кто может адекватно объяснить почему стоить объявлять интерфейсы с буквой "I":
interface IDisposable
{
}


Или почему НЕ стоит этого делать:
interface Disposable {
}


Я .NET Developer и случайно в команде Java-еров смотря на их код сказал: "ОМГ, как можно объявить интерфейс без буквы `I`?". После этого пользуясь численным приемуществом они меня благополучно смешали с дерьмом... =*(

Так вот, как же все-таки правильнее? И желательно основываться не на своих предпочтениях а как-нить обосновать.

Заранее благодарен.
  • Вопрос задан
  • 3285 просмотров
Решения вопроса 1
pi314
@pi314
Президент Солнечной системы и окрестностей
Никакой "официальной" жесткой конвенции на этот счет нет. Как уже указал RGV, какую конвенцию использовать - личное дело команды / фирмы / техдира.
Я сам в свое время пришел к Java из Pascal и .NET, и тоже придерживаюсь нотации с I, т.к. это позволяет в коде визуально отличить интерфейс от класса. Просто для примера:
...
  IProducer simpleProducer = new Producer();
  IProducer sofisticatedProducer = new SpecialProducer();
...
  public void produceSomething(IProducer producer);

При взгляде на такой код сразу понятно, кто из ху, без всяких дополнительных кликов, наведения курсора и прочих пританцовываний с IDE.
И хотя это никак явно не помешает креативному балбесу влепить класс там, где нужно использовать интерфейс, это поможет проводящему ревью заметить грабли невооруженным глазом :) С моей точки зрения цена такого удобства в 1 (один !) доп. символ в имени вполне оправдана.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 8
@mamkaololosha
В джаве же implements/extends. там I избыточен.
Ответ написан
Комментировать
clx
@clx
В C#:
1. Соглашение об именовании для C# от Майкрософта, которое все используют
2. Чтобы отличать от классов

Как делается в яве - знают явисты и думаю у них есть причины делать как они делают(в том числе, я не знаю правы ли конкретно ваши явисты или нет), однако нет никакой причины, чтобы явисты соблюдали соглашения об именовании от c# и наоборот.
Ответ написан
Комментировать
zencd
@zencd
Как-то все бессознательно... Стойкое неприятие джава-стайла имеется, а "почему" - ни одной мысли?! Джаверы смешали вас с дерьмом тоже, видать, тоже безо всякого обоснования. Давайте сами - вот вам самому зачем вам эта буква? Как она помогает?
Ответ написан
@Power
Из опыта: в java не используются элементы венгерской нотации, в том числе, имя интерфейса не имеет префикса "I". При реализации интерфейса классам иногда даётся суффикс "Impl" (но не всегда; скорее всего, только тогда, когда единственное назначение класса - это реализация интерфейса).
Как обосновать, я не знаю, скорее всего, так исторически сложилось. Есть некоторые общие coding conventions от Sun, но их используют скорее как рекомендации, а не как строгие правила. Ну и все нормальные IDE (по крайней мере, для java) способны показать тип любого идентификатора, так что указывать это в имени избыточно.
Ответ написан
Это просто стиль написания кода. Идеология, которой придерживается команда. Не более.
Ответ написан
Комментировать
В нашей команде префикс «I» не используют. Все правильно говорят: это соглашение имеет плюсы и минусы и в целом дело личного вкуса. Есть много очень хороших проектов, где I используют, и где I не используют. Главное, чтобы это не превращалось в религию. Если вас на работе смешивают с дерьмом, подумайте, нужна ли вам такая работа :-)
Ответ написан
Комментировать
HaJIuBauKa
@HaJIuBauKa
  1. Действительно для отличия интерфейса от класса. Так как классы зачастую называются подобным образом.
    List - IList
  2. При вводе удобно. "I" + Ctrl + space
  3. Читабельно. В том числе и просто контекстно соответствует в большинстве случаев. IHasGenerator - Я Имею Генератор
Ответ написан
Комментировать
kivsiak
@kivsiak
software engineer
Ну явист явисту рознь. Для меня например авторитет Java api. А там префиксы не используются.

Да и сам я считаю что отличать визуально интерфейсы от классов в java смысла нет и даже вредно. Иногда конечно обзываю *Impl но это от лени. Название должно четко описывать реализацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы