스위프트 프로토콜 명명 규칙


53

주로 C # 배경에서 비롯된 동작을 정의하는 구현이없는 개체를 설명하기 위해 "인터페이스"라는 용어를 사용했습니다. c #에서 규칙은 IEnumerable등에서 처럼 인터페이스 이름 앞에 "I"를 붙여야합니다 .

물론이 개념은 언어마다 이름이 다릅니다. Swift에서는 동일한 개념을 "프로토콜"이라고합니다. 프로토콜을 개발할 때 프로토콜 이름과 프로토콜을 구현하는 클래스의 이름이 매우 비슷합니다. 지금까지 저는 C #에서 "I"를 사용하는 것과 같은 방식으로 "protocol"이라는 단어를 이러한 개체에 추가했습니다 EnumerableProtocol.

프로토콜의 명명 규칙에 대한 생각이 있습니까?



일반적으로 프로토콜 이름에 사용 된 용어는 기능을 전달해야합니다. Equatable클래스는 동일시 할 수있는 NSCopying등 마음입니다 대의원 및 데이터 소스로 제공되는 유일한 예외 클래스는 복사에 의해 수 SomethingDelegate또는 SomethingDataSource. 나는 소유 클래스가 같은 것을 가질 것이라고 생각 var dataSource: SomethingDataSource하지만, 당신은 같은 것을 볼 수는 없습니다 var foo: Equatable.
Ben Leggiero

답변:


82

이 답변이 작성된 이후 몇 년 동안 Swift는 크게 발전했습니다. 설계 지침서에 다음과 같이 명시되어 있습니다 .

  • 무언가 를 명사로 읽어야 하는 것을 설명 하는 프로토콜 (예 :) Collection.

  • 설명 프로토콜 기능이 접미사를 사용하여 이름을 지정해야합니다 able, ible또는 ing(예를 들어 Equatable, ProgressReporting).

이것을 발견해 주신 David James 에게 감사합니다 !

원래 답변

헝가리어 표기법의 일부 형식을 사용하는 것이 좋습니다. 유형 시스템 내부에서 인코딩 할 수없는 중요한 개념을 나타내는 것입니다. 그러나, 어떤 식별자가 프로토콜을 지칭한다는 사실 이다 스위프트 (및 C 번호)의 입력 시스템의 일부분과 같은 임의의 접두사 또는 접미사로서 만 노이즈를 추가한다. 예외 또는 이벤트와 같은 개념에는 명확한 접두사 또는 접미사가 더 좋습니다.

Swift를위한 공식적인 스타일 가이드가 없다면, 우리는 자체 가이드를 만들거나 기존 가이드 나 코드에서 빌려야합니다. 예를 들어, Cocoa 용 Objective-C 스타일 안내서에는 다음 섹션이 포함되어 있습니다.

클래스 및 프로토콜 이름

프로토콜은 동작을 그룹화하는 방법에 따라 이름을 지정해야합니다.

  • 대부분의 프로토콜은 특정 클래스와 관련되지 않은 관련 메소드를 그룹화합니다. 이 프로토콜 유형은 프로토콜이 클래스와 혼동되지 않도록 이름을 지정해야합니다. 일반적인 규칙은 gerund ( "... ing") 형식을 사용하는 것입니다.

    NSLocking- 좋은.
    NSLock– 나쁨 (강의 이름처럼 보입니다).

  • 일부 프로토콜은 여러 개의 별개의 작은 프로토콜을 만드는 대신 관련되지 않은 여러 방법을 그룹화합니다. 이러한 프로토콜은 프로토콜의 주요 표현 인 클래스와 연관되는 경향이 있습니다. 이 경우 규칙은 프로토콜과 클래스 이름을 동일하게 지정하는 것입니다.

    이러한 종류의 프로토콜의 예는 NSObject프로토콜입니다. 이 프로토콜은 클래스 계층에서의 위치에 대한 객체를 쿼리하고 특정 메서드를 호출하고 참조 횟수를 늘리거나 줄이는 데 사용할 수있는 메서드를 그룹화합니다. 때문에 NSObject클래스는 이러한 방법의 주요 표현을 제공하는 프로토콜은 클래스의 이름을 따서 명명된다.

그러나 두 번째 요점의 조언은 더 이상 적용되지 않습니다.

클래스와 프로토콜의 네임 스페이스가 Swift에서 통합되었으므로 NSObjectObjective-C 의 프로토콜 NSObjectProtocol이 Swift에서 다시 매핑됩니다 . ( 소스 )

여기서 …Protocol접미사는 프로토콜을 명확하게하기 위해 사용되었습니다.

스위프트 표준 라이브러리는 프로토콜을 포함하고 Equatable, Comparable하고 Printable. 이들은 Cocoa“… ing”형식을 사용하지 않고“… able”접미사를 사용하여이 유형의 인스턴스가 특정 작업을 지원해야한다고 선언합니다.


결론

프로토콜에 하나의 관련 구현 만있는 경우에는“… 프로토콜”접미사가 의미가 있으므로 클래스와 프로토콜의 이름이 동일 할 수 있습니다. 그러나 이는 그러한 경우에만 제한되어야합니다.

그렇지 않으면 이름은이 프로토콜에 포함 된 작업을 반영하는 명사 여야합니다. 동사의“… ing”또는“… able”형식을 사용하는 것이 좋은 출발점이 될 수 있으며 이러한 이름은 클래스 이름과 충돌하지 않을 것입니다.

이름 EquatableProtocol권장되지 않습니다 . 이름 Equatable이나 Equating훨씬 나아질 것이며 클래스가 이름을 갖기를 기대하지 않습니다 Equatable. 이 경우 Protocol접미사는 잡음입니다.


6
FooDelegate도 일반적입니다 (적어도 항상 프로토콜 인 델리게이트의 경우 거의 항상 프로토콜
Stripes

3
Swift API 설계 지침 : swift.org/documentation/api-design-guidelines >> 명사 (예 : 콜렉션)로 읽어야 할 내용을 설명하는 프로토콜. >> 기능을 설명하는 프로토콜은 가능한 접미사, ible 또는 ing (예 : Equatable, ProgressReporting)을 사용하여 이름을 지정해야합니다.
David James

1
@amon 클래스 BluetoothService 또는 UserDataManager의 프로토콜 이름을 어떻게 지정해야합니까? "... ing"또는 "... able"은 여기에 맞지 않으며 "Protocol"접미사를 피하고 싶습니다. 어떤 아이디어? Api Design Guidelines에 따르면이 경우 프로토콜은 BluetoothService와 같은 명사 여야하지만 어떤 이름을 구현해야합니까? BluetoothServiceImpl? Btw. 내가 본 많은 예제 후에, C #은 IAnything, IEquatable, ISmthAware와 같은 "I"접두사를 가진 최고의 대류를 가지고 있다고 생각합니다 : D
Wojciech Kulik

1
@WojciechKulik 나는 당신의 경우에 어떤 좋은 이름이 있는지 잘 모르겠습니다. 이러한 프로토콜의 사용 방법에 따라 다릅니다. 그러나… 서비스 및… 관리자 이름은 일종의 코드 냄새 일 수 있습니다. 접미사를 제거하면 이름은 기본적으로 동일합니다. 고려해야 할 일부 이름 : Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon

1
@DeclanMcKenna 이름 지정은 상당히 주관적 일 수 있으며 선택할 이름이 항상 분명하지는 않습니다. 그러나 많은 경우에 프로토콜을 사용하여 엄밀한 범위의 기능을 표현해야합니다 (인터페이스 분리 원칙과 비교).
amon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.