Обычно в качестве суффикса для интерфейсов используется «-able», например
Сериализуемый Печатный Enumerable Питьевой Shootable Вращающийся
Я думал, что «может» может быть лучше, потому что это может быть более наглядным. Да, это более многословно, и это добавляет шум к имени интерфейса. В частности, могут использоваться пассивные глаголы.
Например, 1 означает «Стреляющий» означает, что объект способен стрелять (оружие может реализовать это), или это означает, что в него можно стрелять (целевая доска может реализовать это). С префиксом «Can-» первым будет «CanShoot», а вторым будет «CanBeShotAt» или «CanShootAt».
Например, 2 документа «CanBePrinted» и принтер «CanPrint»
Или мы должны придерживаться '-Able' и позволить документации предоставлять контекст?
Любые мнения.
источник
class Cannibal implements Can, Able {}
Ответы:
Может быть, вы хотите Is-состоянии?
Некоторые примеры из .Net:
Там, кажется, нет единого стандарта. Иди с тем, что читает хорошо.
РЕДАКТИРОВАТЬ: Как указывалось, вопрос был об интерфейсах, а не свойства.
В этом случае я не могу найти интерфейсы с именем Can-. Интерфейсы имеют тенденцию всегда использовать -able. Я бы согласился с этой терминологией. Метод может запрашивать в качестве параметра а
ISerializable object
илиIPrintable document
. Просить оICanBeSerialized object
илиICanBePrinted document
очень неудобно читать.С другой стороны, принтер, я бы предложил просто вызвать интерфейс
IPrinter
. Ваш метод будет запрашиватьIPrinter device
.Прочитайте подпись метода ниже вслух. (Лично я считаю, что префикс «I» молчит.) Хорошо ли он читается? Звучит правильно?
источник
ISerializable
,IDataErrorInfo
, иINotifyPropertyChanged
.Грамматически говоря, «canFoobar» - это предикат, а «Foobarable» - это прилагательное или существительное (обычно существительное в контексте API).
Также обратите внимание на тонкое различие: -able подразумевает пассивную роль существительного, к которому он применяется, то есть, если что-то является Foobarable, то оно может быть ошеломлено чем-то другим; может подразумевать активную роль, то есть если что-то может foobar, то оно может foobar что-то еще. Или под другим углом: если A может foobar B, то
A.canFoobar()
иB is Foobarable
.С точки зрения выразительности ООП, я бы связывал предикаты с методами или свойствами, тогда как существительными являются классы или интерфейсы. Так:
источник
Лично я бы придерживался версии -able. Вот моя причина: большинство (все?) Графических редакторов предлагают идентификаторы, основанные на том, что вы ввели. Хотя некоторые из них достаточно «умны» для поиска по идентификаторам, некоторые все же просто предлагают начало поиска идентификаторов.
Чтобы ускорить ввод текста, вы хотели бы сократить список предлагаемых идентификаторов, используя как можно меньше нажатий клавиш. Чем больше идентификаторов имеют одинаковое начало, например, «ICan-», тем больше символов вы должны будете ввести.
Если вы считаете, что это не проблема в вашем случае, это замечательно, и я бы рекомендовал использовать другие критерии для выбора соглашения об именовании. В некоторых случаях, например, в нашей команде, мы предпочитаем идентификаторы, которые различают после как можно меньшего количества нажатий клавиш.
Кроме того, я бы рекомендовал использовать соглашение об именах, которое делает ваш код наиболее понятным для тех, кто работает над проектом. Разговор внутри вашей команды. Нет правильного или неправильного как такового. Просто соглашения, которые работают, и соглашения, которые работают меньше.
Не забывайте, что хорошие инструменты рефакторинга позволяют вам переименовывать вещи так часто, как вам нравится. Так что легко экспериментировать с разными подходами.
источник
Очевидно, что префикс и суффикс являются почти очевидным выбором для различных типов действий или, скорее, различных направлений действия.
Однако текущее использование и предпочтения могут быть противоречивыми по многим причинам.
Действие выполняется по объекту:
CanShoot -> Она стреляет (в) что - то
CanFly -> Он летит
CanChange -> Это меняет
Действие выполняется над объектом:
Readable -> Вы можете прочитать его
Writable -> Вы можете написать (в) его
Printable -> Вы можете напечатать его
Хотя это может быть не правило или даже не обязательно логично, оно помогает принять соглашение и поддерживать последовательность использования в именовании переменных.
источник
Я думаю, что вы, возможно, захотите провести различие между способностями и разрешениями. Хотя
Serializable
иCanSerialize
подразумевают, что что-то может быть сериализовано, существуют также проблемы с разрешениями (или, возможно, нехватка места на диске), и вам, возможно, придется рассмотреть ихMaySerialize
. Оставление вещей в~able
покое устраняет необходимость различатьcan
иmay
.источник
При создании подклассов / реализации интерфейсов я думаю, что эмпирическое правило заключается в том, что вы должны иметь возможность сказать «B - это A» (где B реализует A). Неверно говорить:
Но звучит правильно (или, по крайней мере, лучше) сказать:
источник
Я думаю, что и для грамматики, и для конвенции Xable лучше для имен интерфейсов, тогда как IsX, CanX, DoesX лучше для имен свойств.
Из MSDN:
«Назовите логические свойства с помощью утвердительной фразы (CanSeek вместо CantSeek). При желании вы также можете добавить префикс булевых свойств к Is, Can или Has, но только там, где это добавляет значение». http://msdn.microsoft.com/en-us/library/ms229012.aspx
источник
На мой взгляд, вариант «-able» гораздо более читабелен, чем предложенный вами вариант «CanDoSomething», который налагает гораздо больше горбов верблюда.
источник
В Scala
*Able
используется для интерфейсов, ноCan*
используется для шаблона класса типа. По сути, чтобы иметь возможность вызывать определенные методы, неявное значение определенного типа должно существовать в области видимости. Имя этого типа иногда начинается с префиксаCan
.источник
CanBuildFrom
. Это была бы прилагательная фраза. Вариант использования этого класса очень отличается от других классов. Экземпляры этого класса почти никогда не создаются и не разрешаются клиентом - скорее, они доступны в области видимости для определенных типов. Если они доступны для определенного типа, то могут быть вызваны методы, включающие этот тип, помеченные как требующие этого класса типов. Это существует, чтобы предложить механизм расширяемости, более гибкий, чем подтип. Смотрите scala-lang.org/node/114 .