Соглашения о присвоении имен протоколу Swift [закрыто]


53

Исходя из в основном фона c #, я привык использовать термин «интерфейс» для описания объекта без реализации, определяющей поведение. В c # соглашение заключается в добавлении имен интерфейсов с помощью «I», например IEnumerable, и т. Д.

Конечно, у концепции разные названия на разных языках. В Swift та же концепция называется «протокол». Когда я разрабатываю протоколы, у меня часто бывают очень похожие имена для протокола и класса, который его реализует. До сих пор я добавлял слово «протокол» к этим объектам так же, как я использовал «Я» в c #, как EnumerableProtocolи т. Д.

Любые мысли о соглашении об именовании для протоколов в Swift?



В общем, терминология, используемая в имени протокола, должна передавать способность. Equatableклассы можно приравнять, NSCopyingклассы можно скопировать и т. д. Единственное исключение, которое приходит на ум, - это делегаты и источники данных, которые являются SomethingDelegateили SomethingDataSource. Я думаю, что различие заключается в том, что у классов-владельцев будет что-то подобное var dataSource: SomethingDataSource, но вы не увидите ничего подобного var foo: Equatable.
Бен Легжеро

Ответы:


82

Свифт значительно повзрослел за годы, прошедшие с момента написания этого ответа. Руководство по проектированию теперь заявляет :

  • Протоколы, описывающие что-то , должны читаться как существительные (например Collection).

  • Протоколы , которые описывают возможности должны быть названы с помощью суффиксов able, ibleили ing(например Equatable, ProgressReporting).

Спасибо Дэвиду Джеймсу за то, что он это заметил!

Оригинальный ответ

Хорошей идеей может быть использование некоторой формы венгерской нотации - для представления важных понятий, которые не могут быть закодированы внутри системы типов. Однако тот факт, что некоторый идентификатор ссылается на протокол, является частью системы типов в Swift (и C #), и поэтому любой префикс или суффикс только добавляет шум. Четкие префиксы или суффиксы - лучшая идея для таких понятий, как исключения или события.

В отсутствие официального руководства по стилю для Swift, нам приходится придумывать свои собственные или заимствовать из существующих руководств или кода. Например, руководство по стилю Objective C для Какао содержит этот раздел:

Имена классов и протоколов

Протоколы должны быть названы в соответствии с тем, как они группируют поведение:

  • Большинство протоколов группируют связанные методы, которые не связаны ни с каким конкретным классом. Этот тип протокола должен быть назван так, чтобы протокол не был перепутан с классом. Общепринятым условием является использование формы gerund («... ing»):

    NSLocking- Хороший.
    NSLock- Плохо (кажется, имя для класса).

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

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

Однако рекомендация по второму пункту больше не применима:

Поскольку пространство имен классов и протоколов унифицировано в Swift, NSObjectпротокол в Objective-C переназначается NSObjectProtocolв Swift. ( источник )

Здесь …Protocolсуффикс использовался для устранения неоднозначности протокола от класса.

Стандартная библиотека Swift содержит протоколы Equatable, Comparableи Printable. Они не используют форму «… ing» Какао, а скорее суффикс «... способный», чтобы объявить, что любой экземпляр этого типа должен поддерживать определенную операцию.


Заключение

В некоторых случаях, когда протокол имеет только одну соответствующую реализацию, может иметь смысл суффикс «… Protocol», чтобы класс и протокол могли иметь одно и то же имя. Однако это должно быть ограничено только такими случаями.

В противном случае имя должно быть каким-то существительным, отражающим, какие операции содержит этот протокол. Хорошей отправной точкой может быть использование формы глагола «… ing» или «способный», и такие имена вряд ли будут конфликтовать с именами классов.

Название EquatableProtocolэто не рекомендуется . Имя Equatableили Equatingбыло бы намного лучше, и я не ожидаю, что у какого-либо класса будет имя Equatable. В этом случае Protocolсуффиксом является шум.


6
FooDelegate также распространен (по крайней мере, для делегатов, которые почти всегда являются протоколами ... может быть, на самом деле всегда)
Stripes

3
В соответствии с рекомендациями по разработке API Swift: swift.org/documentation/api-design-guidelines >> Протоколы, описывающие, что что-то следует читать как существительные (например, Коллекция). >> Протоколы, которые описывают возможность, должны быть названы с использованием суффиксов способны, ible или ING (например, Equatable, ProgressReporting).
Дэвид Джеймс

1
@amon как мне назвать протокол для моего класса BluetoothService или UserDataManager? Здесь не подходит "... ing" или "... able", и я хотел бы избежать суффикса "Protocol", есть идеи? Согласно Api Design Guidelines, в этом случае протокол должен быть существительным, подобным BluetoothService, но какое имя должно иметь реализацию? BluetoothServiceImpl? Btw. после многих примеров, которые я видел, я думаю, что C # имеет лучшую конвекцию с префиксом «I», как IAnything, IEquatable, ISmthAware: D
Войцех Кулик

1
@WojciechKulik Я не уверен, какие хорошие имена могут быть в вашем случае. Многое зависит от того, как эти протоколы будут использоваться. Тем не менее, имена ... Service и ... Manager могут быть своего рода запахом кода - имя, в основном, совпадает, если вы удалите этот суффикс. Некоторые имена для рассмотрения: Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon

1
Именование @DeclanMcKenna может стать весьма субъективным, и какое имя выбрать не всегда очевидно. Но во многих случаях протоколы должны использоваться для выражения некоторых ограниченных возможностей (сравните также принцип разделения интерфейса).
Амон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.