7

Sono andato avanti e indietro tra C# e Java negli ultimi 8 anni.Usi il modello Metodo del modello nei linguaggi di programmazione con chiusure/delegati/puntatori di funzione?

Una cosa che mi colpisce è che ho completamente smesso di utilizzare il modello di progettazione "Metodo modello" in C#. In realtà, in C# sono arrivato a pensare a questo modello come a un anti-modello.

http://en.wikipedia.org/wiki/Template_method_pattern

Tornando a Java, trovo il modello è vivo e vegeto. Continuo a pensare che abbia un aspetto antico, ma mi rendo conto che non c'è altro modo per farlo in java. Anche Java sembra antiquato;)

Dato che questo sta per accadere comunque, perché è un antipattern?

  • Un sacco di volte che utilizza la gerarchia di ereditarietà per "le ragioni sbagliate".
  • Le classi base hanno la tendenza a essere disseminate di tutti i tipi di codice non correlato.
  • Ti costringe a bloccare il design, spesso molto presto nel processo di sviluppo. (Blocco prematuro in molti casi)
  • Cambiare questo in una fase successiva diventa solo sempre più difficile.

Quindi con chiusure/delegati/puntatori di funzione, si passa di solito a una funzione anziché a una sottoclasse.

Ma torniamo alla domanda:

Se la vostra lingua ha le chiusure/delegati/funzione, si usa il Template Method, e quando?

risposta

4

Quando ho usato Java, sì. Ma per le lingue con "chiusure/delegati/funzioni", Lua nel mio caso, no non lo faccio più, invece mi sono sempre più inclinato verso decoration pattern per la maggior parte delle mie esigenze.

3

Sì, utilizzo sempre il metodo di modello, nel linguaggio di programmazione D. Chiusure, delegati e puntatori di funzioni sono per loro natura strettamente accoppiati alla classe base. Questa è una buona cosa quando vuoi questo accoppiamento lento. D'altra parte, a volte i comportamenti che stai personalizzando sono per loro natura strettamente accoppiati alla classe base. Tali comportamenti sarebbero inutili praticamente in qualsiasi altro contesto. Nei casi in cui questo accoppiamento è necessario, il modello di metodo del modello è il modo più semplice e pulito per esprimerlo.

Un semplice test è che si dovrebbe sempre usare la strategia/chiusure/delegati/puntatori a funzione se la comunicazione tra la classe base e il comportamento personalizzabile è a senso unico, vale a dire la classe base chiama il comportamento personalizzabile e il gioco è fatto. Se il comportamento personalizzabile richiede un riferimento alla classe base in modo che possa invocare metodi, ecc., Allora il modello di metodo del modello è spesso il modo più semplice di procedere.

+0

È interessante leggere la risposta. Potresti dare un esempio di dove il modello del metodo template è "assolutamente" il migliore, in particolare dove l'accoppiamento è buono ?? L'accoppiamento presunto è sempre male! – rpattabi

+0

@ragu: il punto non è se l'accoppiamento è buono o cattivo. Il punto è se è necessario o non necessario. Se è necessario, allora IMHO il modo più semplice per esprimerlo è il metodo template. – dsimcha

+0

Capisco che punti per rispondere alla domanda in mano. La mia domanda è generica. Per me l'accoppiamento in modello è un effetto collaterale negativo. Qualche esempio di accoppiamento è buono? – rpattabi

2

io aggiungo di più una risposta mentre sto rivisitando questa discussione:

Il pattern Template Method è meglio che il modello di strategia quando le politiche si sta personalizzare il vostro oggetto base con necessità di conoscere l'un l'altro e può avere senso solo in un sottoinsieme molto limitato di tutte le combinazioni possibili. Ad esempio, supponiamo che la tua classe base abbia una funzione concreta doIt() e ganci beforeDoIt(), progettata per consentire l'inizializzazione dei criteri e afterDoIt(), progettata per consentire alle politiche di ripulire se stessi.Non si vorrebbe impostare questi comportamenti in modo indipendente perché hanno senso solo se abbinati.