Swift Protokolü Adlandırma Kuralları [kapalı]


53

Temel olarak c # arka planından gelince, ben davranış tanımlayan bir uygulama içermeyen bir nesneyi tanımlamak için "arayüz" terimini kullanmaya alışkınım. C # 'da, arabirim isimleri "I" ile olduğu gibi IEnumerable, vb. Şekilde hazırlamaktır .

Tabii ki, kavram farklı dillerde farklı isimler var. Swift'de aynı konsepte "protokol" denir. Protokoller geliştirirken, protokol için genellikle çok benzer isimlerim var ve onu uygulayan bir sınıf var. Şimdiye kadar, "protokol" kelimesini bu nesnelere c #, kullandığım gibi "#" ile aynı şekilde ekledim EnumerableProtocol.

Hızlı protokoller için adlandırma kuralı hakkında herhangi bir düşüncen var mı?



Genelde bir protokol adında kullanılan terminoloji bir yetenek iletmelidir. Equatablesınıflar, eşit sayılabilir NSCopyingvb akla are delegeler ve veri kaynakları, söz konusu tek istisna, sınıflar kopyalanabilir tarafından edebilir SomethingDelegateya SomethingDataSource. Buradaki ayrım, sahip olma sınıflarının benzer bir şeye sahip olacağı var dataSource: SomethingDataSource, ancak böyle bir şey görmeyeceğinizdir var foo: Equatable.
Ben Leggiero

Yanıtlar:


82

Swift, bu cevabın yazıldığı tarihten bu yana önemli ölçüde olgunlaştı. Tasarım yönergeleri şimdi belirtildi :

  • Bir şeyin ne olduğunu açıklayan protokoller, isimler olarak okunmalıdır (örn. Collection).

  • Bir tarif Protokoller yeteneği eklerini kullanarak adlı olmalıdır able, ibleya da ing(örneğin Equatable, ProgressReporting).

Bunu tespit ettiğin için David James'e teşekkür ederim !

Orijinal cevap

Macar Notasyonu'nın bir türünü kullanmak iyi bir fikir olabilir - tür sisteminin içinde kodlanamayan önemli kavramları göstermek. Bununla birlikte, bazı tanımlayıcı bir protokol anlamındadır olması olan Swift (C #) 'de tip sisteminin bir parçasıdır, ve bu tür herhangi bir önek veya son ek olarak, sadece gürültüye sebep olur. Önekleri veya sonekleri temizle, istisnalar veya olaylar gibi kavramlar için daha iyi bir fikirdir.

Swift için resmi bir stil rehberinin yokluğunda, kendimizle gelmeliyiz veya mevcut rehber veya kodlardan ödünç almalıyız. Örneğin, Kakao için Objective-C tarzı kılavuz bu bölümü içerir:

Sınıf ve Protokol İsimleri

Protokoller davranışlarını nasıl grupladıklarına göre adlandırılmalıdır:

  • Protokollerin çoğu, özellikle herhangi bir sınıfla ilişkilendirilmeyen yöntemleri gruplandırır. Bu protokol türü, protokolün bir sınıfla karıştırılmaması için adlandırılmalıdır. Yaygın olarak yapılan bir kural, bir mermi (“... ing”) formu kullanmaktır:

    NSLocking- Güzel.
    NSLock- Zavallı (bir sınıf için bir isim gibi görünüyor).

  • Bazı protokoller bir dizi ilişkisiz yöntemi gruplandırır (birkaç ayrı küçük protokol oluşturmak yerine). Bu protokoller, protokolün temel ifadesi olan bir sınıfla ilişkilendirilme eğilimindedir. Bu durumlarda, sözleşme protokole sınıfla aynı adı vermektir.

    Bu tür bir protokol örneği, NSObjectprotokoldür. Bu protokol, sınıf hiyerarşisindeki konumu ile ilgili herhangi bir nesneyi sorgulamak, belirli yöntemleri çağırmak ve referans sayısını artırmak veya azaltmak için kullanabileceğiniz yöntemleri gruplandırır. Çünkü NSObjectsınıf Bu yöntemlerin birincil ifadesini sağlayan, protokol sınıfın almıştır.

Bununla birlikte, ikinci noktanın tavsiyesi artık geçerli değildir:

Sınıfların ve protokollerin ad alanı Swift'de bir araya getirildiği için NSObject, Objective-C'deki protokol Swift'de yeniden düzenlendi NSObjectProtocol. ( kaynak )

Burada, …Protocoleki protokolden sınıftan ayırmak için kullanılmıştır.

Swift Standart Kütüphane protokollerini içeren Equatable, Comparableve Printable. Bunlar, Kakao'yu “… ing” formunu kullanmaz, ancak bu türden herhangi bir örneğin belirli bir işlemi desteklemesi gerektiğini ilan etmek için “… mümkün” sonekini kullanır.


Sonuç

Bir protokolün sadece tek bir uygun uygulamaya sahip olduğu birkaç durumda, bir “… Protokol” eki, sınıf ve protokolün aynı adı alabilmesi için bir anlam ifade edebilir. Ancak, bu sadece bu gibi durumlarda sınırlı kalmalıdır.

Aksi takdirde, isim bu protokolün hangi işlemleri içerdiğini yansıtan bir isim olmalıdır. Bir fiilin “… ing” veya “… mümkün” biçimini kullanmak iyi bir başlangıç ​​noktası olabilir ve bu tür adların sınıf adlarıyla çakışması olası değildir.

Adı EquatableProtocololan değil tavsiye ediyoruz . Adı Equatableya Equatingda çok daha iyi olurdu ve herhangi bir sınıfın adı olmasını beklemiyorum Equatable. Bu durumda, Protocolson ek gürültüdür.


6
FooDelegate de yaygındır (en azından neredeyse her zaman protokol olan delegeler için ... belki de her zaman için)
Stripes

3
Swift başına API tasarım kuralları: swift.org/documentation/api-design-guidelines >> Bir şeyin adlar olarak ne okunması gerektiğini tanımlayan protokoller (örneğin Koleksiyon). >> Bir yeteneği tanımlayan protokoller, mümkün, pasif veya ing eklerini kullanarak adlandırılmalıdır (örneğin, Equatable, ProgressReporting).
David James

1
@ amon BluetoothService veya UserDataManager sınıfım için protokolü nasıl isimlendirmeliyim? "... ing" veya "... able" buraya uymuyor ve "Protokol" ekinden, herhangi bir fikirden kaçınmak istiyorum. Api Tasarım Kılavuzuna göre, protokol bu durumda BluetoothService gibi bir isim olmalı, ancak o zaman hangi isme sahip olmalı? BluetoothServiceImpl? Btw. Gördüğüm birçok örnekten sonra, C # "Ben" IAnything, IEquatable, ISmthAware gibi bir ön ek ile en iyi convetion olduğunu düşünüyorum: D
Wojciech Kulik

1
@WojciechKulik Senin durumunda ne iyi isimler olabilir emin değilim. Çoğu, bu protokollerin nasıl kullanılacağına bağlıdır. Ancak,… Servis ve… Yönetici adları bir tür kod kokusu olabilir - bu son eki kaldırırsanız, ad temelde aynıdır. Dikkate alınması gereken bazı isimler: Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon

1
@DeclanMcKenna adlandırma oldukça öznel olabilir ve hangi adın seçileceği her zaman açık değildir. Ancak birçok durumda protokoller, sıkı bir şekilde ele alınmış yetenekleri ifade etmek için kullanılmalıdır (ayrıca arayüz ayrımı ilkesini karşılaştırın).
öğleden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.