Frage

Hier ist eine Frage für die von Ihnen mit Erfahrung in größeren Projekten und API / Rahmen-Design.

Ich arbeite an einem Rahmen, der von vielen anderen Projekten in der Zukunft verwendet werden, so will ich es schön und erweiterbar machen, aber zugleich muss es einfach und leicht zu verstehen sein.

Ich weiß, dass eine Menge Leute beschweren sich, dass das .NET-Framework enthält zu viele versiegelte Klassen und private Mitglieder. Soll ich diese Kritik vermeiden, und öffnen Sie all meine Klassen mit vielen geschützten virtuellen Mitgliedern?

Ist es eine gute Idee, wie viele meiner Methoden und Eigenschaften geschützte virtuelle wie möglich zu machen? Unter welcher würden Situationen, die Sie vermeiden geschützte virtuelle und Mitglieder privat.

War es hilfreich?

Lösung

Ihre Klasse umfasst Datenelemente; Methoden, die grundlegenden interne Operationen auf diesem Datenelement ausführen, wo die Funktionalität soll nie immer privat ändern sollte. So Methoden, die grundlegenden Operationen mit Ihren Datenelementen wie Initialisierung und Zuweisung tun sollten privat sein. Andernfalls laufen Sie Gefahr, von „zweiter Ordnung“ Derivat Klassen einen unvollständigen Satz von Verhaltensweisen aktiviert bekommen; erste Ableitung Mitglieder das Verhalten der Klasse potenziell neu definieren könnte.

Das alles gesagt, ich glaube, Sie sollten mit der Definition Methoden sehr vorsichtig sein, als „virtuelle geschützt“. Ich würde bei der Definition von Methoden große Vorsicht walten lassen als „geschützte virtuelle“, da dies nicht nur erklärt der Möglichkeit von der Funktionalität überschreiben, aber in mancher Hinsicht eine Erwartung definieren von überschrieben Funktionalität. Das klingt für mich wie ein unterbestimmt Satz Verhalten außer Kraft zu setzen; Ich habe lieber einen gut definierten Satz Verhalten außer Kraft zu setzen. Wenn Sie eine sehr große Menge von overridable Verhaltensweisen haben wollen, würde ich eher aussehen in Aspect Oriented Programming, die für diese Art von Dingen in einer sehr strukturierten Art und Weise ermöglicht.

Andere Tipps

Wenn Sie eine Methode mit dem Wort virtuellen markieren Sie die Nutzern ermöglicht, die Art und Weise zu ändern, das Stück Logik ausgeführt wird. Für viele Zwecke, das ist genau das, was Sie wollen. Ich glaube, Sie bereits wissen.

Allerdings Typen sollten für diese Art von Erweiterung ausgelegt sein. Sie müssen aktiv die Methoden herausgreifen, wo es Sinn macht den Benutzer zu lassen, um das Verhalten zu ändern. Wenn Sie nur auf virtuellen schlagen überall Sie die Integrität des Typs Risiko zu ruinieren, ist es nicht wirklich der Benutzer helfen, die Art zu verstehen, und Sie können eine Reihe von Fehlern, einschließlich Sicherheitsfragen einzuführen.

Ich ziehe den konservativen Ansatz. Ich markiere alle meine Klassen mit sealed, wenn ich speziell Vererbung aktiviert werden soll und in diesen (wenigen) Fällen, die ich nur die erforderlichen Methoden virtuellen machen.

Es ist einfach, die sealed-Tag zu entfernen, wenn die Klassenvererbung in der Zukunft muss sich ändern zu können. Wenn Sie jedoch eine Klasse ändern möchten, die bereits als Basisklasse für eine andere Art benutzt wird, riskieren Sie die Unterklasse zu brechen, wenn Sie die Basisklasse ändern.

Mein Standpunkt ist:

  • Wenn Sie Benutzer events kann, seine bevorzugten Methoden protected.
  • Versuchen protected Methoden wie möglich zu vermeiden, wenn dies nicht möglich, dann müssen Sie es verwenden, -).

protected über private Die Wahl ist eine bewusste Design-Entscheidung. Sie besagt, dass Ihre Klasse ausdrücklich, dass Funktion unterstützt zu haben, mit all dem Overhead (Design und Implementierungsaufwand), die damit kommt. Ich würde nur protected in solchen Situationen verwendet, in denen ich weiß, dass es notwendig ist, vor allem weil ich es selbst tue. (Sie werden auch Kommentare von BCL-Entwickler auf der gleichen Linie finden wie das, was ich gesagt habe.)

Der virtual / nicht-virtual Performance-Unterschied ist irrelevant auf jeder Maschine, die stark genug ist, um die .NET Framework ausgeführt werden.

Nein, können Sie nicht „zu viele“ haben. Allerdings ist die Idee, wir sollten alle geschützt statt privat oder „versiegelt“ um jeden Preis zu vermeiden, ist einfach albern. Ich würde „Hilfsmethoden“ und interne Datenstrukturen privat halten.

  

Ist es eine gute Idee, wie viele meiner Methoden und Eigenschaften protected virtual wie möglich zu machen?

Nicht so gute Idee.

Geschützte virtuelle Methoden bieten Erweiterungspunkte im Rahmen, während Kupplung hinzugefügt wird.

Es gibt vielversprechende Techniken Erweiterbarkeit bieten: Zusammensetzung und Delegation .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top