Các quy ước đặt tên giao thức Swift [đã đóng]


53

Đến từ nền tảng chủ yếu là c #, tôi đã quen với việc sử dụng thuật ngữ "giao diện" để mô tả một đối tượng không có triển khai xác định hành vi. Trong c #, quy ước là đặt trước tên giao diện bằng "I", như trong IEnumerable, v.v.

Tất nhiên, khái niệm này có tên khác nhau trong các ngôn ngữ khác nhau. Trong Swift, khái niệm tương tự được gọi là "giao thức". Khi tôi đang phát triển các giao thức, tôi thường có các tên rất giống nhau cho giao thức và một lớp thực hiện nó. Cho đến nay, tôi đã thêm từ "giao thức" vào các đối tượng này giống như cách tôi sử dụng "I" trong c #, như trong EnumerableProtocol, v.v.

Bất kỳ suy nghĩ về một quy ước đặt tên cho các giao thức trong swift?



Nói chung, thuật ngữ được sử dụng trong một tên giao thức sẽ truyền đạt một khả năng. Equatablecác lớp có thể được đánh đồng, NSCopyingcác lớp có thể được sao chép, v.v ... Ngoại lệ duy nhất xuất hiện trong đầu là các đại biểu và nguồn dữ liệu, SomethingDelegatehoặc là SomethingDataSource. Tôi nghĩ rằng điểm khác biệt là các lớp sở hữu sẽ có thứ gì đó giống như var dataSource: SomethingDataSource, nhưng bạn sẽ không thấy thứ gì đó như thế var foo: Equatable.
Ben Leggiero

Câu trả lời:


82

Swift đã trưởng thành đáng kể trong những năm kể từ khi câu trả lời này được viết. Các hướng dẫn thiết kế hiện nay :

  • Các giao thức mô tả những gì nên đọc là danh từ (ví dụ Collection).

  • Giao thức mô tả một khả năng nên được đặt tên bằng cách sử dụng hậu tố able, iblehay ing(ví dụ Equatable, ProgressReporting).

Cảm ơn bạn David James đã phát hiện ra điều này!

Câu trả lời gốc

