Il modello di disegno composito implementa il comportamento ricorsivo?

6

Il pattern di progettazione Composite ci consente di chiamare un operation() su un nodo 'composito' in una struttura ad albero, e questo operation() verrà chiamato su tutti i figli, i subchildren e così via.

Quando viene invocato operation() di un elemento, è responsabilità chiamare operation() su tutti i suoi figli, e così via. Ogni bambino responsabile di invocare l'operazione sui propri figli diretti.

Capisco perché questo ha una natura ricorsiva . Quando impariamo questo disegno, la parola "ricorsione" è sempre nelle nostre teste.

Ma può essere considerato un "comportamento ricorsivo" nel senso stretto della parola?

Ho sempre pensato che la ricorsione significasse semplicemente un processo in cui 'una funzione si chiama'. ('funzione' o 'metodo' o 'procedura' ecc.)

Tuttavia, nel modello di progettazione Composite, nessun metodo chiama se stesso. Un metodo chiama il metodo con nome identico negli oggetti composti con esso (che servono come "figli") - ma non chiama mai stesso (aka void operation(){ this.operation(); } non succede mai).

Quindi, il modello di progettazione Composite crea un comportamento ricorsivo ? O crea un comportamento simile alla natura della ricorsione ? La mia definizione di ricorsione è errata perché è troppo rigida? In tal caso, come definiresti la ricorsione?

    
posta Aviv Cohn 23.03.2014 - 19:38
fonte

4 risposte

3

Composite crea Tipo di dati ricorsivo che richiede quindi ricorsive funzioni o operazioni per attraversare completamente. In un certo senso Composite crea una struttura ad albero.

Allora sì, Composite ha un comportamento ricorsivo.

    
risposta data 23.03.2014 - 20:00
fonte
1

Il pattern composito è ricorsivo in due dimensioni: si tratta di una struttura dati ricorsiva e il metodo operativo è anche chiamato in modo ricorsivo

Vedi link per una spiegazione dettagliata e altro ancora.

Nota: il metodo Operation () è definito dalla classe e sotto la cappa prende solo un riferimento a un'istanza come argomento, quindi il metodo si chiama in effetti.

    
risposta data 23.03.2014 - 20:00
fonte
1

Per completare le altre risposte, aggiungerò un aspetto storico.

Nella tradizionale definizione CS, la ricorsione significa, come dici tu, "una funzione chiama se stessa". Ma i metodi dei membri dell'oggetto e le funzioni polimorfiche non erano probabilmente ben compresi o addirittura conosciuti al momento della definizione. Ora prendiamo il modello composito:

operation()è(tradizionalmente)ricorsivonelpatternCompositeperchédàl'illusioneauncertolivellodiastrazionecheèuna"funzione che si chiama" (quell'illusione è la chiave perché è un tipo di informazioni nascoste).

Ma in realtà (come hai ben indicato con il tuo esempio di codice void operation(){ this.operation(); } ), sappiamo che operation del composito non è la stessa funzione che si chiama.

Questo è un grande esempio di come l'informatica sia una scienza delle astrazioni . Le definizioni che si applicano a un livello potrebbero non essere applicabili in modo preciso ad altri, ma ciò non significa che improvvisamente si sbagliano.

Gli algoritmi ricorsivi per risolvere i problemi non hanno bisogno di avere una chiamata di funzione stessa, ma spesso lo fanno. Ci sono punti di forza e di debolezza per l'approccio. Potresti usare quell'approccio ricorsivo in una struttura composita al giusto livello di astrazione per risolvere i problemi in modo ricorsivo. Casi di base in ricorsione con Composite sarebbero le classi Leaf. Casi ricorsivi sono ovviamente le classi Composite.

    
risposta data 25.03.2014 - 17:57
fonte
1

Mi piace piuttosto pensare all'elemento Composite come all'aggregatore, piuttosto che all'elemento ricorsivamente definito.

Il punto è che gli elementi contenuti non devono comportarsi allo stesso modo del composito. Non hanno nemmeno bisogno di esporre la stessa funzionalità. Ad esempio, l'elemento composito può riassumere i risultati degli elementi contenuti. Gli elementi contenuti possono semplicemente restituire un valore fisso.

Il fatto che il composito ci permetta di immaginarlo come una struttura ad albero non significa che sia strettamente una ricorsione.

L'esempio di questo articolo sembra più una ricorsione: Modello di disegno composito . Ma l'esempio di questo articolo sembra più un'aggregazione: Lavorare con le collezioni .

    
risposta data 24.06.2015 - 11:45
fonte

Leggi altre domande sui tag