Sto cercando di capire DI, ma sembra essere confuso su come le interfacce tra i moduli rimangono disaccoppiate.
Supponiamo che abbia due directory per ciascuno dei moduli A e B
PACCHETTO A
package A
interface InterfaceA {
public function run():Void;
}
e
package A
class ConcreteA implements InterfaceA {
public function run():Void { ... }
}
PACCHETTO B
package B
import A
interface InterfaceB {
public function new(a:InterfaceA);
public function run():Void;
}
e
package B
import A
class ConcreteB implements InterfaceB {
private var a:InterfaceA;
public function new(a:InterfaceA) { this.a = a; }
public function run():Void { this.a.run(); }
}
Potrei usare ConcreteB in un altro modulo come questo
ClientApp
package Client
import A
import B
class Main {
function new():Void {
var b:ConcreteB = new ConcreteB(new ConcreteA());
b.run();
}
}
La mia domanda è, i moduli non sono ora strettamente accoppiati?
Anche se non importa il modulo A in ClientApp (e fare qualcosa come creare un'implementazione concreta di InterfaceA nel modulo B da utilizzare invece), ho ancora bisogno di avere entrambe le cartelle A e B nel mio progetto affinché ClientApp possa compilare correttamente.
Questo accoppiamento sostanzialmente stretto è elevato al livello del modulo? Come dovrei o dovrei mitigarlo?
È mai un problema preoccuparsi che l'InterfaceB nel modulo B abbia una dipendenza del modulo strettamente accoppiato sul modulo A?