Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Konflikt mit LoD, bei MVC + Factory + Command Pattern (https://www.delphipraxis.net/140881-konflikt-mit-lod-bei-mvc-factory-command-pattern.html)

Alaitoc 28. Sep 2009 08:24


Konflikt mit LoD, bei MVC + Factory + Command Pattern
 
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 :-D

MfG Alaitoc

Edit: Unten noch ein Beispiel zum Add-Befehl

Uwe Raabe 28. Sep 2009 08:33

Re: Konflikt mit LoD, bei MVC + Factory + Command Pattern
 
Das Problem scheint mir, daß der Execute-Befehl einen TView als Parameter mitbekommt. Wozu braucht er den denn?

Wenn der View unbedingt etwas von dem mitbekommen soll, was im Execute passiert, kann man das auch über Events oder ein Observer-Pattern lösen. Das hätte ncoh den Vorteil, daß andere Views auch daran beteiligt werden.

Alaitoc 28. Sep 2009 08:41

Re: Konflikt mit LoD, bei MVC + Factory + Command Pattern
 
Ah moment, hätte ich wohl auch noch posten sollen...

Delphi-Quellcode:
procedure TAddBefehl.Execute( View: TView);
var
  i: Integer;
begin
  If Assigned( View ) and Assigned( HandlerReferenz ) then
  begin
    // Index des ausführenden Views herausfinden
    i := HandlerReferenz.IndexofView( View );
    // An nächster Position neues View ( +Model ) erstellen
    HandlerReferenz.Insert( i + 1 );
  end;
end;
Also der Befehl hat in der Factory ja den Handler kennengelernt, da er ja nur zum ausführen dient, und die View wird übergeben um herauszufinden welche überhaupt den Befehl aufgerufen hat. In dem Fall wird dann zwischen der ausführenden View und (falls vorhanden) der nächsten View, eine neue View erstellt. Als Beispiel ein dynamischer Suchdialog, wo man Kriterien hinzufügen und wieder entfernen kann.

MfG Alaitoc


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz