2015-08-11 39 views
8

Beynimizi Object Oriented Programming'dan Protocol Oriented Programming'a geçiş yaparken aşağıdakileri nasıl yapabilirim?Protokol Yönlendirmeli Programlama

Model numaralı telefonu temsil eden JSON nesnesinin {created_time, updated_time, type, ...} değerine sahip olduğunu ve bu değerlerin 5 Model nesnesinde yaygın olduğunu varsayalım.

doğru bir protokol aşağıdaki

protocol xxx { 
    var type : String { get } 
    var updatedTime : String { get } 
    var createdTime : String { get } 
    //...// 
} 

gibi her şeyden özelliklerini içerir ve sonra tüm 5 yapılar bu protokol

+0

Sorunuz için teşekkürler ... Bunların hepsini biliyor musunuz? :) –

+1

Tavsiye edeceğim bir şey, her şeyi bir String yapma alışkanlığını bırakmaktır. Bu kullanışlı, ama daha sonra sorunlara neden olmak neredeyse garantilidir. Bir "zaman" ya bir TimeInterval veya bir Tarih olmalıdır. Her yerde Dizeleri kullanmak, insanlar dinamik olarak yazılan dillerden geldiklerinde olan gibi görünüyor, ancak uzun vadede devam etmek sağlıklı bir alışkanlık değil. –

cevap

7

Bunun gayet iyi bir çözüm olduğunu söyleyebilirim uygun hale getirmektir. Alternatif, bu özelliklere sahip bir temel sınıfa sahip olacak ve bu modellerin beş tanesinin de temel sınıftan miras alacağı, ancak burada kalıtımın kullanılmasının özel bir sebebi olmayacaktır.

Bir protokol, bir sınıfın belirli özellikleri veya davranışları olduğunu garanti eden bir "sözleşme" dir. Bana göre, senin örneğin burada çok "sözleşmeli" hissediyor. Tersine, miras, bir "olduğu gibi" ilişkiyi (örneğin, bir Ford otomobilidir) ifade eder. Bana göre bu, “bir” durumdan daha çok bir sözleşme gibi hissediliyor. Tabii ki, ne seçim yanlıştır, ama protokol fikrinizin burada iyi olduğunu düşünün.

+0

Yapıları kullanıyorum çünkü sınıfları kullanamıyorum. Bir yapının mirasa sahip olmadığı için –

+1

Doğru, bu yüzden böyle bir protokol kullanarak yapıları ile kesinlikle doğru seçimdir. Protokol odaklı yaklaşımı, sınıflarla birlikte kullanabileceğimiz bir miras yaklaşımıyla karşılaştıracağımı düşündüm. – ezig

+0

problemi çok gereksiz olacak çünkü her bir yapıda aynı 5 özelliği yapmaya ihtiyacım var –

1

Protokol Yönelimli Programlamanın Konuşması Swift 2, varsayılan uygulamalara izin veren protokol uzantılarına sahiptir. Bu, bunun yerine bir üst sınıf kullanacağınız birçok durumu da değiştirir. Bu durumda

:

// extension of your example protocol 
extension xxx { 
    var type : String { return "a type" } 
    var updatedTime : String { return "00:00" } 
    var createdTime : String { return "00:00" } 
    //...// 
} 

// struct which conforms to it 
struct Astruct: xxx {} 

// using the properties 
Astruct().type 
Astruct().updatedTime 

tüm özellikler ve yöntemler protokol uzantısı tarafından varsayılan bir uygulama varsa herhangi kendinizi sağlamak gerekmez. Ancak bunları yalnızca uygulayarak "geçersiz kılabilirsiniz".

Yani kararınız doğru ve protokolleri olabildiğince sık kullanmalısınız.

Tek büyük dezavantajı, varsayılan uygulamaları açıkça arayabileceğiniz super olmasıdır. Bir geçici çözüm (bkz. Bu answer) protokolü neredeyse gereksiz kılan bir üst sınıf gerektirir.

+0

fakat tüm özellikler varsayılan bir uygulamaya sahip değilse ne olur? yani: diyelim ki var var: dd!Protokolde {get} 'özelliği bu protokolü uygulayan tüm yapıların' let _id: String! 've daha sonra 'var iD: String {get {return _id}}' i içermesi gerekir. 5 yapı. Büyük bir yedek olacak. @Qbyte –

+0

@ Bobj-C Neden protokolü uygulayan tüm türler bir 'let _id: String!' Ve 'var iD: String olmalıdır. Aynı anda {get} Belirli bir probleminiz varsa lütfen açıklayınız. – Qbyte

+0

yapısını init (ingilizce) (: JSON) {...} 'diyelim diyelim ki, 'id' değerini okumak ve '_id' içine koymak istiyorum '_id = JSON [ "kimlik"] '. ve bu yapilandirma protokolü olmasi gerektigi için "var iD: String {get {return _id}}" –