AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Konflikt mit LoD, bei MVC + Factory + Command Pattern
Thema durchsuchen
Ansicht
Themen-Optionen

Konflikt mit LoD, bei MVC + Factory + Command Pattern

Ein Thema von Alaitoc · begonnen am 28. Sep 2009 · letzter Beitrag vom 28. Sep 2009
Antwort Antwort
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#1

Konflikt mit LoD, bei MVC + Factory + Command Pattern

  Alt 28. Sep 2009, 09:24
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#2

Re: Konflikt mit LoD, bei MVC + Factory + Command Pattern

  Alt 28. Sep 2009, 09:33
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.
Uwe Raabe
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Konflikt mit LoD, bei MVC + Factory + Command Pattern

  Alt 28. Sep 2009, 09:41
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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