Estensione contro la delega

4

Sto usando Swift e mi sto interrogando sui concetti di Estensione e delegazione . Recentemente ho trovato un caso in cui uno di questi due concetti potrebbe essere applicato. Ciò ha ricordato il principio della "composizione sull'ereditarietà", che insegna che una relazione "ha-a" può essere preferita a una relazione "è-a".

Ho riscontrato un caso in cui è sempre un oggetto di un tipo specifico che dipende da un oggetto che conforma un determinato protocollo, consentendo quindi l'utilizzo sia di Extension che di Delega.

Ad esempio, ho un UIViewController che dipende da una sottoclasse di UIView. Diciamo che adottiamo il seguente protocollo:

protocol ViewInteraction {
  func interact()
}

Questo protocollo sarà conforme alla sottoclasse UIView, ad esempio InteractedView . E qualsiasi UIViewController potrebbe dover interagire con questo InteractedView .

In questi tipi di situazioni, quale è un buon valore predefinito: il pattern di delega o il pattern di estensione? Cioè, dovrei usare lo schema Delega - lasciare che InteractedView lo rispetti e lasciare che la sottoclasse UIViewController manipoli una proprietà ViewInteraction - o dovrei seguire il modello Estensione ed estendere UIViewController per conformare il ViewInteraction protocollo (e chiama InteractedView )?

    
posta Vince 10.02.2016 - 15:46
fonte

1 risposta

3

Se ciascun controller di visualizzazione deve interagire con una diversa ViewInteraction, la delega è la scelta più ovvia. Se tutti i controller di vista devono interagire con la stessa (globale) ViewInteraction, o se ViewInteraction viene passato come parametro di un particolare metodo e utilizzato solo lì, allora l'estensione potrebbe essere migliore.

Alcune cose da tenere a mente. I metodi di estensione sono essenzialmente gli stessi della scrittura di funzioni libere. Ad esempio, vedi quanto segue:

class A {
}

extension A {
    func b() { print(self) }
}

func c(a: A) { print(a) }

L'unica differenza tra chiamare myA.b() e c(myA) è la sintassi. Non fraintendermi, non sto cercando di sminuire le estensioni. Questo cambiamento di sintassi può essere un grosso problema, specialmente se si concatenano metodi. ( a.b().c(d) è molto più facile da leggere di c(b(a), d) )

Tenendo presente questo, si spera che possa aiutarti a prendere una decisione.

    
risposta data 01.03.2016 - 03:49
fonte

Leggi altre domande sui tag