Qual è il nome del linguaggio usando il metodo concatenamento per costruire un oggetto?


21

Uso spesso un modello in cui utilizzo il metodo concatenamento per configurare un oggetto, simile a un Buildero Prototypemodello, ma non creando nuovi oggetti con ogni chiamata di metodo, modificando invece l'oggetto originale.

Esempio:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

Mi chiedo solo se esiste un nome per questo modello e se è considerato un anti-modello, perché sebbene possa leggere più fluentemente, può portare a lunghe catene di metodi.


3
Un'interfaccia fluida è una questione di stile. Se stai scrivendo un'API, fornisci moduli alternativi.
Oded,

1
Per ulteriori discussioni, dai un'occhiata a questa domanda: programmers.stackexchange.com/questions/69519/…
Eric King

@Oded È possibile utilizzare una simile API senza concatenarsi semplicemente facendo ogni chiamata una dichiarazione separata o hai avuto un'altra idea per un'alternativa?
Garrett Hall

@GarrettHall - Certo che è possibile, ma poi finisci per chiamare cose come menu.withStyle("")senza contesto. In questo caso sono necessarie due API.
Oded,

2
@GarrettHall Il punto dell '"interfaccia fluente" è la catena del metodo, che deve essere letta come una frase. In questo senso, la lunga catena del metodo non è considerata negativa. Ma, e qui concordo con Oded, sarebbe meglio fornire la stessa funzionalità in una sintassi più convenzionale. In questo modo, lo sviluppatore può scegliere quale metodo utilizzare.
Eric King

Risposte:


37

Interfaccia fluida

Ho sempre sentito parlare di questo metodo chiamato " interfaccia fluente ", come coniato da Eric Evans (di fama di Domain Driven Design ) e Martin Fowler (di fama di Agile Manifesto ).

Gli svantaggi principali sono la leggibilità (che alcune persone amano e un po 'di odio) e il fatto che in alcuni casi può essere più difficile eseguire il debug perché l'intera catena di azioni può essere considerata una singola affermazione quando si passa attraverso di essa.

Certamente non lo considero un anti-pattern, anche se ho usato la tecnica solo poche volte da solo.


4
Si noti che i sostenitori insistono piuttosto sul fatto che un'interfaccia fluida coinvolge molto più di un semplice concatenamento di metodi, sebbene spesso non sia chiaro cos'altro si intenda con quel termine.
Kilian Foth

È comune che l'intera catena sia considerata una singola affermazione? Mi sembra un problema di debugger progettato male.
Blueberryfields

Non ho trovato un debugger che tratta le catene come una singola affermazione, ma può comunque essere doloroso se sei interessato solo a uno dei metodi verso la fine della catena, in una catena particolare.
vaughandroid

1
Lavoro in C # e il debugger .NET mi consente di entrare nei singoli metodi. Altre lingue, non ne sono così sicuro.
Eric King

1
@KilianFoth Come notato nei commenti della domanda, i metodi concatenati in un'interfaccia fluida dovrebbero essere leggibili quasi come una frase. A volte questo significa che i singoli metodi dovrebbero avere nomi diversi da quelli che altrimenti sarebbero considerati buone pratiche
Izkata

5

Il concatenamento di metodi del genere viene in genere chiamato interfaccia fluida quando vi è un qualche tipo di flusso o rilevabilità nella catena. In alternativa, puoi pensare a un'API come jQuery che si basa fortemente sul concatenamento del metodo come non 'fluente' perché non c'è la stessa enfasi sulla rilevabilità - è più per comodità.

Per il tuo esempio (usando withx, withy) puoi considerarlo una variante del modello Builder perché hai una classe specializzata che, dato un certo stato (chiamate di metodo) sa come restituire un oggetto correttamente configurato.

Questo non è un anti-pattern se usato in modo appropriato.


Che cos'è la scopribilità? La capacità di trovare i metodi necessari tramite il completamento automatico dell'API?
Josiah Yoder,

Non ho familiarità con jQuery. In che modo le loro catene di metodi sono solo per comodità, non per rilevabilità? Perché ci sono così tanti modi per incatenarlo è travolgente anche con il completamento automatico?
Josiah Yoder,

3

se è considerato un anti-pattern,

sicuramente non un anti-pattern. jQuery è probabilmente l'implementazione più utilizzata di questo.

perché sebbene possa leggere più fluentemente, può portare a lunghe catene di metodi

Sì, può, ma qual è l'alternativa? Puoi finire con quasi una semplice frase in inglese, con l'API che ti guida verso ciò che è disponibile e appropriato.


..e ottieni quello che vuoi in 1 riga, invece di 8 - 10. Il che è positivo se stai scrivendo una sola riga in un terminale. È più facile richiamare 1 comando di 10. Poiché è fluente e i metodi hanno nomi descrittivi, è anche più facile da leggere. Purtroppo molto di questo in Python2 non può più essere fatto in Python3 / Python4.
mckenzm,

-3

Si chiama modello "Train Wreck".

(È un anti-pattern ed è contro il codice pulito)

Il modello del "disastro ferroviario" viola la Legge di Demetra .


3
Questo non è lo stesso del metodo concatenato nell'articolo a cui ti colleghi, dove è l'esempio a.getB().getC().doSomething(). Quell'esempio è negativo perché "Il tuo metodo può chiamare metodi direttamente sui propri campi (ma non sui campi dei campi)". Qui, c'è solo 1 oggetto che viene creato e "puoi giocare con i giocattoli che ti sei creato".
Nic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.