AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi uses im interface und implementation-Teil

uses im interface und implementation-Teil

Ein Thema von mashutu · begonnen am 15. Jan 2009 · letzter Beitrag vom 16. Jan 2009
Antwort Antwort
Seite 2 von 3     12 3   
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#11

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 12:56
Den letzten Beitrag von muetze nicht überlesen hier

...eine Anmerkung hab ich noch dazu

Wieso mache ich mir nicht eine Unit in der ich alle von mir benötigten Variablen global definiere? Ich passe einfach auf, dass ich JEDE Variable hier definiere und dabei alle Variablen alphabetisch anordne, so dass einen kleinen Überblick darüber habe....dann brauch ich auch nur noch an einer Stelle zu suchen....

weil?...ok mehr Speichernutzung...und sonst?....genau...ich benutze alles nur da, wo ich es auch brauche
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#12

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 12:59
Zitat von mashutu:
Ich will zirkulaere Bezuege gaenzlich vermeiden und moechte daher, dass der Compiler den Entwickler auf diesen Misstand aufmerksam macht.
Nur mal, um sicher zu gehen, dass ich dich recht verstehe - du möchtest so etwas
Delphi-Quellcode:
TControl = class(TComponent)
  property Parent: TWinControl read FParent write SetParent;
end;
  
TWinControl = class(TControl)
  property Controls[Index: Integer]: TControl read GetControl;
end;
vermeiden?

Uli.
Uli Gerhardt
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#13

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 13:16
Zitat von uligerhardt:
Nur mal, um sicher zu gehen, dass ich dich recht verstehe - du möchtest so etwas
Delphi-Quellcode:
TControl = class(TComponent)
  property Parent: TWinControl read FParent write SetParent;
end;
  
TWinControl = class(TControl)
  property Controls[Index: Integer]: TControl read GetControl;
end;
vermeiden? :mrgreen:
Uli.
Nein so etwas will ich nicht vermeiden. Aber ich will vermeiden, dass Unit A unit B benutzt UND umgekehrt, weil man es sonst wesentlich schwerer hat modulare Tests zu machen. Solche Zirkelbezuege sind (IMHO) ueberfluessig und weisen auf Designfehler im Code hin, die ich rechtzeitig erkennen will.
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#14

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 13:21
Hmmm, meine Verwirrung steigt
Was haben zirkuläre Referenzen mit globalen Variablen und der Sichtbarkeit von Klassen im Sinne der hier zur Diskussion gestellten Vorgehensweise zu tun? Das einzige Gegenargument, was ich bisher nachvollziehen konnte ist das von Muetze: Verlangsamung der Compilierung bei > 2 Mio Codezeilen....
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#15

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 13:35
Zitat von mashutu:
Nein so etwas will ich nicht vermeiden. Aber ich will vermeiden, dass Unit A unit B benutzt UND umgekehrt, weil man es sonst wesentlich schwerer hat modulare Tests zu machen. Solche Zirkelbezuege sind (IMHO) ueberfluessig und weisen auf Designfehler im Code hin, die ich rechtzeitig erkennen will.
Derartige Bezüge sind bei einem wirklich sauberen Code-Design (= 1 Klasse -> 1 Unit) sogar zum Teil absolut notwendig.

Ausserdem gibt es nur einen einzigen Grund, warum der Delphi-Compiler in diesem Moment meckert: Delphi ist ein Single-Pass Compiler und würde sonst in eine Endlosschleife rennen. Wäre es ein Multipass-Compiler, dann würde er sich gar nicht erst an der ersten Unit-Liste aufhalten, sondern gleich den Interface-Teil parsen, und erst wenn er einen unbekannten Typen entdeckt die vorher angegebenen Units danach durchsuchen.

Wenn die andere Unit hingegen im implementation-Teil steht, dann hat er bereits alle notwendigen Typen der Klassendeklaration geparst und kann gefahrlos weiterarbeiten.

Solche Referenzen sind in der sauberen, strukturierten Programmierung üblich, ein wichtiges Hilfsmittel und lassen sich auch ohne Probleme automatisiert testen.

