Quando programmiamo sul posto di lavoro, ora affrontiamo un problema con i visitatori e le dipendenze tra moduli e progetti.
Supponiamo di avere una classe A in un modulo X. E ci sono sottoclassi B e C nel modulo Y. Ciò significa che il modulo Y dipende dal modulo X. Se vogliamo implementare un modello di visitatore nella gerarchia di classi, quindi introducendo un'interfaccia con l'handle Operazioni e un metodo di accettazione astratto in A, otteniamo una dipendenza dal modulo Y al modulo X, che non possiamo consentire per ragioni architettoniche.
Quello che facciamo è usare un confronto diretto tra i tipi (cioè instanceof
, dato che programmiamo in Java), il che non è soddisfacente.
Le mie domande dovrebbero essere: incontri questo tipo di problema nel tuo lavoro quotidiano (o facciamo scelte architettoniche scadenti) e, in caso affermativo, qual è il tuo approccio per risolvere questo problema?
Ecco un esempio minimale in Java per illustrare il mio punto. Il pacchetto a ha ClassA e l'interfaccia Visitor sulla gerarchia ClassA:
package pkg.a;
public abstract ClassA extends ClassA {
public abstract void accept(ClassAVisitor visitor);
/* other methods ... */
}
package pkg.a;
import pkg.b.ClassB;
import pkg.b.ClassC;
public interface ClassAVisitor {
public abstract void handle(ClassB visitee);
public abstract void handle(ClassC visitee);
}
Il pacchetto b ha le classi concrete che si estendono da ClassA:
package pkg.b;
import pkg.a.ClassAVisitor;
public ClassB extends ClassA {
public void accept(ClassAVisitor visitor) {
visitor.handle(this);
}
}
package pkg.b;
import pkg.a.ClassAVisitor;
public ClassC {
public void accept(ClassAVisitor visitor) {
visitor.handle(this);
}
}
I pacchetti aeb hanno una dipendenza ciclica.