淺談Swift中協議命名的規範
在日常的開發中,協議的命名一直是頗耗心力的一件事情,不知道如何具體的給協議命名,所以通常都是XXX+Protocol
的命名規則,雖然不會出錯,但是並不能信達雅的傳達出這個協議的作用,無法程式碼即註釋,可讀性略差。
而關於協議命名這類的問題,其實是沒有一個大一統的觀點的,比如使用tab
還是使用space
來進行縮排,但是這類問題的不同觀點會導致團隊內部出現一些爭執,雖然說沒有一個必然正確的方式,但是在團隊中共享一個約定是非常必要的!保證這種一致性可以提高程式碼的可讀性。
那麼如何去給協議命名呢?原則上只要邏輯自洽即可。在Swift API design guidelines中,有兩種給協議命名的描述:
- Protocols that describe what something is should read as nouns (e.g. Collection).
- Protocols that describe a capability should be named using that suffixes able, ible, or ing(e.g. Equatable, ProgressReporting).
以此來衍生,我們可以總結出以下幾種命名的規則
Something → nouns
如果實現者是某個抽象實體,那麼協議命名以名詞來命名,比如**Sequence
,View
,Repository
。
一個很顯然的例子,就是Swift中的**Array**
, **Set**
這些集合型別,因為它們都具備集合的特性,都屬於**Collection
集合,所以我們給該協議命名的時候,就應該是一個名詞。
swift
extension Array: RandomAccessCollection, MutableCollection {
...
}
Performed by → …ing
如果實現者要去做某些事情,那麼協議命名要以ing
結尾,比如Loading
, Generating
, Coordinating
。
以下是一個以名詞命名的協議:ColorProvider
,它是用來描述顏色內容的一個介面。
swift
protocol ColorProvider {
var foregroundColor: UIColor { get }
var backgroundColor: UICOlor { get }
}
這裡使用名詞命名顯然是有些不合適的,因為這個型別並不是某個抽象實體,而是屬於要去做某些事情的類別,這個型別提供了顏色,所以它應該被命名為**ColorProviding
。同樣的,在我們的專案中,經常會使用到以下型別名:Manager
, Coordinator
以及 Generator
,都是使用動詞轉化為名詞當作型別名,但是如果用作協議命名的話,將動詞轉化為進行時會更加合適:Managing
, Coordinating
, Generating
。
Performed on → …able/ible
如果是對實現者做某些事情,那麼協議命名以able
或者ible
來結尾,比如 Comparable
,Codable
,Cachable
。
以下是Equalble
協議的案例:
swift
public protocol Equaltable {
static func == (lhs: Self, rhs: Self) -> Bool
}
對於該協議的實現者,需要去實現==
方法,來比較自身來判等,所以使用able
結尾是非常合適的。
Performed for → …delegate
如果實現者是為了其他的實體做某些事情,那麼協議命名就以delegate
結尾,比如CardCellActionDelegate
…
這個的案例就多了,因為代理模式是我們使用的設計模式中非常常見的一種,這裡就不做例項了。
Unable to identify → …protocol
實際的開發中還是有很多協議難以分類,既然如此那就不再分類,直接在後面新增protocol即可。
總結
以上的協議命名方式我認為是可以邏輯自洽的,也是我們團隊目前在實行的一種統一的協議命名規範,對於程式碼可讀性肯定是有幫助的。總之,不管命名的方式如何,只要保證邏輯自洽,統一規範都是可以的。