Du würdest (bei einem sauberen Code-Design (nochmal: genau eine Klasse gehört in genau eine Unit) damit sämtliche Forward-Declarations verbieten. Andersrum: Wenn Du nach genau dieser Regel konsequent arbeiten würdest, hättest Du in Deinen Units keine Forward-Declarations mehr. Entferne mal alle und gucke, ob es sich dann noch kompilieren lässt.

Dein Kollege hat im übrigen vollkommen recht: Die Uses-Listen sollten immer optimiert sein, keine unnötigen Units enthalten und wenn eine Unit nur in der Implementierung benötigt wird, dann ist es sauber, sie auch nur dort einzubinden wo sie benötigt wird. Andernfalls könnte es nämlich insbesondere hier bei Delphi sogar passieren, dass unter Umständen eine initialization-Teil einer Unit zu früh durchlaufen wird, weil sie oben im Interface stand anstelle im Implementation. Mal von der Compilergeschwindigkeit (und insbesondere dem Speicherverbrauch beim Kompilieren und Linken) abgesehen.

Das Hilfsmittel, um die Uses-Klauseln korrekt zu sortieren und in Deinem Fall hoffentlich schnellstmöglich das unnötige Zeug raus- und das falsch Platzierte in den implementation-Teil zu verschieben heisst Icarus Uses List Analyzer, was nicht umsonst sagt, welche Uses entfernt und verschoben gehören-
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#16

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 13:45
Ich möchte mashutu nicht vorgreifen, aber:

Das im interface keine unnötigen Units aufgeführt werden, ist doch eigentlich selbstredend.

Im übrigen entnehme ich der bisherigen Diskussion, dass zirkuläre Bezüge von den Profis nicht für schlechtes Design erachtet werden und manchmal sogar notwendig sind - korrekt?

Ist es dann bereits ein unprofessioneller Denkansatz, zirkuläre Bezüge -wann immer es geht- zu vermeiden?
Ralph
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#17

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 13:49
Zitat von taaktaak:
Was haben zirkuläre Referenzen mit globalen Variablen und der Sichtbarkeit von Klassen im Sinne der hier zur Diskussion gestellten Vorgehensweise zu tun?.
Laufen tut vieles, sauber ist nicht alles.


Zitat von taaktaak:
Im übrigen entnehme ich der bisherigen Diskussion, dass zirkuläre Bezüge von den Profis nicht für schlechtes Design erachtet werden und manchmal sogar notwendig sind - korrekt?
Exakt. Zirkuläre Aufrufe sind oft gewollt und völlig sauberer Code.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#18

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 14:01
Zitat von taaktaak:
Ist es dann bereits ein unprofessioneller Denkansatz, zirkuläre Bezüge -wann immer es geht- zu vermeiden?
Jain. "Wann immer es geht" ist zu hart. Dieser Ansatz dazu führen, dass man sich beim Designen einen abbricht und einen Workaround einbaut, um eine Rückreferenz zu vermeiden. Nur führt dieser Workaround dann in aller Regel zu (viel) mehr Code, als eigentlich notwendig ist. Mehr Code = mehr Stellen, wo Fehler sein können. Mehr Code = mehr zu warten. Mehr Code = mehr zu testen. Und das liesse sich durch eine einfache Rückreferenz vermeiden.

Das ganze lässt sich im übrigen aber tatsächlich in 90% aller Fälle relativ einfach vermeiden: Man definiert ein Interface, und inkludiert dieses Interface in alle beteiligten Units. Interfaces sind nicht das Allheilmitteln, aber an der Stelle in den allermeisten Fällen das korrektere Hilfsmittel als überkreuzende Bezüge. Aber es gibt eben stellen, da macht auch ein Interface weniger Sinn als ein Rückbezug (insbesondere, wenn es um einen Typen geht, der nur einmal benutzt wird).
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#19

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 14:09
Ok, dieser Argumentation kann ich (zustimmend) folgen - Danke!

PS: Interfaces sind für mich derzeit (noch) ein völlig unbekanntes Terrain. Habe daher bisher im Bedarfsfall mit Botschaften gearbeitet um zirkuäre Bezüge zu vermeiden - und dies in den konkreten Anwendungsfällen auch als übersichtlich und wartungsfreundlich angesehen.
Ralph
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#20

Re: uses im interface und implementation-Teil

  Alt 15. Jan 2009, 14:25
Zitat von mashutu:
Aber ich will vermeiden, dass Unit A unit B benutzt UND umgekehrt, weil man es sonst wesentlich schwerer hat modulare Tests zu machen. Solche Zirkelbezuege sind (IMHO) ueberfluessig und weisen auf Designfehler im Code hin, die ich rechtzeitig erkennen will.
Ich denke auch, dass verborgene Kreuz- und Querbezüge zu schlechter Software führen.

Aber nehmen wir mal M:N Beziehungen - was spricht dagegen, die beteiligten Klassen in je eine Unit zu packen? Delphi ermöglicht es, mit dem Umweg über implementation und unschöne (aber unvermeidbare) Typecasts.

Selbst in der Praxis gängige Entwurfsmuster (wie z.B. "Besucher") sind ohne zirkuläre Bezüge in Delphi nicht darstellbar, wenn man je Klasse eine Unit hat. Nachträglich alle Units wieder zu einer 'Monster'-Unit zusammenzufassen, nur um diese Bezüge zu vermeiden, fiele für mich auch nicht gerade in die Kategorie 'Modernes Design'. Es sind zwei Seiten einer Medaille - Lösungen, die funktionieren, sind nicht immer zugleich auch 'schön'.

Schade, aber es gibt m.W. keine Werkzeuge für Delphi, die Unitabhängigkeiten analysieren und gegen selbst definierte Kriterien prüfen können - z.B. um festzulegen, dass die 'Schichten' der Software nur darunterliegende 'Schichten' aufrufen dürfen. Das wäre bei großen Projekten ein enorm zeitsparendes Werkzeug.
Michael Justin
habarisoft.com
  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 02:57 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