Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Grundsaetzliche Struktur bei MV* (https://www.delphipraxis.net/196275-grundsaetzliche-struktur-bei-mv%2A.html)

hzzm 7. Mai 2018 08:28

Grundsaetzliche Struktur bei MV*
 
Guten Morgen,

ich frage mich gerade, wo eine saubere Platzierung des Controller-Objekts bei der Verwendung von MV-X-Pattern ist:

Eigentlich muesste man den Controller doch global in der entsprechenden Unit instanzieren, oder?
Grundsaetzlich wird jedoch von globalen Variablen abgeraten, da diese unsaubere (oder unklare) Verlinkungen schaffen usw.

Aber ich will doch am Ende, dass ich aus einer anderen (neben-)Unit bei
Delphi-Quellcode:
uses Kaese;
Zugriff auf den Controller habe.
Gibt es dann ueberhaupt Alternativen?

Delphi-Quellcode:
Unit Kaese;

type
  TKaeseModel = class
    ABool: Boolean;
  End;

  TKaeseView = class
    TKaeseFrame: TFrame;
  End;

  TKaeseController = class
  private
    View: TKaeseView;
    Model: TKaeseModel;
  End;

var // !!!
  KaeseController: TKaeseController;

TiGü 7. Mai 2018 10:49

AW: Grundsaetzliche Struktur bei MV*
 
Wäre über eine Factory ggf. möglich sich die Singleton-Instanz geben zu lassen.

Stevie 7. Mai 2018 15:33

AW: Grundsaetzliche Struktur bei MV*
 
Mich verwirrt etwas, dass du zwar MV* schreibst und somit den Teil zwischen Model und View undefiniert lässt, dann aber von Controller sprichst.
Je nachdem, ob man MVC, MVP, MVVM, oder eine Eigenart dieser macht, ergibt sich auch, wie man den entsprechenden Teil (Controller, Presenter, ViewModel) erstellt und wer mit wem kommuniziert.

Grundsätzlich möchte ich aber von Singleton oder globaler Variable abraten, denn das führt die Verwendung des Patterns ad absurdum.

hzzm 8. Mai 2018 07:55

AW: Grundsaetzliche Struktur bei MV*
 
Zitat:

Zitat von TiGü (Beitrag 1401497)
Wäre über eine Factory ggf. möglich sich die Singleton-Instanz geben zu lassen.

Waere moeglich, oder ist State-of-the-Art die Situation zu behandeln?
Wer gibt denn dann diese Controller-Instanzen raus? Main-Objekt haelt sie, alle neben-units (unter-units), die sich gegenseitig brauchen, holen sich Interfaced von Main dann die Nachbar-Controller-Instanz?
Bringt mir das seitens der ASM-Zugriffe nachher tatsaechlich Vorteile?


Zitat:

Zitat von Stevie (Beitrag 1401552)
wie man den entsprechenden Teil (Controller, Presenter, ViewModel) erstellt

Um ViewModel, Model, View oder Presenter geht es mir gar nicht. Dass sich diese Zusammenhaenge aus dem jeweiligen Pattern ergeben, ist schon klar.
Es geht nur um das ueberliegende Controller(-artige) Objekt.

Zitat:

Zitat von Stevie (Beitrag 1401552)
Grundsätzlich möchte ich aber von Singleton oder globaler Variable abraten, denn das führt die Verwendung des Patterns ad absurdum.

Okay, ich hab anscheinend irgendwas verpasst. Reden wir mal ueber MVC explizit:
Von diesem Beitrag:

Main project file:
Delphi-Quellcode:
var
  Model: TModel;
  Controller: TController;
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);

  Model     := TModel.Create;
  Controller := TController.Create(Model, MainForm);

  Application.Run;

  Controller.Free;
  Model.Free;
end.
Es bleibt - wie bei allen Beispielen die ich finde - unklar, wie auf benachbarte Controller-Instanzen zugegriffen wird.

Delphi-Quellcode:
var
  ApfelModel: TModel;
  ApfelController: TController;
  SaftpresseModel: TModel;
  SaftpresseController: TController;
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);

  ApfelModel     := TModel.Create;
  ApfelController := TController.Create(ApfelModel, MainForm);
  SaftpresseModel     := TModel.Create;
  SaftpresseController := TController.Create(SaftpresseModel, MainForm);

  Application.Run;

  ApfelController.Free;
  ApfelModel.Free;
  SaftpresseController.Free;
  SaftpresseModel.Free;
end.
Alles klar, aber inhaltlich benoetigt ist
Delphi-Quellcode:
Apfel uses Saftpresse
.
Und nun? Die beiden Controller liegen ja nur als fluechtige Instanzen so nebeneinander rum.

Stevie 8. Mai 2018 09:52

AW: Grundsaetzliche Struktur bei MV*
 
Also erstmal solltest du dich von dem Gedanken verabschieden, dass zusammengehörige M, V und C in einer Unit liegen, das wird nur schief gehen.

Somit wird höchstens SaftpresseController.pas ApfelController.pas benötigen und die entsprechende TSaftpresseController Instanz beim Erstellen die TApfelController Instanz bekommen (hier eignen sich z.B. Interfaces).

hzzm 8. Mai 2018 11:29

AW: Grundsaetzliche Struktur bei MV*
 
Zitat:

Zitat von Stevie (Beitrag 1401668)
Somit wird höchstens SaftpresseController.pas ApfelController.pas benötigen und die entsprechende TSaftpresseController Instanz beim Erstellen die TApfelController Instanz bekommen (hier eignen sich z.B. Interfaces).

Das heisst, es gibt gar keine zwischen-unitlichen 'uses'-Beziehungen mehr, das ist dann nur noch fuer libraries.
Das Interface gibt nur genau die Resourcen frei, die die andere unit tatsaechlich benoetigt.

Wenn eine meiner Units 6 innere logische Zusammenhaenge braucht, hab' ich halt nen Konstruktor mit 8 Argumenten und 6 Interfaces, die ich pflegen muss.
Also bei hunderten von mini-frames/units, die einfach kleine "unter-Editoren" darstellen, nicht vorstellbar, ausser vielleicht fuer 15-30 "Haupt-Logiken".

Okay, danke fuer die Erklaerung.

Stevie 8. Mai 2018 11:52

AW: Grundsaetzliche Struktur bei MV*
 
Zitat:

Zitat von hzzm (Beitrag 1401673)
Wenn eine meiner Units 6 innere logische Zusammenhaenge braucht, hab' ich halt nen Konstruktor mit 8 Argumenten und 6 Interfaces, die ich pflegen muss.
Also bei hunderten von mini-frames/units, die einfach kleine "unter-Editoren" darstellen, nicht vorstellbar, ausser vielleicht fuer 15-30 "Haupt-Logiken".

Das nennt sich dann auch "constructor overinjection" und kann durch Aggregation gelöst werden.
In den meisten Fällen sind viele Abhängigkeiten ein Zeichen für Nichteinhalten des SRP.

Siehe auch: http://blog.ploeh.dk/2010/02/02/Refa...egateServices/


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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