Sử dụng một số dạng Ký hiệu Hungary có thể là một ý tưởng hay - để thể hiện các khái niệm quan trọng không thể được mã hóa bên trong hệ thống loại. Tuy nhiên, thực tế là một số định danh đề cập đến một giao thức một phần của hệ thống loại trong Swift (và C #), và do đó, bất kỳ tiền tố hoặc hậu tố nào cũng chỉ thêm tiếng ồn. Xóa các tiền tố hoặc hậu tố là một ý tưởng tốt hơn cho các khái niệm như ngoại lệ hoặc sự kiện.

Trong trường hợp không có hướng dẫn phong cách chính thức cho Swift, chúng tôi phải tự tìm ra hoặc mượn từ các hướng dẫn hoặc mã hiện có. Ví dụ: hướng dẫn kiểu Objective-C cho Ca cao chứa phần này:

Tên lớp và giao thức

Các giao thức nên được đặt tên theo cách họ hành vi nhóm:

  • Hầu hết các phương thức liên quan đến nhóm giao thức không liên quan đến bất kỳ lớp nào nói riêng. Loại giao thức này nên được đặt tên để giao thức không bị nhầm lẫn với một lớp. Một quy ước phổ biến là sử dụng một hình thức gerund (trực tuyến ... ing):

    NSLocking- Tốt.
    NSLock- Nghèo (có vẻ như là một tên cho một lớp học).

  • Một số giao thức nhóm một số phương thức không liên quan (thay vì tạo một số giao thức nhỏ riêng biệt). Các giao thức này có xu hướng được liên kết với một lớp là biểu thức chính của giao thức. Trong những trường hợp này, quy ước là cung cấp cho giao thức cùng tên với lớp.

    Một ví dụ về loại giao thức này là NSObjectgiao thức. Giao thức này nhóm các phương thức mà bạn có thể sử dụng để truy vấn bất kỳ đối tượng nào về vị trí của nó trong hệ thống phân cấp lớp, để làm cho nó gọi các phương thức cụ thể và để tăng hoặc giảm số tham chiếu của nó. Bởi vì NSObjectlớp cung cấp biểu thức chính của các phương thức này, giao thức được đặt tên theo lớp.

Tuy nhiên, lời khuyên của điểm thứ hai không còn được áp dụng:

Vì không gian tên của các lớp và giao thức được thống nhất trong Swift, NSObjectgiao thức trong Objective-C được ánh xạ lại NSObjectProtocoltrong Swift. ( nguồn )

Ở đây, …Protocolhậu tố đã được sử dụng để phân tán giao thức khỏi lớp.

Các Swift thư viện chuẩn chứa các giao thức Equatable, ComparablePrintable. Những thứ này không sử dụng hình thức Cướp bóc của Cốt-lô, mà thay vào đó là hậu tố có thể ăn được của Cướp bắp để tuyên bố rằng bất kỳ trường hợp nào thuộc loại này phải hỗ trợ một hoạt động nhất định.


Phần kết luận

Trong một vài trường hợp trong đó một giao thức chỉ có một triển khai có liên quan, hậu tố Giao thức Giao thức có thể có ý nghĩa để lớp và giao thức có thể có cùng tên. Tuy nhiên, điều này chỉ nên giới hạn trong những trường hợp như vậy.

Mặt khác, tên nên là một số danh từ phản ánh những hoạt động của giao thức này. Sử dụng một hình thức và một số động từ có thể là một động từ có thể là một điểm khởi đầu tốt và những cái tên như vậy không có khả năng xung đột với tên lớp.

Tên EquatableProtocolkhông recommendable . Tên Equatablehoặc Equatingsẽ tốt hơn nhiều, và tôi không mong đợi bất kỳ lớp nào có tên Equatable. Trong trường hợp này, Protocolhậu tố là tiếng ồn.


6
FooDelegate cũng rất phổ biến (ít nhất là đối với các đại biểu, hầu như luôn luôn là giao thức ... có thể thực sự luôn luôn như vậy)
Sọc

3
Hướng dẫn thiết kế API theo Swift: swift.org/documentation/api-design-guferences >> Các giao thức mô tả những gì nên đọc dưới dạng danh từ (ví dụ: Bộ sưu tập). >> Các giao thức mô tả một khả năng nên được đặt tên bằng cách sử dụng các hậu tố có thể, ible hoặc ing (ví dụ: Equitable, ProgressReporting).
David James

1
@amon tôi nên đặt tên giao thức cho lớp BluetoothService hoặc UserDataManager như thế nào? "... ing" hoặc "... có thể" không phù hợp ở đây và tôi muốn tránh hậu tố "Giao thức", có ý tưởng nào không? Theo Nguyên tắc thiết kế Api, giao thức nên trong trường hợp này là một danh từ như BluetoothService, nhưng tên nào nên được thực hiện sau đó? BluetoothServiceImpl? Btw. sau nhiều ví dụ tôi đã thấy, tôi nghĩ C # có sự thèm muốn tốt nhất với tiền tố "I" như IAnything, IEquitable, ISmthAware: D
Wojciech Kulik

1
@WojciechKulik Tôi không chắc tên nào tốt trong trường hợp của bạn. Rất nhiều phụ thuộc vào cách các giao thức sẽ được sử dụng. Tuy nhiên, tên của Service Service và Trình quản lý có thể là một loại mùi mã - tên về cơ bản là giống nhau nếu bạn loại bỏ hậu tố đó. Một số tên cần xem xét: Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRep repository, UserDataWriting, UserDataProtocol.
amon

1
Việc đặt tên @DeclanMcKenna có thể trở nên khá chủ quan, và việc chọn tên nào không phải lúc nào cũng rõ ràng. Nhưng trong nhiều trường hợp, các giao thức nên được sử dụng để thể hiện một số khả năng có phạm vi chặt chẽ (so sánh với nguyên tắc phân tách giao diện).
amon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.