AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Architektur / Projektstruktur / zirkuläre Referenz Problem

Architektur / Projektstruktur / zirkuläre Referenz Problem

Ein Thema von _BlackDragon_ · begonnen am 28. Dez 2011 · letzter Beitrag vom 29. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2   
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#1

Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 14:48
Delphi-Version: 2006
Hi Leute.

Suche nun schon seit Stunden für einen Lösungsansatz, leider bisher ohne wirklichen Erfolg, bzw. ohne einen Ansatz der mir so richtig gefällt.

Und zwar möchte ich eine Struktur aufbauen, welche eine noch undefinierte Anzahl an Klassen enthält. Diese würde ich gerne, der Übersicht wegen, in separate Units auslagern. Nun gibt es aber das Problem, das diese sich gegenseitig "kennen" sollen, wodurch aber das Problem von zirkulären Referenzen entstehen würde.

Als Beispiel ziehe mal folgendes Szenario heran. Es existiert eine Klasse TEngine und es existieren mehrere Managerklassen. Nun soll natürlich die Klasse TEngine auch auf die einzelnen Manager zugreifen können und diese sollen natürlich auch die Klasse TEngine kennen um darauf zugreifen zu können.

Delphi-Quellcode:
unit Engine;

interface

uses Manager1; // geht ja nicht

type
  TEngine = class(TObject)
  private
    FManager1: TManager1;
  protected
  public
    property Manager1: TManager1 read FManager1;
  end;
Delphi-Quellcode:
unit Manager1;

interface

uses Engine; // geht ja nicht

type
  TManager1 = class(TObject)
  private
    FEngine: TEngine;
  protected
  public
    constructor Create(e: TEngine);
  end;

...

implementation

TManager1.Create(e: TEngine);
begin
  FEngine := e;
end;
Freue mich auf eure Antworten und Vorschläge.

Greets
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 15:03
forward Deklarationen über mehrere Units sind AFAIK nicht möglich.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#3

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 15:14
Genau dort liegt mein Problem. Das wäre auch zu schön gewesen, einfach eine Unit in der alle Klassen vordeklariert sind, um diese dann einfach einbinden zu können.

Nichts desto trotz muss es doch irgendeine Möglichkeit geben, eine vernünftige (ansichtssache ) Objektstruktur über mehrere Units zu verteilen.
  Mit Zitat antworten Zitat
Tobinator

Registriert seit: 18. Mai 2008
Ort: Cottbus
53 Beiträge
 
#4

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 15:17
Ich bin mir nicht ganz sicher, aber hast du schonmal über Polymorphie nachgedacht?

Also das du in einer Unit deine TEngine-Klasse mit abstrakten methoden definierst, diese dann in den Manager-Units einbindest und zum schluss noch in die konkrete TEngine-Unit deine Managerunit einbindest?
Tobias
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#5

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 15:23
Du verwendest D2006, so dass ich mir den Hinweis auf das Spring-DI-Framework sparen kann.

Aber natürlich steht Dir mit den Interfaces ein Konzept zur Verfügung, mit dem Du schön modularisieren kannst, ohne Dich mit zirkulären Referenzen plagen zu müssen.

Delphi-Quellcode:
unit uInterfaces
interface

uses
  Engine, Manager1;

type
  IManager1 = interface
    [Shift+Strg+G]
  end;

  IEngine = interface
    [Shift+Strg+G]
    function GetManager1 : IManager1;
    property Manager1: IManager1 read GetManager1;
  end;
Delphi-Quellcode:
unit Engine;
interface
implementation
uses
  uInterfaces;

type
  TEngine = class(TInterfacedObject, IEngine)
  private
    FManager1: IManager1;
    function GetManager1 : IManager1;
  end;
Delphi-Quellcode:
unit Manager1;
interface
implementation
uses
  uInterfaces;

type
  TManager1 = class(TInterfacedObject, IManager1)
  private
    FEngine: IEngine;
  protected
  public
    constructor Create(e: IEngine);
  end;
Andreas

