![]() |
Delphi-Version: XE
Uses: Interface vs. Implementation Section
Hallo,
ich kann eine Unit sowohl im Interface als auch im Implementation Bereich unterbringen:
Delphi-Quellcode:
unit Test;
interface uses BeispielUnit; implementation uses BeispielUnit; end. Ich meine bereits häufiger gelesen zu haben, dass nur die Units in den Interface Bereich sollen, die es mindestens müssen. Welche Auswirkungen hat dies? Hat dies Auswirkungen auf z.B. Performance oder Ressourcennutzung? Danke, Martin W. |
AW: Uses: Interface vs. Implementation Section
Wirklich nützlich wird diese Trennung erst bei zirkulären Unitreferenzen:
Delphi-Quellcode:
--> Gibt einen Fehler!
unit UnitA;
interface uses UnitB; implementation end. //------------------------ unit UnitB; interface uses UnitA; implementation end. Indem wir die Klausel in der einen Unit in die nächste verschieben, können wir das umgehen:
Delphi-Quellcode:
Das ist meines Erachtens der einzige sinnvolle Grund, die Klausel im implementation-Teil zu nutzen.
unit UnitA;
interface uses UnitB; implementation end. //------------------------ unit UnitB; interface implementation uses UnitA; end. Ansonsten finde ich es schöner, alles zentral im interface-Teil zu haben, weil dann jeder Leser sofort sehen kann, welche Abängigkeiten die Unit hat. Dies ist aber Geschmackssache. Einen Performance- oder Resourcenunterschied kann ich mir nicht vorstellen. |
AW: Uses: Interface vs. Implementation Section
Wir haben möglichst alle Einträge im Interface-Bereich.
Dann merken wir sehr schnell wenn einer nicht aufgepasst hat und uns eine zirkulären Unitreferenzen eingebrockt hat. |
AW: Uses: Interface vs. Implementation Section
Jupp, möglichst immer in das Interface.
- da merkt man, wie schon erwähnt, ob man sich irgendwo Kreisbeziehungen eingehandelt hat. - und die dort angegebenen Units sind "immer" schon initialisiert, bevor irgendein Code der eigenen Unit ausgeführt wird, bzw. externe Units werden nicht schon freigegeben, bevor nicht der letzte Code fertig ist. (bei Letzterem abgesehn von unglücklich gesteuerten Threads) Ist eine Unit in der Implementation angegeben, dann kann es sein, daß deren Initializations-Abschnitt noch garnicht abgearbeitet wurde und man schon auf etwas noch nicht Existierendes zugreifen will. Genauso andersrum beim beenden des Programms, bzw. beim Entladen der DLL/BPL ... dort kann dann schon wasweg sein, obwohl man es noch braucht. |
AW: Uses: Interface vs. Implementation Section
Auswirkungen auf den Performanceverbrauch / die Ressourcennutzung hat es nicht, wenn ich alles in den Interfacebereich lege?
Hier steht es anders herum, leider auch ohne Begründung: ![]() |
AW: Uses: Interface vs. Implementation Section
Zitat:
|
AW: Uses: Interface vs. Implementation Section
Also ich packe nur die Units, die im Interfaceteil benötigt werden, auch in den Interface-Teil. Damit dokumentiere ich die Beziehungen zwischen den Subsystemen meiner Anwendung.
Units, die für die Coderstellung benötigt werden, kommen selbstverständlich in den Implementationsteil. Dazu ist er schließlich da. Im allgemeinen finden sich hier prozedurale Toolsammlungen (xxxUtils ö.ä.) Zirkuläre Beziehungen sind grundsätzlich zu vermeiden, sodaß ich nur selten in die Verlegenheit kommen. Und wenn, löse ich sie auf. Denn das geht ja man gar nicht: Schlamperei im Code... ;-) |
AW: Uses: Interface vs. Implementation Section
PS: Units, welche im Interface bennötigt werden, werden auch in der Implementation benötigt.
Zitat:
Bei mir alles ins interface, ausnahmslos, und auch oftmals möglichst in der Reihenfolge wie diese Units untereinader in Beziehung stehen. - ist für den Compiler einfacher - und alles was in der Implementation berbleibt, sind die "bösen Kreisreferenzen". Wenn ich eine Unit vernändere, dann müßte ich ja ständig aufpassen, die UUnits hoch/runtezuverschieben, um dein System konsequent einzuhalten. Und wenn ich wissen will, was für Units oder ob eine Unit verwendet wird, dann muß ich immer 2 Listen durchschauen. (Kreuzreferenzen sind selten und somit brauch ich "nie" unten nachsehn) Das Interface stellt für mich einfach die öffentlichen Schnittstellen und die globalen Beziehungen dar. Und Unitbeziehungen gelten dabei als Globak. (Kreuzreferenzen sind eine böse Ausnahme) |
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
Sollte dann mal eine Unit aus dem Implementation-Teil in den Interface-Teil verschoben werden müssen, erledigt das der ModelMaker Code Explorer freundlicherweise von selbst. Wie mein Vater immer sagt: Gutes Werkzeug ist durch nichts zu ersetzen. Allerdings sei jedem sein eigener Programmierstil gegönnt. Wichtig ist nur, daß er konsistent ist. |
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
Zitat:
Zitat:
Ich programmiere seit 30 Jahren so und meine Erfahrungen sind gänzlich andere. Aber wie Uwe Raabe schon erwähnte: Jeder soll so schreiben, wie er es für richtig hält. |
AW: Uses: Interface vs. Implementation Section
Anscheinend gibt es hier zwei entgegengesetzte Meinungen, ich bin gleicher Meinung wie "Furtbichler".
Wenn es richtig wäre alle Units im Interface-Abschnitt einzubinden warum besteht dann überhaupt die Möglichkeit die Uses-Klausel im Implementation-Abschnitt zu benützen? Ich glaube ja nicht, dass die Entwickler von Delphi unnötige Sprachfeatures erfunden haben sondern dass "himitsu" hier falsch liegt. Hauptargument: * wenn man eine Unit im Implementation-Abschnitt einbindet hilft dies dem Compiler weil er bei Änderung der Unit weniger kompilieren muss und interne Symboltabellen kleiner werden Bei grossen Projekten mit Hunderten von Units kann das einen grossen Unterschied ausmachen, denn wenn jede Unit direkt oder indirekt die Symboltabelle jeder anderen Unit benötigt dann ist das ein quadratischer Zusammenhang. Nebenargumente: * Es gibt in der objekt-orientierten-Programmierung das Prinzip des ![]() Verberge soviel wie möglich von der inneren Struktur. Mache alles privat mit Ausnahme der Dinge die öffentlich sein müssen. Das kann man so auch auf die Sichtbarkeitmachung der Abhängigkeiten der verschiedenen Units anwenden * Es gibt z.B. das ![]() Es zeigt nach einer Analyse des Sourcecodes nicht nur unbenützte Units an, sondern zeigt auch die Units, die man vom Interface- in den Implemenation-Abschnitt verschieben kann. Die Programmierer von Icarus haben sich bestimmt sehr gründlich mit dem Unitkonzept von Delphi auseinandergesetzt und bieten hier bestimmt keine sinnlose Funktion an. |
AW: Uses: Interface vs. Implementation Section
Vielleicht gab es ja anfangs nur die obere Uses-Klausel?
Die Andere wurde später eingebaut, als man merkte, daß es sonst, bei Kreuzreferenzen, unüberwindbare Hindernisse bibt. Ich hab einfach die Erfahrung gemacht, daß man sich mit "unnötigen" Units, in der Implementation, einige nette und vorallem nicht leicht nachvollziehbare Initialisierungsreihenfolgeprobleme einfangen kann, welches es nicht gäbe, wenn Diese alle im Interface lägen. |
AW: Uses: Interface vs. Implementation Section
IIRC gab es die "implementation"-uses-Klausel schon unter Delphi 1.
|
AW: Uses: Interface vs. Implementation Section
Zitat:
Lang lebe Turbo Delphi Pascal. :cheer: Man könnte ja mal den Herrn Wirth fragen, was er sich dabei dachte. :gruebel: |
AW: Uses: Interface vs. Implementation Section
|
AW: Uses: Interface vs. Implementation Section
Zitat:
Ich hatte es mir zu TP Zeiten angewöhnt alles ins die Implementation zu packen, da damit ein verstecktes "Durchreichen" von Units vermieden wurde. In jeder Unit standen also alle benützten Units. (Ausnahme: im Interface genutzte Units) Gruß K-H |
AW: Uses: Interface vs. Implementation Section
Wurden in TP Units (deren Deklarationen) denn durchgereicht?
In Delphi machen die das ja nicht. |
AW: Uses: Interface vs. Implementation Section
Packt ihr dann bei einem neuen Formular erstmal alle Units in den Implementationsteil die nicht benötigt werden? Und wenn ihr überprüfen wollt ob eine Unit schon eingebunden ist schaut ihr immer in beiden Uses Bereichen nach? Und Falls dann mal in einem Formular eine Unit im Objekt/Formular benötigt wird kopiert ihr die immer aus dem Implementationsteil in den Interfaceteil? Warum erzeugt Delphi alle benötigten Units immer im Interfacebereich? Fragen über Fragen :)
Ich mach es wie Himitsu, in den Implementationsbereich kommen nur Units mit Kreuzreferenzen. Darf aber jeder machen wie er will, denke ein "richtig" gibts nicht, es hat beides Vor- und Nachteile. |
AW: Uses: Interface vs. Implementation Section
Hier sind noch zwei Argumente:
* schaut doch einfach mal nach wie das Uses Thema im Sourcecode der VCL gehandhabt wird. Sind dort alle benötgten Unit immer im Interface-Abschnitt eingebunden? Nein? Woran könnte das liegen? * Man schaue sich mal ![]() Man sieht, dass es direkte und indirekt benützte Units gibt. Wenn man Units im Interface-Abschnitt einbindet, dann wird die Abhängigkeit weitergegeben, was man nach Möglichkeit vermeiden sollte. Der ![]() |
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Und zu vorherigen Posts: Wie schon gesagt wurde, zirkuläre Referenzen als Grund zu nennen, ist ein Kontra-punkt. Fazit: Aufgrund der Lesbarkeit (alles an einer Stelle ist übersichtlicher) und um gar nicht erst durch einen Fauxpas zirkuläre Referenzen zu implementieren, die ich nachher wieder korrigieren muss, würde ich auch zukünftig weiter alles im interface deklarieren. Gruß |
AW: Uses: Interface vs. Implementation Section
Eins vorneweg: Ich verwende den Uses-Clause Manager (Shift-Alt-U) von GExperts! Damit habe ich keine Ausrede mehr, es sei zu anstrengend, die Uses-Abschnitte aufzuräumen.
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ihr immer mit euren zirkulären Referenzen: Wenn ihr davor Angst habt, dann lernt doch einfach, eure Units so zu bauen, das das nicht passiert. Ich mach mir doch meinen Code nicht unleserlich ('alles an einer Stelle') nur weil ich keinen Plan habe, wie ich zirkuläre Referenzen vermeiden kann. |
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
Zitat:
Zitat:
Achja: Ich habe das auch mal so gemacht, mit dem Verteilen der Units und hatte mir irgendwann mal eine zirkuläre Referenz eingefangen. Gruß |
AW: Uses: Interface vs. Implementation Section
Wenn du die Variablen ansprichts ... dann hätte ich gern eine lokale Usesklausel, denn es kommt oftmals vor, daß ich eine Unit nur innerhalb einer einer bestimmten Methode benötige.
Nja, im Prinzip ist erstmal eine Glaubensfrage, wie als ob man begin, BEGIN, Begin oder begIN schreiben möchte. Für den Kompiler gibt es allerdings nur Nachteile, egal was man macht. > gibt es nur die Interfaceklausel, dann hat er weniger Arbeit [edit] ups, ich meinte ja die Nachteile > gibt es nocheine Klausel in der Implementation, dann hat er mehr Arbeit Wobei es auch so schon nicht leicht ist, da er eigentlich versucht Units in der Reihenfolge einzubinden, wie man es dort angegeben hat, was ja leider nicht immer klappt. Aber wenn man niemals Initializations- und Finalizations-Abschnitte verwendet, dann hab man keine Probleme zu befürchten, wenn die genutzten Units in der Implementation stehen. |
AW: Uses: Interface vs. Implementation Section
Vielleicht kommt ein Teil der Meinungspolemik in diesem Thread auch von der unterschiedlichen Herangehensweise bzw. Nutzung von Delphi?
Beim RAD-Ansatz übernimmt ja Delphi quasi die Verwaltung der Units und packt sie alternativlos und korrekt in den Interface-Bereich. Sobald ich jedoch eigene Klassen oder Forms/Frames ohne RAD einsetze, bin ich allein der "Bauherr" meiner Units und der Verwalter von deren Referenzen. Und Furtbichler könnte sich z.B. auch auf N.Hodge berufen, der ![]() ![]() Hier kommen dann auch schon Entwicklungs-Prinzipien und -Methoden (Law of Demeter, Testable Code, Clean Code) in's Spiel, die etwas über den bloßen Wunsch hinaus gehen, immer alles im Blick haben zu wollen. |
AW: Uses: Interface vs. Implementation Section
Zitat:
|
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
|
AW: Uses: Interface vs. Implementation Section
Zitat:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; wird bei einem neuen Formular nur "Forms" im Interface Teil benötigt. Erst durch andere Komponenenten werden die anderen ggf. verwendet. Unr nur weil einige Tools dies unterstuetzen, ist es noch lange kein Grund, dass dies "richtig" ist. Der Rest hat sich Angos schon geäußert. |
AW: Uses: Interface vs. Implementation Section
Zitat:
Alles, was im Interface-Teil deklariert und referenziert wird, benötigt die Klasse, um mit dem Rest-Programm arbeiten zu können. Demgegenüber wird das, was lediglich im Implementations-Teil deklariert und referenziert wird, lediglich im Innern der Klasse benötigt. So gesehen ist die Uses-Klausel auch eine Beschreibung der Wirkzusammenhänge der Klasse und wenn auf einmal Units im Interface benötigt werden, kann das schon ein Indiz für einen Fehler in der Klassen-Architektur sein. Da hat man dann etwas nicht "richtig" gemacht. |
AW: Uses: Interface vs. Implementation Section
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Dieser Wizard ist für mich eines der wenigen Tools, die ich von CnPack in der IDE aktiviert habe. |
AW: Uses: Interface vs. Implementation Section
Ich möchte den Punkt der Übersichtlichkeit nochmal aufgreifen.
Bisher geht ihr alle davon aus, dass ihr/eure Firma/euer Entwicklerteam die einzigen seid, die das Projekt kompilieren. Und das beim Build sowieso alle Abhängigkeiten bereits erfüllt sind. Aber angenommen ich entwickle Open Source und binde noch ein paar externe Units mit ein, die nicht zum Projekt gehören. Nun möchte jemand anders den Code auch auf seinem Zielsystem kompilieren, und schaut zunächst in die Units, welche Dependencies er braucht. Dann ist es doch viel einfacher und schneller, einfach oben im interface-Abschnitt zu schauen, gerade weil diese Klausel direkt sehr weit oben im Code ist. Man bedenke, dass der interface-Abschnitt gerne mal >200 Zeilen lang werden kann, und dementsprechend die implementation-uses-Klausel irgendwo mitten im Code liegt (erstmal finden!) Und jetzt kommt mir bitte keiner mit: "Ausprobieren und den Compiler in den Fehler laufen lassen, dann wird man schon sehen, was er nicht findet" - denn das ist jawohl die unsauberste Methode überhaupt. Das würde dem gleichen Prinzip folgen wie:
Delphi-Quellcode:
Einfach drauflos ballern und vom Fehlerfall ausgehen.
function Nonzero(const i: integer): boolean;
var x: extended; begin try x := 1/i; Result := true; except Result := false end end; P.S.: Gut, zugegeben, die Dependencies sollten eigentlich auch mit in die Dokumentation, aber hasst es nicht jeder Programmierer, Dokumentationen zu schreiben? :stupid: |
AW: Uses: Interface vs. Implementation Section
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Warum benutzt Du dann nicht IDE-Tools wie die Editor-Toolbar von CnPack, die Dir nicht nur per Klick die Units listet, sondern auch noch den Sprung zu den Sektionen per Maus- oder Tastatur-Klick bietet, nicht zu reden von der einfachen Navigation zu den Prozeduren? Neben dem bereits erwähnten Unit Cleaner ebenfalls eine sinnvolle Erweiterung vom CnPack, von dem ich wirlich nur ein halbes Dutzend Funktionen aktiviert habe. |
AW: Uses: Interface vs. Implementation Section
Zitat:
---- Gut. Ich gebe zu, das ganze kommt in Delphi selten vor, da jeder, der nur mal eben was fremdes kompilieren will, sich erstmal teuer Delphi kaufen muss, und wenn mans dann hat, hat man ja schon gleich ne Mega-IDE. Und letztendlich ist dort die Auswahl an Zielplattformen ja doch nicht so groß, dass das Szenario überhaupt Sinn macht. Aber ich sags mal so: Ich arbeite schon eine ganze Weile mit dem FPC, und da öffnen sich nunmal ganz neue Möglichkeiten: denn auf einmal laufen Programme auch auf SPARC, PowerPC, ARM, Alpha und Co. Und als Entwickler kann ich das nunmal schlecht für jede CPU-Typ/Betriebssystem-Kombination kompilieren. Gängige Praxis ist es im GNU/Linux-Umfeld daher sowieso längst, vieles erst auf dem Zielsystem zu kompilieren. Und genau den Fall habe ich hier betrachtet. Angenommen ich habe ein FreeBSD auf SPARC am laufen, muss ich jegliche Fremdsoftware von andern nunmal erst selbst kompilieren. Das ist so und ergibt sich bereits aus der Natur der Tatsache, dass es überhaupt soviele verschiedene Plattformen gibt. Und als Entwickler will man dies doch möglichst einfach machen. Und solche Aktionen, wie für den Kompilierer wichtige Abschnitte quer durch den Code zu verstreuen, ohne dass sich ein nennenswerter Vorteil ergibt, sind absolut kontraproduktiv. |
AW: Uses: Interface vs. Implementation Section
@implementation
Es steht Dir frei, Tools als lustig zu beurteilen. Das kommt immer gut, ist lässig und zeigt nur denen, die die Tools praktisch nutzen und es somit besser wissen, dass Du davon nur wenig verstehst. Leider ist die Delphi IDE nicht von Haus aus komplett und so braucht man Erweiterungen wie GExpert, VersionInsight, CnPack, AQTime, MadExecept. Das Konzept kennt man auch aus anderen IDEs. Und nicht nur ich finde: ![]() Schau bitte in meinen Post 28 in diesem Thread für eine Erklärung, warum es klar ist, wann welche Sektion für eine Unit-Referenz verwendet wird. Ob Du das für Dich auch nachvollziehen kannst, spielt dabei eigentlich keine Rolle. Das Einhalten von Konventionen erschließt sich nicht jedem und so ist nicht nur in Delphi Clean Code ein ständiges Thema. Dass Du mit FP und Linux noch etwas andere Sichtwinkel und Einsatzbereiche hast und i.d.R. ohne Delphi-IDE auskommen musst, ändert am Sinn der Konventionen eigentlich gar nichts. |
AW: Uses: Interface vs. Implementation Section
Zitat:
Für den Entwickler. Aber eben nicht jeder Kompilierer, der das fremde Programm nur auf seiner eigenen Plattform zum laufen bringen will, will sich damit aufhalten, noch zig Add-Ins und Tools zu installieren. Zitat:
Zitat:
Und was bitte hat das mit Clean Code zu tun? Solche Abhängigkeiten beziehen sich auf das ganze Projekt! Das ganze Projekt kompiliert ohne sie nicht. Selbst wenn nur eine einzige Prozedur es benutzt, der effektive Bezug ist immer noch das volle Projekt, nicht die Codedatei und nicht der einzelne Abschnitt. Das ist auch der Grund, weshalb MS das im VS anders gelöst hat: Assemblies werden dort immer für das ganze Projekt zentral eingebunden. In Delphi ist das anders, und die gängige Praxis mag anders sein. Aber das heißt nicht, dass sie besser, geschweige denn "cleaner" ist, nur weil sie vorgibt, sich auf einen kleineren Bereich zu beziehen (es schlussendlich aber nicht tut). Zitat:
|
AW: Uses: Interface vs. Implementation Section
Ach ja, nur weil Delphi selber neuerdings Einiges in der Implementation einfügt, heißt noch lange nicht, daß sie sich dabei was gedacht haben.
Und auch zu sagen "schau mal, in dieser VCL-Unit ist das auch so" ... es sollte jeder bemerkt haben, daß die VCL an vielen Stellen nicht grade konsequent ist. :roll: |
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Uses: Interface vs. Implementation Section
Zitat:
Aber ich gebe gern zu, dass der Fall im Delphi-Umfeld bisher eher weniger die Regel ist. Ich will doch gar nicht, dass du auf deine Tools verzichtest. Ich nutze doch auch welche (auch wenn sie anders aussehen). Dagegen sage ich doch gar nichts :-D Zitat:
Aber bei Dependencies geht es nicht um Veröffentlichung. Sondern um Abhängigkeiten der ganzen Datei bzw. sogar des ganzen Projekts. Bei Uses-Klauseln in interface- und implementation-Teil sieht es in der Hinsicht aber genau gleich aus, was rechtfertigt dann die Unterscheidung? Zitat:
Uses-Klauseln beziehen sich effektiv aber auf das gesamte Projekt, weil das gesamte Projekt diese Dependencies tatsächlich benötigt, auch wenn ich nur in einer oder zwei Routinen tatsächlich von den externen Klassen/Routinen Gebrauch mache, |
AW: Uses: Interface vs. Implementation Section
Zitat:
Zitat:
Dein Vergleich mit dem Code ist zwar stark hinkend aber auch nicht blöd. Denn Exceptions sind doch der OOP, oder? :stupid: Im Übrigen ist 'gegen die Wand fahren lassen' ein anerkanntes Preventive-Maintenance-Werkzeug und nicht so leicht zu verbessern. Dein Argument mit den 1000 Zeilen bis zum implementation kann ich aber nachvollziehen. Wer so etwas ständig machen muss, wünscht sich, das die benötigten Units alle oben stehen. Na ja, dann soll er doch. Einfach den GExperts Uses Clause Manager starten, alle Units ins Interface verschieben, fertig. Eins noch: Die Units im Interface-Teil helfen, die Bedeutung der Unit im Kontext des Systems zu verstehen. Werden hier auch Units aufgelistet, die nur in der Implementierung benötigt werden, irritiert das. Was interessiert es mich, das der TCP-Wrapper mit ICS umgesetzt wurde (oder was weiss ich). Was ist denn nun klarer?
Delphi-Quellcode:
oder
Unit MyUnit;
Interface uses BarDefinition; Function AnExtremelyTrickyCalculation(SomeParameters : TBar) : Extended; implementation uses Wow, HardCore, DirtyStuff, EvenMoreDirtyStuff, PetersTricks, MikesHacks, DontPublishThis, VerySecret; ...
Delphi-Quellcode:
Also von der Seite aus betrachtet, würde ich den Autor der 2.Variante vierteilen.
Unit MyUnit;
Interface uses BarDefinition, Wow, HardCore, DirtyStuff, EvenMoreDirtyStuff, PetersTricks, MikesHacks, DontPublishThis, VerySecret; Function AnExtremelyTrickyCalculation(SomeParameters : TBar) : Extended; implementation ... So wie ich das sehe gibts hier zwei Meinungen: Die Praktiker sagen "Alle Units nach oben, sonst kriech ich Augenkrebs" Die Ästheten sagen "Alle Units da hin, wo sie hingehören, sonst kriech ich Augenkrebs" Tja. |
AW: Uses: Interface vs. Implementation Section
Zitat:
Alle Units da hin, wo sie hingehören, weil - es sich so gehört (Convention), - es für mich und andere leichter zu verstehen und zu warten ist (Clean Code), - es eine Form der Inline-Doku ist (Best Practice), - jede Unit-Referenz im Interface-Teil genau hinterfragt gehört (Law of Demeter) Und weil unsere Delphi-Welt so liberal ist, muss man keine der o.g. Gründe akzeptieren und es kompiliert trotzdem: Ist das nicht herrlich?! |
AW: Uses: Interface vs. Implementation Section
Zitat:
"Alle Units da hin, wo sie hingehören, weil - es für mich und andere leichter zu verstehen und zu warten ist (Clean Code)" ich bin jetzt der "andere", für mich ist es nicht leichter zu warten, man muss erst die units suchen, wenn diese schoen sortiert und nach externen bilbiotheken getrennt oben stehen ist das fuer mich leicht zu verstehen:
Delphi-Quellcode:
Einfach zum Einbinden in andere Projekte. Da muss ich nicht immer den Compiler gegen die Wand fahren lassen.
uses
windows, classes, sysutils, // delphi fastreport, fastscript, fastirgendwas // fastreport: libs/fastreport/src teechart, teetools; // teechart: libs/teechart/src |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 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