2015-08-11 5 views
8

Mentre trasferiamo il nostro cervello da Object Oriented Programming a Protocol Oriented Programming come posso fare quanto segue?Programmazione a protocollo

diciamo che ho un oggetto JSON che rappresenta Model ha {created_time, updated_time, type, ...} e quei valori sono comuni in 5 oggetti del modello.

è giusto per fare un protocollo contiene tutte le proprietà di cui sopra, come il seguente

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

e poi tutte le 5 le strutture sono conformi a questo protocollo

+0

upvote per la tua domanda..come fai a sapere di questi tutto ?? :) –

+1

Una cosa che consiglierei è di abbandonare l'abitudine di fare di tutto una stringa. È conveniente, ma è quasi certo che causerà problemi in seguito. Un "tempo" dovrebbe essere un TimeInterval o una Data. Usare le stringhe ovunque sembra essere quello che succede quando le persone provengono da linguaggi tipizzati dinamicamente, ma non è un'abitudine salutare mantenere a lungo termine. –

risposta

7

direi che è una perfetta buona soluzione. L'alternativa sarebbe avere una classe base con quelle proprietà e avere tutti e cinque di questi modelli ereditati dalla classe base, ma non c'è alcun motivo particolare per usare l'ereditarietà qui.

Un protocollo è solo un "contratto" che garantisce che una classe abbia determinate proprietà o comportamenti. Per me, il tuo esempio qui sembra molto "contrattuale".

Al contrario, l'ereditarietà implica una relazione "è-a" (ad esempio, una Ford è un'auto). Per me, questo sembra più un contratto che un caso "è-a". Naturalmente, nessuna delle due opzioni è sbagliata, ma pensa che la tua idea del protocollo sia buona.

+0

dal momento che sto usando le strutture non posso usare le classi. perché una struttura non ha ereditarietà –

+1

Giusto, quindi con le strutture, l'utilizzo di un protocollo come questo è sicuramente la scelta giusta. Ho pensato di mettere a confronto l'approccio orientato al protocollo con un approccio di ereditarietà che si potrebbe usare con le classi. – ezig

+0

il problema è che sarà molto ridondante dal momento che ho bisogno di fare le stesse 5 proprietà in ogni struttura –

1

Parlare di programmazione orientata ai protocolli Swift 2 ha estensioni di protocollo che consentono implementazioni predefinite. Questo sostituisce anche molti casi in cui si usa invece una superclasse.

In questo caso:

// 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 

se tutte le proprietà ei metodi hanno un'implementazione di default per l'estensione del protocollo non si dispone di fornire qualsiasi te stesso. Tuttavia puoi "sostituirli" solo implementandoli.

Quindi la tua decisione è giusta e dovresti usare i protocolli il più spesso possibile.

L'unico grande inconveniente è che non esiste uno super in cui è possibile chiamare esplicitamente le implementazioni predefinite. Una soluzione alternativa (vedere questo answer) richiederebbe una superclasse che rende il protocollo quasi ridondante.

+0

ma cosa succede se tutte le proprietà non hanno un'implementazione predefinita? io: diciamo che ho 'var iD: String!{get} 'proprietà nel protocollo tutte le strutture che implementano questo protocollo devono avere' let _id: String! 'e in seguito' var iD: String {get {return _id}} 'immagina di avere 5 proprietà nel Protocollo e 5 strutture. Sarà un enorme ridondante. @Qbyte –

+0

@ Bobj-C Perché tutti i tipi che implementano il protocollo devono avere un 'let _id: String!' E 'var iD: String! {get} 'allo stesso tempo? Se hai un problema specifico, spiegalo ulteriormente. – Qbyte

+0

diciamo l'init della struct come il seguente 'init (dictionary: JSON) {...}' quindi se voglio leggere il valore 'id' e metterlo in' _id' sarà come '_id = JSON [ "id"] '. e poiché questo struct implementa il protocollo deve avere 'var iD: String {get {return _id}}' –