16 Stimmen

Wird das pimpl Idiom in c# verwendet?

Ich komme aus einem C#-Hintergrund und habe vor kurzem begonnen, C++ zu lernen. Eines der Dinge, auf die ich gestoßen bin, ist das pimpl Idiom. Ich habe C#-Entwicklung für einige große Unternehmen getan, aber nie kam über sie.

Vielleicht ist das falsch, aber ich habe es so verstanden, dass es in C++ wegen der Verwendung von Header-Dateien und keiner Option für partielle Klassen notwendig ist.

Aber in C# würden wir die ganze Zeit Anwendungen mit Klassenbibliotheken erstellen. Wenn sich im Bibliothekscode etwas änderte, wurde er zu einer DLL neu kompiliert und die neue DLL im Anwendungsprojekt referenziert.

Ich verstehe nicht wirklich, warum das Gleiche nicht auch mit C++ möglich ist. Pimpl sieht für mich einfach wie ein hässlicher Hack aus.

27voto

Eric Lippert Punkte 628543

Wird das pimpl Idiom in c# verwendet?

Das hängt davon ab, was Sie mit dieser Redewendung meinen.

Die betreffende Redewendung besteht im Wesentlichen darin, die Implementierungsdetails eines Typs in eine Klasse und die öffentliche Oberfläche in eine Wrapper-Klasse zu trennen, die einfach einen Zeiger auf die Implementierungsklasse enthält.

Dies hat zwei Vorteile.

Erstens kann es in C++ zu Verbesserungen bei der Kompilierzeit führen, da die Nutzer der öffentlichen Fläche nur die Header-Datei mit der öffentlichen Fläche parsen müssen; sie müssen nicht die Header-Datei mit den Implementierungsdetails parsen.

Zweitens führt es zu einer sehr sauberen Trennung von Schnittstelle und Implementierung; die Implementierung kann sich völlig verändern, ohne dass dies Auswirkungen auf den Verbraucher hat, da dieser die Implementierungsdetails nie zu Gesicht bekommt.

Der erste Vorteil ist in C# nicht von Bedeutung. Der C#-Compiler ist schnell (zum großen Teil natürlich, weil die Sprache so konzipiert wurde, dass sie schnell zu kompilieren ist).

Der zweite Vorteil ist in C# von großem Nutzen. In C# wäre die idiomatische Art und Weise, dieses Muster zu implementieren, die Erstellung einer private verschachtelte Klasse die die "eigentliche" Arbeit macht, und eine öffentliche Klasse, die nur eine Fassade mit der öffentlichen Oberfläche ist.

Eine Technik, die ich in C# besonders mag, ist es, die öffentliche Klasse zur Basisklasse der privaten verschachtelten Klasse, geben Sie der Basisklasse einen privaten Konstruktor, um Erweiterungen durch Dritte zu verhindern, und verwenden Sie das Fabrikmuster, um Instanzen der privaten verschachtelten Klasse auszugeben.

Ich verstehe nicht wirklich, warum das Gleiche nicht auch mit C++ möglich ist.

Dann ermutige ich Sie, einen C++-Compiler zu schreiben, der dies tut. Entweder wird es Ihnen gelingen, einen viel schnelleren C++-Compiler zu erstellen, oder Sie werden herausfinden, warum das Gleiche in C++ nicht machbar ist. Sie profitieren so oder so!

4voto

Paul Michalik Punkte 4256

Ja, das ist es (ein "Hack"). Die Ursache dafür ist das textbasierte Kompilierungsmodell für ANSI C++: Der Compiler muss die textuelle Darstellung des Codes sehen, um etwas Brauchbares zu erzeugen. Nicht, dass es so sein muss, aber so wird es heute gemacht.

1voto

Roman Kutlak Punkte 2626

Wie Eric schon sagte, hat das Idiom pimpl zwei Zwecke. Ich möchte nur hinzufügen, dass der zweite Zweck (Trennung von Schnittstelle und Implementierung) eines der bekannten Software-Entwurfsmuster ist: Bridge (auch bekannt als Handle/Body, glaube ich). Sie können mehr darüber lesen aquí

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X