Konvensi Penamaan Protokol Swift [ditutup]

53

Berasal dari latar belakang c #, saya terbiasa menggunakan istilah "antarmuka" untuk menggambarkan suatu objek tanpa implementasi yang mendefinisikan perilaku. Di c #, konvensi ini untuk menambahkan nama antarmuka dengan "I", seperti pada IEnumerable, dll.

Tentu saja, konsep tersebut memiliki nama yang berbeda dalam bahasa yang berbeda. Dalam Swift, konsep yang sama disebut "protokol". Ketika saya mengembangkan protokol, saya sering memiliki nama yang sangat mirip untuk protokol dan kelas yang mengimplementasikannya. Sejauh ini, saya telah menambahkan kata "protokol" ke objek-objek ini dengan cara yang sama saya akan menggunakan "I" di c #, seperti pada EnumerableProtocol, dll.

Adakah pemikiran tentang konvensi penamaan untuk protokol dengan cepat?

Michael Daw
sumber
Secara umum terminologi yang digunakan dalam nama protokol harus menyampaikan kemampuan. Equatablekelas dapat disamakan, NSCopyingkelas dapat dengan cara disalin, dll. Satu-satunya pengecualian yang muncul dalam pikiran adalah delegasi dan sumber data, yang merupakan SomethingDelegateatau SomethingDataSource. Saya pikir perbedaannya adalah bahwa kelas pemilik akan memiliki sesuatu seperti var dataSource: SomethingDataSource, tetapi Anda tidak akan melihat sesuatu seperti itu var foo: Equatable.
Ben Leggiero

Jawaban:

82

Swift telah matang secara signifikan di tahun-tahun sejak jawaban ini ditulis. Pedoman desain sekarang menyatakan :

  • Protokol yang menggambarkan sesuatu harus dibaca sebagai kata benda (mis Collection.).

  • Protokol yang menggambarkan kemampuan harus dinamai menggunakan akhiran able, ibleatau ing(misalnya Equatable, ProgressReporting).

Terima kasih kepada David James karena mengetahui ini!

Jawaban Asli

Menggunakan beberapa bentuk Notasi Hongaria dapat menjadi ide yang baik - untuk mewakili konsep penting yang tidak dapat dikodekan dalam sistem tipe. Namun, fakta bahwa beberapa pengenal mengacu pada protokol adalah bagian dari sistem tipe di Swift (dan C #), dan dengan demikian setiap awalan atau sufiks hanya menambah noise. Prefiks atau sufiks yang jelas adalah ide yang lebih baik untuk konsep seperti pengecualian atau peristiwa.

Dengan tidak adanya panduan gaya resmi untuk Swift, kita harus membuat sendiri, atau meminjam dari panduan atau kode yang ada. Misalnya, panduan gaya Objective-C untuk Kakao mengandung bagian ini:

Nama Kelas dan Protokol

Protokol harus dinamai sesuai dengan bagaimana mereka mengelompokkan perilaku:

  • Sebagian besar protokol terkait metode grup yang tidak terkait dengan kelas mana pun secara khusus. Jenis protokol ini harus dinamai sehingga protokol tidak akan bingung dengan kelas. Konvensi umum adalah menggunakan formulir gerund ("... ing"):

    NSLocking- Bagus
    NSLock- Miskin (sepertinya nama untuk kelas).

  • Beberapa protokol mengelompokkan sejumlah metode yang tidak terkait (daripada membuat beberapa protokol kecil yang terpisah). Protokol-protokol ini cenderung dikaitkan dengan kelas yang merupakan ekspresi utama dari protokol. Dalam kasus ini, konvensi adalah untuk memberi protokol nama yang sama dengan kelas.

    Contoh dari protokol semacam ini adalah NSObjectprotokol. Protokol ini mengelompokkan metode yang dapat Anda gunakan untuk menanyakan objek apa pun tentang posisinya di hierarki kelas, untuk membuatnya memohon metode tertentu, dan untuk menambah atau mengurangi jumlah referensi. Karena NSObjectkelas menyediakan ekspresi utama dari metode ini, protokol ini dinamai setelah kelas.

Namun, saran dari poin kedua tidak lagi berlaku:

Karena namespace kelas dan protokol disatukan dalam Swift, NSObjectprotokol di Objective-C dipetakan kembali ke NSObjectProtocoldalam Swift. ( sumber )

Di sini, …Protocolsuffix digunakan untuk mendambug protokol dari kelas.

The Swift Standard Library berisi protokol Equatable, Comparabledan Printable. Ini tidak menggunakan bentuk “… ing” Kakao, tetapi sufiks “… mampu” untuk menyatakan bahwa instance apa pun dari jenis ini harus mendukung operasi tertentu.


Kesimpulan

Dalam beberapa kasus di mana protokol hanya memiliki satu implementasi yang relevan, sufiks "... Protokol" dapat masuk akal sehingga kelas dan protokol dapat memiliki nama yang sama. Namun, ini harus dibatasi hanya untuk kasus-kasus seperti itu.

Kalau tidak, namanya harus berupa kata benda yang mencerminkan operasi apa yang ada dalam protokol ini. Menggunakan bentuk "... ing" atau "... mampu" kata kerja bisa menjadi titik awal yang baik, dan nama-nama seperti itu tidak mungkin bertentangan dengan nama kelas.

Nama EquatableProtocolini tidak dianjurkan . Nama Equatableatau Equatingakan jauh lebih baik, dan saya tidak berharap ada kelas yang memiliki nama Equatable. Dalam hal ini, Protocolsufiks adalah noise.

amon
sumber
6
FooDelegate juga umum (setidaknya untuk delegasi, yang hampir selalu protokol ... mungkin sebenarnya selalu)
Stripes
3
Per pedoman desain API Swift: swift.org/documentation/api-design-guidelines >> Protokol yang menggambarkan sesuatu yang harus dibaca sebagai kata benda (mis. Koleksi). >> Protokol yang menggambarkan kapabilitas harus dinamai menggunakan sufiks yang dapat, ible, atau ing (mis. Equatable, ProgressReporting).
David James
1
@amon bagaimana saya harus memberi nama protokol untuk BluetoothService atau UserDataManager? "... ing" atau "... mampu" tidak cocok di sini dan saya ingin menghindari akhiran "Protokol", ada ide? Menurut Api Design Guidelines, protokol harus dalam hal ini kata benda seperti BluetoothService, tetapi nama apa yang harus diimplementasikan? BluetoothServiceImpl? Btw. setelah banyak contoh yang pernah saya lihat, saya pikir C # memiliki kecocokan terbaik dengan awalan "I" seperti IAnything, IEquatable, ISmthAware: D
Wojciech Kulik
1
@WojciechKulik Saya tidak yakin nama baik apa yang mungkin ada dalam kasus Anda. Banyak tergantung pada bagaimana protokol-protokol itu akan digunakan. Namun, ... Layanan dan ... Nama manajer bisa menjadi semacam bau kode - namanya pada dasarnya sama jika Anda menghapus akhiran itu. Beberapa nama yang perlu dipertimbangkan: Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon
1
Penamaan @DeclanMcKenna bisa sangat subyektif, dan nama yang dipilih tidak selalu jelas. Tetapi dalam banyak kasus protokol harus digunakan untuk mengekspresikan beberapa kemampuan yang tercakup dengan ketat (bandingkan juga prinsip pemisahan antarmuka).
Amon