![]() |
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:
Zugriff auf den Controller habe.
uses Kaese;
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; |
AW: Grundsaetzliche Struktur bei MV*
Wäre über eine Factory ggf. möglich sich die Singleton-Instanz geben zu lassen.
|
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. |
AW: Grundsaetzliche Struktur bei MV*
Zitat:
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:
Es geht nur um das ueberliegende Controller(-artige) Objekt. Zitat:
Von ![]() Main project file:
Delphi-Quellcode:
Es bleibt - wie bei allen Beispielen die ich finde - unklar, wie auf benachbarte Controller-Instanzen zugegriffen wird.
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.
Delphi-Quellcode:
Alles klar, aber inhaltlich benoetigt ist
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.
Delphi-Quellcode:
.
Apfel uses Saftpresse
Und nun? Die beiden Controller liegen ja nur als fluechtige Instanzen so nebeneinander rum. |
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). |
AW: Grundsaetzliche Struktur bei MV*
Zitat:
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. |
AW: Grundsaetzliche Struktur bei MV*
Zitat:
In den meisten Fällen sind viele Abhängigkeiten ein Zeichen für Nichteinhalten des SRP. Siehe auch: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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