Назви інтерфейсу: префікс "Can-" vs суфікс "-Able"


29

Загальноприйнято використовувати "-able" як суфікс для інтерфейсів, наприклад

Serializable для друку Численні, які можна пити з можливістю зйомки

Я думав, що "Can-" може бути кращим, оскільки він може бути більш описовим. Так, він більш багатослівний і додає шуму назви інтерфейсу. Зокрема, можна використовувати пасивні дієслова.

Напр. 1 означає, що стрілянина означає, що об’єкт здатний стріляти (пістолет може реалізувати це), або це означає, що в нього можна стріляти (цільова дошка може це реалізувати). З префіксом "Can-" перший буде "CanShoot", а другий - "CanBeShotAt" або "CanShootAt".

Наприклад, документ "CanBePrinted" та принтер "CanPrint"

Або ми повинні дотримуватися "-Able" і нехай документація забезпечує контекст?

Будь-які думки.


Людина, використовуй "-able". Період.
Тулен Кордова

2
Використовуйте обидва дляclass Cannibal implements Can, Able {}
Томас Едінг

Відповіді:


18

Можливо, ви хочете Is-sposob?

Деякі приклади з .Net:

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

Здається, не існує єдиного стандарту. Ідіть із тим, що добре читається.

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

EDIT: Як зазначалося, питання стосувалося інтерфейсів, а не властивостей.

У цьому випадку я не можу знайти жодного інтерфейсу з назвою Can-. Інтерфейси, як правило, завжди зручні для використання. Я погодився б з цією термінологією. Метод може запитувати як параметр a ISerializable objectабо IPrintable document. Просити те ICanBeSerialized objectчи інше ICanBePrinted documentдуже незручно читати.

З іншого боку, Принтер, я б запропонував просто зателефонувати в інтерфейс IPrinter. Ваш метод буде запитувати про IPrinter device.

Прочитайте підпис методу нижче вголос. (Особисто я вважаю префікс "Я" мовчазним.) Чи добре він читається? Це правильно звучить?

void PrintDocument(IPrinter device, IPrintable document)
{
    device.Print(document)
}

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, то його можна обдурити чимось іншим; може - має на увазі активну роль, тобто якщо щось може бути Фобаром, то воно може підробляти щось інше. Або з іншого кута: якщо A може foobar B, то A.canFoobar()і B is Foobarable.

З точки зору виразності OOP я б асоціював предикати з методами чи властивостями, тоді як іменники - це класи чи інтерфейси. Так:

instance.canFoobar();

class Something implements Foobarable { ... }

7

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

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

Якщо ви вважаєте, що це не проблема у вашому випадку, то це чудово, і я б рекомендував використовувати інші критерії, щоб вибрати умову іменування. У деяких випадках, наприклад, в нашій команді, ми віддаємо перевагу ідентифікаторам, які розрізняють якнайменше натискань клавіш.

Окрім цього, я б рекомендував використовувати конвенцію про іменування, яка робить ваш код найбільш зрозумілим для тих, хто працює над проектом. Поговоріть у вашій команді. Не існує правильного чи неправильного як такого. Просто конвенції, які працюють, і конвенції, які працюють менше.

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


1
+1. Мої міркування були б такими ж, спочатку поставте керуюче дієслово, щоб полегшити пошук / пошук / сортування в IDE.
пап

1
Мало того, що інтеліссенс працює не тільки таким чином, але й робить скануючий текст людини, префікси роблять ваш код менш читабельним
jk.

7

Очевидно, що префікс і суфікс - це майже очевидний вибір для різних типів дій, точніше, різних напрямків дії.

Поточне використання та налаштування можуть бути суперечливими через багато причин.

Дія виконується по об'єкту:
CanShoot -> Вона стріляє (в) що - то
CanFly -> Він летить
CanChange -> Це змінює

Дія виконується на об’єкті:
Читаемая -> Ви можете прочитати З її
записом -> Ви можете написати (до) Друкувати
-> Ви можете роздрукувати

Хоча це може не бути правилом або навіть обов'язково логічним, воно допомагає прийняти умову і підтримувати послідовність використання в назвах змінних.


4

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


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

На мою думку, варіант, що «підходить», набагато читає, ніж запропонований «CanDoSomething», який накладає набагато більше горбиків верблюдів.


1
і Can- це більше назва методу
храповик виродка

Назва власності - див. MSDN. Назви методу повинні бути "дієслова або дієслівні фрази". Крім того, що не так з кількома горбами?
Денні Варод

0

У Scala *Ableвикористовується для інтерфейсів, але Can*використовується для типового шаблону класу. По суті, щоб мати можливість викликати певні методи, імпліцитне значення певного типу повинно існувати в області застосування. Ім'я цього типу іноді має префікс Can.


Can * - це не гарне ім’я для класу. Цитата з MSDN: "Робіть класи імен, інтерфейси та типи значень із іменниками, іменниковими фразами або іноді прикметниковими фразами, використовуючи обкладинку Pascal", посилання: msdn.microsoft.com/en-us/library/ms229040.aspx Добре ім'я для клас буде Document, прийнятна назва - Printable.
Денні Варод

Один із прикладів мови Scala - це CanBuildFrom. Це була б прикметникова фраза. Приклад використання цього класу сильно відрізняється, ніж у інших класів. Примірники цього класу майже ніколи не будуються і не вирішуються клієнтом - скоріше, вони доступні в області застосування для певних типів. Якщо вони доступні для певного типу, тоді можна викликати методи, що включають цей тип, позначені як вимагати цього класу. Це існує, щоб запропонувати механізм розширення більш гнучким, ніж підтипу. Див. Scala-lang.org/node/114 .
axel22

Я лише пригадую використання прикметникових фраз для макетних класів, що реалізують інтерфейси для одиничних тестів - оскільки вони не мали реальної ролі.
Денні Варод
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.