Tag zusammen,
ich habe ein Problem mit dem LoD, also Law of Demeter ( siehe
Wikipedia ).
Situation:
Ich benutze ein MVC, um die Daten von der visuellen Umgebung zu trennen und natürlich um mehrere visuelle Darstellungen für jeden Datensatz zu ermöglichen und dabei auch sicherzustellen das überall die Änderungen vorgenommen werden. Die Factory erstellt dabei für einen Handler die unterschiedlichen Models oder Views, dieser meldet sie dann an das Control an. Die Factory weist ebenso über Properties dem Model konkrete Befehle zu, falls diese für das Model benötigt werden.
So nun haben die Views jeweils noch eine Referenz auf das Model und würden nun bei einem Click auf z.b. einen Add-Button, überprüfen ob ihre Referenz einen Add-Befehl besitzt. Also in etwa so:
Delphi-Quellcode:
procedure TView.Add( Sender: TObject );
begin
if Assigned( Model ) then
begin
if Assigned( Model.AddBefehl ) then
begin
Model.AddBefehl.Execute( Self ); // Verstoß gegen das LoD
end;
end;
end;
Problem hierbei ist, dass ich gegen das LoD verstoße und ich mir noch nicht sicher bin wie ich das lösen soll...
Theorethisch könnte ich im Konstruktur des Models die Befehle übergeben und dann per Hilfsprozedur auf den Befehl zugreifen, jedoch würde das den Konstruktor sprengen. Momentan weise ich die Befehle halt noch über Properties in der Factory zu und direkt im Konstruktor des Models kann ich sie auch nicht erstellen, da das Model nur die allgemeine Befehlsklasse kennen darf.
Hier nochmal ein Beispielauszug aus der Factory:
Delphi-Quellcode:
class function Factory.CreateModel( Handler: THandler ): TModel;
var
Model: TModel;
begin
// Erzeuge Model
Model := TKonkretModel.Create;
Model.AddBefehl := TAddBefehl.Create( Handler );
// Rückgabe
result := Model;
end;
Vll. habt ihr ja ne Idee
MfG Alaitoc
Edit: Unten noch ein Beispiel zum Add-Befehl