Einzelnen Beitrag anzeigen

Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Problem mit eigener Architektur: Zirkulärer Unit-Bezug...

  Alt 30. Okt 2007, 12:48
Hallo!

Ich bastel gerade an dem Grundgerüst eines neuen Programms. Man könnte es vielleicht Architektur nennen, aber ganz so ausgereift ist es noch nicht. Die Idee ist, dass ich im Prinzip die verschiedenen Aufgaben im Programmfluss auf verschiedene Klassen aufteile.

Hierbei gibt es eine Hierachie mit zwei Stufen:
Auf obersten Stufe arbeitet der ProgramManager, dieser verwaltet einige globale Werte und zudem verschiedene SubManager die Teilaufgaben erledigen. So kümmert sich z.B. der OptionsManager darum, dass die Optionen ausgelesen, geändert, geschrieben, etc. werden.

Der ProgrammManager erstellt und kontrolliert die SubManager. Das Problem: Geleichzeitig sollen die SubManager auf die globalen Werte des ProgrammManagers zugreifen können. Deswegen muss die Unit des ProgrammManagers die Units der SubManager referenzieren und umgekehrt. Dies für zu einem zirkulären Bezug:

Delphi-Quellcode:
Unit_A
...
uses Unit_B; // Notwendig für TOptionsManager...

type
  TProgrammManager = class(TObject)
  private
    FOptionsManager: TOptionsManager;
    FRegistryPfad: String;
  public
    constructor Create;
    RegistryPfad: String read FRegistryPfad;
  end;
...
constructor TProgrammManager.Create;
begin
  FRegistryPfad := '\Ein\Pfad\in\der\Registry\';

  // SubManager "OptionsManager" erstellen und verwenden
  FOptionsManager := TOptionsManager.Create;
  FOptionsManager.LiesOptionen;
end;
Delphi-Quellcode:
Unit B
...
uses Unit_A; // Notwendig für TProgrammManager ...

type
  TOptionsManager= class(TObject)
  private
    FParrent: TProgrammManager;
  public
    constructor Create(aParrent: TProgrammManager);
    procedure LiesOptionen;
  end;
...
constructor TOptionsManager.Create(aParrent: TProgrammManager);
begin
  // SubManager mit ProgrammManager Parrent erstellen
  FParrent := aParrent;
end;

procedure TOptionsManager.LiesOptionen;
begin
  // Mit globalen Werten des ProgrammManager arbeiten
  OpenRegistryPath(FParrent.RegistryPfad);
  ...
end;

Ich finde die Konstruktion eigentlich recht gut, nur leider funktioniert das Ganze wegen dem zirkulären Unit-Bezug nicht. Habt Ihr eine Idee wie ich dieses Problem umgehen kann?

Besten Dank
Ares
  Mit Zitat antworten Zitat