AntonioGanci

Il blog di Antonio Ganci
posts - 201, comments - 420, trackbacks - 31

Togliere la dipendenza circolare tra due oggetti

Supponete di avere due oggetti uno di tipo A e l'altro di tipo B, dove A chiama un metodo di B e viceversa. In pratica esiste una dipendenza circolare tra i due oggetti (il discorso si puo' ampliare facilmente ad n oggetti).

Proviamo a visualizzare tale interazione con un communication diagram (ne avevo già parlato in questo post).

referenza circolare

Come vedete dal disegno il refactoring risulta molto semplice da capire. In pratica creiamo un nuovo oggetto di tipo C che chiama gli oggetti di tipo A e tipo B ed in questo modo abbiamo tolto la referenza circolare.

Non so se esiste già da qualche parte tale refactoring che battezzo: Remove circular dependency.

Print | posted on sabato 18 settembre 2010 20:38 | Filed Under [ Tips ]

Feedback

Gravatar

# re: Togliere la dipendenza circolare tra due oggetti

La dipendenza circolare e' sicuramente indice di un cattivo design..

Il refactoring proposto si richiede per ottenere una riorganizzazione delle competenze prima erroneamente distribuite su due o piu' oggetti trasferendole su di un singolo oggetto deputato a mantenere il controllo (e probabilmente anche lo stato) dell'esecuzione. Le chiamate ai metodi andrebbero trasformate per quanto possibile in chiamate idempotenti.

Ok in ambito locale, ma nel distribuito forse ci sarebbero ulteriori considerazioni da fare nonche' eventuali limitazioni.
21/09/2010 19:44 | MzC_
Gravatar

# re: Togliere la dipendenza circolare tra due oggetti

Lo scenario in cui l'ho applicato era leggermente più complicato in quanto i metodi avevano dei parametri che dipendevano dalle due classi.
In questo caso occorre aggiungere ulteriori messaggi dall'oggetto C verso A e B per ottenere tali parametri.
21/09/2010 21:33 | Antonio Ganci
Gravatar

# re: Togliere la dipendenza circolare tra due oggetti

Generalmente le dipendenze circolari, per lo meno nella mia esperienza, sono dovute a oggetti con troppe responsabilità. Di solito più che aggiungere una classe responsabile di chiamare i due metodi, il refactoring conduce a suddividere una delle due classi, in genere A in C e D in modo che: C --> B --> D
30/09/2010 15:26 | onof
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET