Наименование интерфейса: префикс 'Can-' vs суффикс '-Able'

29

Обычно в качестве суффикса для интерфейсов используется «-able», например

Сериализуемый Печатный Enumerable Питьевой Shootable Вращающийся

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

Например, 1 означает «Стреляющий» означает, что объект способен стрелять (оружие может реализовать это), или это означает, что в него можно стрелять (целевая доска может реализовать это). С префиксом «Can-» первым будет «CanShoot», а вторым будет «CanBeShotAt» или «CanShootAt».

Например, 2 документа «CanBePrinted» и принтер «CanPrint»

Или мы должны придерживаться '-Able' и позволить документации предоставлять контекст?

Любые мнения.

MustafaM
источник
Человек, используйте "-able". Период.
Тулаинс Кордова
2
Используйте оба дляclass Cannibal implements Can, Able {}
Томас Эдинг

Ответы:

18

Может быть, вы хотите Is-состоянии?

Некоторые примеры из .Net:

NetworkStream.Readable
NetworkStream.Writable
Stream.CanRead
Stream.CanWrite
Type.IsSerializable

Там, кажется, нет единого стандарта. Иди с тем, что читает хорошо.

if (document.IsPrintable && printer.CanPrint) { printer.Print(document) }

РЕДАКТИРОВАТЬ: Как указывалось, вопрос был об интерфейсах, а не свойства.

В этом случае я не могу найти интерфейсы с именем Can-. Интерфейсы имеют тенденцию всегда использовать -able. Я бы согласился с этой терминологией. Метод может запрашивать в качестве параметра а ISerializable objectили IPrintable document. Просить о ICanBeSerialized objectили ICanBePrinted documentочень неудобно читать.

С другой стороны, принтер, я бы предложил просто вызвать интерфейс IPrinter. Ваш метод будет запрашивать IPrinter device.

Прочитайте подпись метода ниже вслух. (Лично я считаю, что префикс «I» молчит.) Хорошо ли он читается? Звучит правильно?

void PrintDocument(IPrinter device, IPrintable document)
{
    device.Print(document)
}
Hand-E-Food
источник
2
Document.IsPrintable лучше, чем Document.CanBePrinted. Насколько я могу судить, они использовали возможность избежать пассивного голоса.
Танос Папатанасиу
«Может быть напечатано» кажется более правильным английским, чем «печатается».
Дэнни Варод
1
«Пассивный голос используется, когда основное внимание уделяется действию. Однако не важно или неизвестно, кто или что выполняет действие». Я могу только догадываться, что они хотели, чтобы фокус оставался на объекте, а не на действии. Так что если Type.IsSerializable выдает исключение, это ошибка Типа. не методы, но если «Type.CanBeSerialized» выдает исключение, то вы будете винить метод, а не тип. Правда, разница незначительна, но она есть.
Танос Папатанасиу
3
Я вижу, что это принятый ответ, но он не отвечает на вопрос ОП. Приведенные примеры являются именами свойств . OP просит для именования для интерфейса имен, таких , как ISerializable, IDataErrorInfo, и INotifyPropertyChanged.
Кевин Маккормик
@KevinMcCormick, хорошая мысль! Редактирует выше.
Hand-E-Food
23

Грамматически говоря, «canFoobar» - это предикат, а «Foobarable» - это прилагательное или существительное (обычно существительное в контексте API).

Также обратите внимание на тонкое различие: -able подразумевает пассивную роль существительного, к которому он применяется, то есть, если что-то является Foobarable, то оно может быть ошеломлено чем-то другим; может подразумевать активную роль, то есть если что-то может foobar, то оно может foobar что-то еще. Или под другим углом: если A может foobar B, то A.canFoobar()и B is Foobarable.

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

instance.canFoobar();

class Something implements Foobarable { ... }
tdammers
источник
7

Лично я бы придерживался версии -able. Вот моя причина: большинство (все?) Графических редакторов предлагают идентификаторы, основанные на том, что вы ввели. Хотя некоторые из них достаточно «умны» для поиска по идентификаторам, некоторые все же просто предлагают начало поиска идентификаторов.

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

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

Кроме того, я бы рекомендовал использовать соглашение об именах, которое делает ваш код наиболее понятным для тех, кто работает над проектом. Разговор внутри вашей команды. Нет правильного или неправильного как такового. Просто соглашения, которые работают, и соглашения, которые работают меньше.

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