Geändert von neo4a (28. Dez 2011 um 15:27 Uhr) Grund: Reihenfolge in uInterface angepasst
  Mit Zitat antworten Zitat
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#6

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 15:32
Erstmal ein Dankeschön für alle bisherigen Antworten.

Habe beide Möglichkeiten bereits in Betracht gezogen und wäge gerade die Vor- und Nachteile ab.

Mal abgesehen von etwas mehr Aufwand bei der Implementierung, halte ich das Konzept mit den Interfaces für die bessere Variante und werde mich damit auseinandersetzen.

Trotzdem bin ich für weitere Vorschläge offen.
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#7

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 15:32
Das wäre auch zu schön gewesen, einfach eine Unit in der alle Klassen vordeklariert sind, um diese dann einfach einbinden zu können.
Nimm aus meinem Beispiel die Unit uInterfaces und Du hast genau das.

Zu bemerken ist, dass die Klassen TEngine und TManager1 bei dieser Konstruktion praktisch nichts im Interface-Teil stehen haben und es nur eine Use-Klausel gibt, nach der man auch ohne Tools gar nicht lange suchen muss - SCNR.
Andreas
  Mit Zitat antworten Zitat
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#8

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 16:17
Ok, das Prinzip via Interfaces hab ich im Ansatz verstanden und werde mein Wissen diesbezüglich noch erweitern.

Was mir allerdings nicht ganz klar ist, wieso ich in die Interface-Unit die "Objekt"-Units einbinden "muss". Ich habe sie mal zum Testen auskommentiert und die Klassendeklarationen (TEngine und TManager1) in den Interface-Teil der Units verschoben. So ist deren Sichtbarkeit gewährleistet. Oder blick ich grad nicht durch?

Habe die entsprechenden Stellen hier nur auskommentiert.

Delphi-Quellcode:
unit uInterfaces
interface

//uses
// Engine, Manager1;

type
  IManager1 = interface
    [Shift+Strg+G]
  end;

  IEngine = interface
    [Shift+Strg+G]
    function GetManager1 : IManager1;
    property Manager1: IManager1 read GetManager1;
  end;
Delphi-Quellcode:
unit Engine;
interface
//implementation
uses
  uInterfaces;

type
  TEngine = class(TInterfacedObject, IEngine)
  private
    FManager1: IManager1;
    function GetManager1 : IManager1;
  end;

implementation
...
Delphi-Quellcode:
unit Manager1;
interface
//implementation
uses
  uInterfaces;

type
  TManager1 = class(TInterfacedObject, IManager1)
  private
    FEngine: IEngine;
  protected
  public
    constructor Create(e: IEngine);
  end;

implementation
...
Sollte doch auch so funktionieren. Oder übersehe ich etwas?
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#9

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 16:26
Was mir allerdings nicht ganz klar ist, wieso ich in die Interface-Unit die "Objekt"-Units einbinden "muss".
Sorry dafür, das ist bei diesem Beispiel natürlich nicht nötig. Es ist mir "reingerutscht", weil ich eigentlich die Interface-Deklarationen in den Units der Klassen belasse und in uInterfaces lediglich schreibe:

Delphi-Quellcode:
uses
  uEngine, uManager1;
type
  IEngine = uEngine.IEngine;
  IManager1 = uManager1.IEngine;
Diese Struktur ist bei vielen und/oder umfangreichen Interfaces viel übersichtlicher.

Und widerstehe bei diesem Konzept der Versuchung, die Deklaration der Klassen in den Interface-Teil zu ziehen. Du machst alles richtig, wenn sie isoliert in der Implementation-Sektion verbleiben. Für das Interface nach "draußen" gibt es ja ... das Interface.
Andreas

Geändert von neo4a (28. Dez 2011 um 16:31 Uhr)
  Mit Zitat antworten Zitat
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#10

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 28. Dez 2011, 16:35
Sorry dafür,...
Ist nicht zu entschuldigen!

Ich hab wohl eher für den Stoß in die richtige Richtung zu danken. Nun heißt es lesen, lernen und loslegen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf