Соглашение об именах интерфейса Java, AbstractClass и Enum - PullRequest
30 голосов
/ 17 июня 2009

В нашей команде обсуждается соглашение о коде для Java для:

  • interface: Foo или IFoo или FooInterface?

  • abstract: Foo или AbstractFoo?

  • Enums: Foo или FooEnum?

Я в основном пытаюсь отложить свои личные предпочтения в сторону :), поэтому причины для поддержки того или иного соглашения очень приветствуются.

Ответы [ 9 ]

29 голосов
/ 17 июня 2009

В Java: Foo, AbstractFoo и Foo - хотя AbstractFoo может быть просто Foo.

Данные:

  • java.util.List (интерфейс)
  • java.util.AbstractList (абстрактный класс)
  • java.util.Formatter.BigDecimalLayoutForm (enum)

Часть интерфейса приведена в разделе Соглашения об именах документа Java Coding Conventions. Это не говорит о перечислениях и абстрактных классах.

18 голосов
/ 17 июня 2009

интерфейсы: Foo

Причина: ваш код не должен знать, что он имеет дело с интерфейсом. Написание «IFoo» делает именно это. Вместо этого Foo ясно дает понять, что 'Foo' является общим, и объект за ним может быть 'NumFoo' или 'StrFoo'. Код действительно не нужно заботиться.

абстрактные классы: AbstractFoo

Причина: ваш код никогда не будет использовать этот класс напрямую. Вы всегда будете создавать подклассы этого класса для создания любых классов, которые используются другим кодом. Поэтому программисту должно быть совершенно ясно, что класс является абстрактным. И как лучше назвать его Абстрактным! В местах, где вам нужно использовать ссылки типа AbstractFoo, вы должны вместо этого пересмотреть использование интерфейса. (Конечно, это не возможно в C ++)

Перечисления: FooType или FooEnum. Лично FooType лучше, потому что Type легче относится к «реальному миру», который делает Enum.

Ура!

17 голосов
/ 17 августа 2011

С моего блога :

  • Foo - Интерфейс в конечном итоге определяет концепцию, поэтому он должен иметь лучшее имя.
  • AbstractFoo - Абстрактная реализация, предназначенная для использования в качестве основы иерархии классов.
  • BaseFoo - Реализация, предназначенная для использования в качестве основы иерархии классов, где базовый класс может использоваться самостоятельно, если необходимо.
  • DefaultFoo - Реализация по умолчанию, которая подходит для большинства типичных случаев использования.
  • SimpleFoo - «простая» реализация без неожиданной функциональности, возможно, в качестве примера или в виде макета. Простой POJO был бы хорошей "простой" реализацией.
  • {Descriptive} Foo - Другие реализации должны описывать то, что делает их уникальными.

В блоге также обсуждаются причины против некоторых других имен.

5 голосов
/ 17 июня 2009

Никаких специальных соглашений.

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

Имена классов должны просто описывать роль класса как можно лучше. Это может привести к «естественным» соглашениям об именах - очень хорошим примером является соглашение Java о интерфейсах именования с суффиксом -able (Iterable, Comparable) - но я не хочу представлять результат, если он применялись повсеместно, и Лист, Карта и т. д. должны были следовать ему.

3 голосов
/ 17 июня 2009

Мое соглашение:

  • интерфейс : Foo
  • abstract : это зависит от FooAdaptor или AbstractFoo или BaseFoo
  • enum : Foo или Foos

Мне действительно не нравится использовать I в именах интерфейсов или даже FooInterface:

 interface FooInterface {

похоже на запись:

 class FooClass {

или даже:

 abstract class AbstractFooClass {

это просто пролиферация.

2 голосов
/ 27 октября 2010

Что касается интерфейсов, которые мне лично нравятся:

Fooable
2 голосов
/ 17 июня 2009

Мое соглашение:

  • Интерфейс: Foo;
  • Аннотация: AbstractFoo;
  • Перечисление: обычно Foo, но при некоторых обстоятельствах FooType.

IFoo очень .Net, а не Java. FooInterface Я никогда не видел б.

1 голос
/ 27 октября 2010

Об интерфейсах:

Я предпочитаю IFoo, потому что это говорящее имя, говорящее вам, что оно является внутренним. Во-вторых, для модулей и т. Д., Где вы делаете интерфейс только для одного класса, класс часто имеет то же имя, что и интерфейс. Тогда вы можете использовать Foo extends IFoo. В противном случае, вам нужно будет найти имя. Или используйте FooInterface или что-то еще ...

java.util.list, как указано, использует Foo. Это не проблема, поскольку классы с разными концепциями реализуют его, поэтому уже предлагают другое имя (ArrayList, LinkedList…). Я не совсем уверен, предпочел бы я там IList. Не знаю…: P

0 голосов
/ 14 июня 2012

Вот конвекция, используемая моей командой разработчиков в ION.

Интерфейс

interface IMyInterface

::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::

abstract class MyAbstract

::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::

enum EMyEnumeration

::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...