Manfred
источник
1
+1. Мои рассуждения были бы такими же: сначала поместите управляющий глагол, чтобы упростить поиск / поиск / сортировку в IDE.
Пап
1
не только intellisense работает таким образом, но и человек сканирует текст, префиксы делают ваш код менее читабельным
jk.
7

Очевидно, что префикс и суффикс являются почти очевидным выбором для различных типов действий или, скорее, различных направлений действия.

Однако текущее использование и предпочтения могут быть противоречивыми по многим причинам.

Действие выполняется по объекту:
CanShoot -> Она стреляет (в) что - то
CanFly -> Он летит
CanChange -> Это меняет

Действие выполняется над объектом:
Readable -> Вы можете прочитать его
Writable -> Вы можете написать (в) его
Printable -> Вы можете напечатать его

Хотя это может быть не правило или даже не обязательно логично, оно помогает принять соглашение и поддерживать последовательность использования в именовании переменных.

Kris
источник
4

Я думаю, что вы, возможно, захотите провести различие между способностями и разрешениями. Хотя Serializableи CanSerializeподразумевают, что что-то может быть сериализовано, существуют также проблемы с разрешениями (или, возможно, нехватка места на диске), и вам, возможно, придется рассмотреть их MaySerialize. Оставление вещей в ~ableпокое устраняет необходимость различать canи may.

Tangurena
источник
SerializableIfNotDiskFullAndIfNotPermissionMissing ... Lol :)
Макс
2

При создании подклассов / реализации интерфейсов я думаю, что эмпирическое правило заключается в том, что вы должны иметь возможность сказать «B - это A» (где B реализует A). Неверно говорить:

А DocumentэтоCanBePrinted

Но звучит правильно (или, по крайней мере, лучше) сказать:

А DocumentэтоPrintable

Гьян ака Гари Буйн
источник
2

Я думаю, что и для грамматики, и для конвенции Xable лучше для имен интерфейсов, тогда как IsX, CanX, DoesX лучше для имен свойств.

Из MSDN:

«Назовите логические свойства с помощью утвердительной фразы (CanSeek вместо CantSeek). При желании вы также можете добавить префикс булевых свойств к Is, Can или Has, но только там, где это добавляет значение». http://msdn.microsoft.com/en-us/library/ms229012.aspx

Дэнни Варод
источник
+1 за полезную ссылку; Я никогда не могу понять, как назвать вещи
CamelBlues
0

На мой взгляд, вариант «-able» гораздо более читабелен, чем предложенный вами вариант «CanDoSomething», который налагает гораздо больше горбов верблюда.

Мартин
источник
1
и Can- это больше имя метода
чокнутый урод
Название свойства - см. MSDN. Имена методов должны быть «глаголами или глагольными фразами». Кроме того, что не так с несколькими горбами?
Дэнни Варод
0

В Scala *Ableиспользуется для интерфейсов, но Can*используется для шаблона класса типа. По сути, чтобы иметь возможность вызывать определенные методы, неявное значение определенного типа должно существовать в области видимости. Имя этого типа иногда начинается с префикса Can.

axel22
источник
Может * не хорошее имя для класса. Цитата из MSDN: «Делайте имена классов, интерфейсов и типов значений с помощью имен существительных, фраз существительных или иногда прилагательных, используя регистр Pascal», ссылка: msdn.microsoft.com/en-us/library/ms229040.aspx Хорошее имя для класс будет Document, допустимое имя будет Printable.
Дэнни Варод
Одним из примеров на языке Scala является CanBuildFrom. Это была бы прилагательная фраза. Вариант использования этого класса очень отличается от других классов. Экземпляры этого класса почти никогда не создаются и не разрешаются клиентом - скорее, они доступны в области видимости для определенных типов. Если они доступны для определенного типа, то могут быть вызваны методы, включающие этот тип, помеченные как требующие этого класса типов. Это существует, чтобы предложить механизм расширяемости, более гибкий, чем подтип. Смотрите scala-lang.org/node/114 .
axel22
Я только вспоминаю использование прилагательных фраз для ложных классов, реализующих интерфейсы для модульных тестов - поскольку они не играли никакой реальной роли.
Дэнни Варод