2013-08-02 2 views
6

Wenn ich eine Einheit in die uses-Klausel des Implementierungsabschnitts einer Einheit lege, sind die in dieser Einheit deklarierten Bezeichner für den Schnittstellenabschnitt nicht verfügbar.Welche Vorteile bringt das Hinzufügen einer Use-Klausel für eine Unit im Implementierungsabschnitt?

Was ist der Vorteil, wenn Sie das tun und Kennungen von der angegebenen Einheit in der Schnittstelle nicht verwenden können?

Gibt es einen praktischen Vorteil (wie zum Beispiel die Vermeidung unerwünschter Nebenwirkungen), wenn Sie im Abschnitt "Implementation" gebrauchte Einheiten hinzufügen, anstatt einfach den Abschnitt "interface" zu verwenden?

Antwort

5

Das größte Problem besteht darin, dass die Verwendung im Schnittstellenabschnitt zu zirkulären Abhängigkeiten und Kompilierungsfehlern führen kann. Wenn Einheit A Einheit B im Schnittstellenabschnitt verwendet, kann Einheit B die Einheit A in ihrem Schnittstellenabschnitt nicht verwenden.

So, Sie sind oft gezwungen, zumindest einige Anwendungen in den Implementierungsabschnitt zu setzen.

Sonst ziehe ich es persönlich vor, wenn möglich Einheitsnutzungen in den Schnittstellenbereich zu setzen. Der Hauptgrund dafür ist das Scoping und Verstecken. Wenn es Namens-Scoping-Konflikte gibt (zwei Einheiten definieren denselben Namen und die zweite Verwendung blendet die erste aus), dann war derselbe Name in der gesamten Einheit im Gültigkeitsbereich.

+2

Ich benutze den entgegengesetzten Ansatz in sehr großen Codebasen, obwohl ich bezweifle, dass es in kleinen wichtig ist; Minimieren Sie die Größe der Interface uses-Klausel. Hält Namespaces weniger verschmutzt. –

+2

Entwickler neigen auch dazu, so viele Einheiten wie möglich in den "Implementierungsbereich" zu stellen, die für die "Schnittstelle" nicht notwendig sind, wie "StrUtils" und "Math", obwohl das nicht notwendigerweise Auswirkungen hat. –

+0

@Warren Die Verwendung von Einheiten fügt keinem Namespace Symbole hinzu. –

13

Das Hinzufügen einer Einheit zur uses-Klausel des implementation-Abschnitts ermöglicht, dass diese Einheit nur eine private Abhängigkeit zur implementation ist, nicht zur interface. Wenn UnitA UnitB verwendet, aber niemand außerhalb von UnitA interessiert, ob UnitA UnitB verwendet, weil die UnitA-Schnittstelle UnitB nicht verwendet, warum sollte dann die Abhängigkeit angekündigt und die interface durcheinander gebracht werden? Wenn Sie UnitB jemals entfernen und/oder durch etwas anderes ersetzen müssen, wird durch die Deklaration in der uses-Klausel des Abschnitts implementation eine interface Änderung vermieden, die sich auf alle Einheiten auswirken würde, die UnitA verwenden.

+2

+1 Guter Rat, um jegliche "Versuchung" von Zirkelreferenzen zu vermeiden, wenn sie nicht benötigt werden. Eine solche klare/obligatorische/syntaxgetriebene Unterscheidung zwischen Interface und Implementierung gefällt mir in Delphi sehr gut und fehlt in Java oder C#. –

+0

@Arnaud Putting verwendet in der Implementierung Abschnitt macht es einfach, zirkuläre Referenzen einzuführen. Es gibt einen klaren Unterschied zwischen Interface und Implementierung in C# und Java. –

+0

@DavidHeffernan Ich sprach nicht von "Interface" und "Klasse" Keyword-Unterscheidung. "Es gibt einen klaren Unterschied zwischen Interface und Implementierung in C# und Java" ... dank der IDE-Faltungsfähigkeiten? Oder zu den öffentlichen/privaten/geschützten Attributen? IMHO ist es nicht so klar wie die "Schnittstelle ... Implementierung" Abschnitte in Pascal. –

Verwandte Themen