Используйте глаголы с функциями, существительные с классами - как насчет интерфейсов? [закрыто]


23

Хорошо, я понимаю обычные соглашения об использовании глаголов с функциями и существительных с классами. А как насчет интерфейсов? Есть ли какая-то методология, когда придумывать имена интерфейсов, которые могут быть не столь очевидными?

Просто чтобы прояснить, я не говорю о том, ставить ли «я» перед именем или использовать camelCase или PascalCase. Я задаюсь вопросом о методе определения ясного, семантического имени для интерфейса.

РЕДАКТИРОВАТЬ Я зациклен на том, как назвать интерфейс наиболее понятным способом. Я думаю, это просто должно быть и существительное, потому что, когда я думаю о наименовании классов, я думаю о ближайшем «реальном» объекте мира, к которому он может относиться. Я полагаю, что реальные интерфейсы - это клавиатура, мышь, пульт дистанционного управления, экран банкомата. Это все существительные. В любом случае, любая дополнительная информация о хорошем способе формулирования имен интерфейсов будет принята с благодарностью.


2
Хм ... Исходя из названия, я подумал, что речь пойдет об уравнении частей речи между программированием и английским языком. В этом случае madlibs кажутся возможными.
Иската

Помните, что когда вы создаете класс, вы также создаете интерфейс для объектов, созданных этим классом ... Или, другими словами, классы являются реализованными интерфейсами. Таким образом, они должны использовать одно и то же соглашение об именах.
Даниэль Т.

Также ИМХО "использование глаголов с функциями" является слишком общим. Вы должны использовать глаголы с командами и существительные с запросами .
Даниэль Т.

Ответы:


21

Я бы сказал, что это зависит от того, что определяет интерфейс. В некоторых случаях, когда интерфейс довольно специфичен и детален, я думаю, что существительное лучше. Примерами являются IList, ICollection.

Иногда, хотя интерфейс больше о добавлении определенных общих функций в класс. В этом случае я думаю, что прилагательное лучше. Примерами могут служить IDisposable, IEnumerable...

Возможно, еще один способ думать об этом - это то, сколько «способностей» определяет ваш интерфейс.

Например, IList<T>интерфейс определяет следующие возможности: Добавить, Очистить, Содержит, Вставить, Удалить, ... Это все свойства списка, поэтому IListэто хорошее имя.

IDisposableс другой стороны, определяет только одну способность: Dispose. Таким образом, он подходит для всего, что является одноразовым. Отсюда и название IDisposable.


10
Я бы предложил использовать прилагательное «_able», если ваш интерфейс будет назван в честь того, что можно сделать с вашим объектом (например IEnumerable), существительное «_er», если ваш интерфейс будет назван в честь того, что ваш объект делает с другими объектами ( например IEqualityComparer, и общее существительное, если ваш интерфейс назван в честь типа вещи, поведение которой он имитирует (например IList<T>).
суперкат

Комментарий от @supercat действительно должен быть включен в этот ответ. Это имеет много смысла.
Нихил Вартак,

На самом деле префикс имени интерфейса с Iизбыточностью.
user1870400

5

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

Некоторые примеры:

Flyable      - Can Fly
Workable     - Can work
Negotiatable - Can negotiate.

Я думаю , что это не является правильным назвать интерфейсы с Iи вызвать Setс , ISetпотому что, как разработчик, вы не должны быть обеспокоены тем, является ли это интерфейс или класс. Я вижу, что эта практика не существует в Java сейчас.


+1 за «как разработчик, вы не должны беспокоиться, будь то интерфейс или класс».
Казарк

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

@MaximusMinimus с префиксом это Iизбыточно независимо. Тогда почему бы не добавить префиксы к абстрактным классам A, обычные к классам и Cт. Д. ??
user1870400

@ user1870400 - правда, но это не та часть, с которой я не согласен.
Максимус Минимус

4

Поскольку интерфейс на самом деле является просто выражением типа «что», а не «как», я бы назвал их так же, как вы называете классы, по крайней мере, с точки зрения речи. Единственное, что я могу добавить к этому, - это то, что они часто будут более общими, чем конкретные реализации (например, интерфейс «Клиент» может иметь реализации «ProspectiveCustomer» и «PayingCustomer»).


0

Интерфейс используется как класс. Следовательно, оно также должно именоваться существительным, когда вы называете классы существительными. Предпочитайте абстрактные существительные, например, «Автомобиль», когда классы «Автомобиль» и «Грузовик».


0

Быстрый ответ: Интерфейс - это скорее добавление набора способностей, функций, общих границ или взаимосвязей между сущностями, классами, моделями, концепциями и т. Д.

Пришло время добавить общее поведение к классам и сущностям, а затем подойдет хорошее осмысленное имя для определения набора реализованных функций.

Именование интерфейса вроде: IStateMachineBuilder, IUserContextProviderBuilder, IEntityBuilderBuilder, IActiveAware, etc.возможно, объяснить концепцию.


1
Да, интерфейсы представляют контракты или возможности; так много известно. Но как это отвечает на вопрос, как их назвать? Все, что вы на самом деле говорите по этому поводу, это «Подумайте об этом, и вдохновение поразит вас». Это не дает никакой рекомендации, например, какое из следующих имен должно быть выбрано, почему: IStateMachineBuilder(имя существительное), IBuildStateMachine(названо в честь действия), ICanBuildStateMachine(названо в честь возможности) и т. Д.
stakx

0

Это зависит от того, если интерфейс содержит только методы, было бы хорошо назвать его, используя глаголы типа «Действия», где, как если бы он представлял универсальный класс, который содержит статические, конечные поля, тогда мы можем использовать универсальное Существительное, такое как «Автомобиль».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.