AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Class Helper als Lösung für zirkuläre Unit-Referenzen
Thema durchsuchen
Ansicht
Themen-Optionen

Class Helper als Lösung für zirkuläre Unit-Referenzen

Offene Frage von "jaenicke"
Ein Thema von Der schöne Günther · begonnen am 25. Aug 2013 · letzter Beitrag vom 27. Aug 2013
Antwort Antwort
Seite 1 von 2  1 2      
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.388 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 09:24
// EDIT:
Interfaces lösen das Problem auch nicht, wenn man tatsächlich eine echte Referenz in beide Richtungen will. Man könnte allerdings die Referenz in einem abgeleiteten Interface unterbringen und nur das Basisinterface zurück referenzieren. Das geht bei Klassen aber auch.
natürlich lösen die Interfaces das Problem. Zumindest wenn man Interfaces wie Interfaces verwendet und nicht wie KLassen

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.869 Beiträge
 
Delphi 12 Athens
 
#2

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 11:21
natürlich lösen die Interfaces das Problem. Zumindest wenn man Interfaces wie Interfaces verwendet und nicht wie KLassen
Sofern du zwei Interfaces hast und die Referenz jeweils auf das andere drin hast, geht das auch nicht. Wenn du ein Basisinterface auf einer der beiden Seiten referenzierst, geht das, aber das geht auch bei Klassen.

Und wenn du ein zusätzliches Interface benutzt, musst du erst dieses zusätzliche Interface nehmen, ggf. mit as drauf casten z.B., das ist auch nicht so schön. Aber es kommt halt drauf an was man genau braucht.

Wenn man die benötigten Funktionen der Besitzerklasse in eine Klasse TCustomBesitzer packt und die Klasse Hund erst in TBesitzer aus einer anderen Unit referenziert, funktioniert es jedenfalls auch.

Die beste Lösung ist aber Kreuzreferenzen zu vermeiden und nicht diese durch Interfaces oder ähnliches zu forcieren, wobei man bei Interfaces dann auch noch aufpassen muss, dass man keine Kreise einbaut, so dass die Objekte nie freigegeben werden.
Dass das Vermeiden nicht immer geht, sieht man ja an den weak references im ARM Compiler für iOS, die genau so etwas dort erlauben.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 13:51
Interfaces kann man in eine Unit schmeißen, Klassen sollte man -der besseren Übersicht halber- aufteilen. Wenn man das so macht, lösen Interfaces diese Probleme der zirkulären Referenz.

Klar, alles in eine Datei schmeißen geht auch, aber ich hatte da mal dann ca. 10.000 Zeilen in einer Datei und das ist irgendwie uncool.

Dann lieber 500 Zeilen Interfacegedöns in einer Datei und 50 Klassen in 50 separaten Dateien.

Wer das alles partout ausschließen will, bricht sich eben einen ab (z.B. mit anonymen Verweisen, irgendwelchen Drittklassen, die die Beziehung verwalten usw. usw.)

Ich denk dabei immer an KISS. Und zwar so S wie möglich, also KIASAPDABWGU ("keep it as simple as possible, dumb ass, but without getting unübersichtlich"). Oder so ähnlich jedenfalls.

Und wichtig ist: Die Prämisse (KISS+Zusätze) ist am Wichtigsten. Wer meint, eine Datei reicht und ist KISS. Super. Wenn die Kollegen einverstanden sind => Cool. Genauso verhält es sich mit allen angebotenen Lösungen.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 14:59
Die ClassHelper Lösung finde ich ziemlich suboptimal. Man schau sich nur einmal diese Zeile an:
Writeln(Dog.Master.Dog.Master.Dog.Master.Dog.Name); // "Bobby" Da fängt ja der Hund an zu jaulen, wenn er das lesen könnte.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.191 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 15:04
Ja aber genau das ist doch die Intention. Zwei nicht verwandte Instanzen halten beide gegenseitig eine Referenz auf eine artfremde Instanz.

Ob man das jetzt schön findet, was man syntaktisch damit machen kann wenn der Verweis public ist ist doch eine andere Geschichte.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.191 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 15:19
Ich habe aus Versehen einen neuen Beitrag verfasst und kann ihn nicht löschen. Sorry

Interfaces kann man in eine Unit schmeißen, Klassen sollte man -der besseren Übersicht halber- aufteilen.
Ich komme wirklich noch nicht hinterher
Interfaces muss ich in die gleiche Unit packen. Und wenn ich nun schon zwei artfremde Interfaces in eine Datei packe, kann ich auch gleich die paar Zeilen mehr für die Klassen angehen und wieder alles in einen Topf werfen.

Alternativ (ähnlich den Helpern) für eine der beiden ein Interface. Wenn man sich die Abbildung im Anhang anschaut: So?
Angehängte Grafiken
Dateityp: png New Class Diagram.png (21,1 KB, 37x aufgerufen)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 16:08
Ich verstehe deinen Wunsch, eine allgemeine Lösung zu finden.

Solche generelle Lösungen haben aber auch einen Nachteil, weil sie eigentlich nirgends richtig passen (Kontext).

Hier halt einfach: Das Herrchen hat einen Hund. Damit weiß das Herrchen immer Bescheid. Wenn der Hund was übers Herrchen wissen muß, dann halt per Events.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 17:15
Interfaces muss ich in die gleiche Unit packen.
Nein, natürlich nicht. Aber hier schon (wg. zirkulärer Referenz).
[/QUOTE] Und wenn ich nun schon zwei artfremde Interfaces in eine Datei packe, kann ich auch gleich die paar Zeilen mehr für die Klassen angehen und wieder alles in einen Topf werfen.[/QUOTE]
Ich sagte doch: Eine Datei mit allen Interfaces ist allemal übersichtlicher als eine Datei mit allen Klassen.
Delphi-Quellcode:
Type
  IBesitzer = interface ...
    IHund : Hund;
  end;


  IHund = interface
   Besitzer : IBesitzer;
  end;
Und die Implementierung in separaten Dateien.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.388 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 21:09

Ich sagte doch: Eine Datei mit allen Interfaces ist allemal übersichtlicher als eine Datei mit allen Klassen.
...
Und die Implementierung in separaten Dateien.

genau. Und das Vorgehen bewahrt dann einen auch davor an Stellen "aus Versehen" die Implementierung (=Klasse) zu verwenden, wo das Interface ausreicht.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.869 Beiträge
 
Delphi 12 Athens
 
#10

AW: Class Helper als Lösung für zirkuläre Unit-Referenzen

  Alt 26. Aug 2013, 21:16
Eine andere Lösung ist eben die von mir angesprochene. Die bevorzuge ich eher. Wir benutzen normalerweise auch eine Datei pro Interface und eine pro Klasse. Mit der Lösung funktioniert das problemlos, egal ob mit Interface oder Klasse:
Delphi-Quellcode:
  TCustomDogOwner = class
  public
    procedure Schimpfen;
  end;

  TDog = class
  private
    FOwner: TCustomDogOwner;
  public
    property Owner: TCustomDogOwner read FOwner write FOwner;
  end;

  TDogOwner = class
  private
    FDog: TDog;
  public
    property Dog: TDog read FDog write FDog;
  end;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 14:23 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 by Thomas Breitkreuz