Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi uses im implementation bzw. interface wann? (https://www.delphipraxis.net/90692-uses-im-implementation-bzw-interface-wann.html)

OG Karotte 22. Apr 2007 09:19


uses im implementation bzw. interface wann?
 
Hallo zusammen,
wer erklärt einem Hobbyprogrammierer die richtige Verwendung bzw. den Unterschied der uses-Klausel im implementation bzw. im interface Teil einer Unit. Sprich wann verwende ich was...

Bislang kenne ich nur den Fall, das man dadurch zwei Units gegenseitig nutzen kann. Aber ist das schon alles???

FAlter 22. Apr 2007 09:33

Re: uses im implementation bzw. interface wann?
 
Hi,

du solltest Units nur so nutzen, wie du sie benötigst. Brauchst du sie also nur im Implementation-Abschnitt, so solltest du sie dort deklarieren.

Beispiel:
Delphi-Quellcode:
...

implementation

uses
  inifiles;

procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(...);
  try
    ...
  finally
    Ini.Free;
  end;
end;
Wenn du sie jedoch bereits im Interface-Abschnitt (für Typdeklarationen oder globale Variablen) benötigst, so muss sie dort hinter uses einfügen:

Delphi-Quellcode:
unit MyGrasphic;

uses
  SysUtils, Graphics;

type
  EMyGraphic = class(Exception); //Exception aus SysUtils
  TMyGraphic = class(TGraphic)  //TGraphic aus Graphics
  ...
  public
    procedure foo;
  end;

interface

uses
  MyGraphicConsts;

procedure TMyGraphic.Foo;
begin
  raise EMyGraphic.CreateFmt(StrEMyGraphicFoo, ['bar']);
    //StrEMyGraphicsFoo aus MyGraphicConsts nur hier benötigtbenutzt
end;

...
Übrigens gibts da ein Tool (Bei Google suchenIcarus Uses List Analyzer), dass deine uses-Liste überprüft und die empfdehlungen ausgibt, ob du eine Unit überhaupt benötigst oder ob du sie nach implementation verschieben kannst...

Mfg
FAlter

OG Karotte 22. Apr 2007 10:19

Re: uses im implementation bzw. interface wann?
 
Hallo Felix,
aber wo ist denn nun der grundlegende Unterschied ob interface oder implementation. :gruebel:

Rein theoretisch könnte ich doch alle Units immer im interface unterbringen oder wirkt sich das später auf Größe und/oder Performance der Anwendung aus, wenn ich sie grundsätzlich im implementation unterbringe??? :gruebel:

mkinzler 22. Apr 2007 10:27

Re: uses im implementation bzw. interface wann?
 
http://www.delphipraxis.net/internal...t.php?t=107895

Reinhard Kern 22. Apr 2007 10:33

Re: uses im implementation bzw. interface wann?
 
Zitat:

Zitat von OG Karotte
Hallo Felix,
aber wo ist denn nun der grundlegende Unterschied ob interface oder implementation. :gruebel:

Rein theoretisch könnte ich doch alle Units immer im interface unterbringen oder wirkt sich das später auf Größe und/oder Performance der Anwendung aus, wenn ich sie grundsätzlich im implementation unterbringe??? :gruebel:

Nein, der Unterschied ist eben nur, dass ein Uses im Implementation-Abschnitt nicht zu einer Kollision bzw. gegenseitigem Bezug führen kann (das kennst du ja schon), da bist du also auf der sicheren Seite. Allerdings machen es die meisten aus Bequemlichkeit nicht so, aber deswegen ist der Rat von Felix noch lange nicht schlecht. Es geht um die "Sichtbarkeit" von Deklarationen, und man sollte grundsätzlich nichts in einem weiteren Bereich sichtbar machen als notwendig wegen der Risiken und Nebenwirkungen.

Gruss Reinhard

TonyR 22. Apr 2007 10:43

Re: uses im implementation bzw. interface wann?
 
Zitat:

Zitat von Reinhard Kern
Nein, der Unterschied ist eben nur, dass ein Uses im Implementation-Abschnitt nicht zu einer Kollision bzw. gegenseitigem Bezug führen kann ...

Genau, genau... und nun nur nochmal ne andere Quelle, nämlich die von dsdt.info haben sich da bei Positionen der uses-Klausel auch Gedanken gemacht :wink:
http://www.dsdt.info/grundlagen/sprache/units.php

OG Karotte 22. Apr 2007 10:53

Re: uses im implementation bzw. interface wann?
 
Danke für Links und Antworten / Ausführungen

Somit ergibt sich: implementation und interface dienen "nur" der Aufhebung / Umgehung von zirkulären Bezügen, haben keine Auswirkung auf die Größe / Performance der Anwendung, dienen aber dem Programmierer zur Unterstützung bezüglich der Lesbarkeit des Quellcodes (und helfen somit Fehler zu vermeiden).

(Schade, hatte insgeheim gehofft, das sich da noch mehr hinter verbirgt ...)

Reinhard Kern 22. Apr 2007 11:17

Re: uses im implementation bzw. interface wann?
 
Zitat:

Zitat von OG Karotte
Danke für Links und Antworten / Ausführungen

Somit ergibt sich: implementation und interface dienen "nur" der Aufhebung / Umgehung von zirkulären Bezügen, haben keine Auswirkung auf die Größe / Performance der Anwendung, dienen aber dem Programmierer zur Unterstützung bezüglich der Lesbarkeit des Quellcodes (und helfen somit Fehler zu vermeiden).

(Schade, hatte insgeheim gehofft, das sich da noch mehr hinter verbirgt ...)

Na das ist doch eine Menge... du solltest dich mit dem Konzept der Sichtbarkeit mehr vertraut machen, in anderen Sprachen als "NameSpaces" eingeführt. Interface und Implemetation regeln die Sichtbarkeit in gleicher Weise wie Prozedur-Kopf und Prozedur-Rumpf: Der Prozedurkopf ist das, was für andere Programmteile (bzw.Programmierer) sichtbar ist, entsprechend Interface. Die Details im Prozedur-Rumpf (Implementation) sind dagegen anderweitig nicht sichtbar und so können lokale Variablen auch keine Nebenwirkungen haben.

Gruss Reinhard

Muetze1 22. Apr 2007 12:19

Re: uses im implementation bzw. interface wann?
 
Ausserdem gibt es noch einen anderen Unterschied: Beim compilieren durchläuft der Compiler beim auflösen einer Unit primär erstmal die Uses Liste im Interface Abschnitt und geht die Units wiederrum durch. Desto mehr Units im Interfaceabschnitt stehen (wahrscheinlich sogar unnötig), dann parsed er diese auch unnötigerweise. Von daher ist es schon bei grossen Projekten (> 2 Millionen Codezeilen) beim Compilieren merklich zu spüren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 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