![]() |
Konflikt mit LoD, bei MVC + Factory + Command Pattern
Tag zusammen,
ich habe ein Problem mit dem LoD, also Law of Demeter ( siehe ![]() 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:
Problem hierbei ist, dass ich gegen das LoD verstoße und ich mir noch nicht sicher bin wie ich das lösen soll...
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; 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:
Vll. habt ihr ja ne Idee :-D
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; MfG Alaitoc Edit: Unten noch ein Beispiel zum Add-Befehl |
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. |
Re: Konflikt mit LoD, bei MVC + Factory + Command Pattern
Ah moment, hätte ich wohl auch noch posten sollen...
Delphi-Quellcode:
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.
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; MfG Alaitoc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz