Frage

Premise

Ich glaube, dass es einen Weg gibt „gut“ und „schlecht“ Objektorientiertes Design-Techniken und objektiv zu definieren, als Gemeinschaft können wir bestimmen, was diese sind. Dies ist eine akademische Übung. Wenn mit Ernsthaftigkeit und Entschlossenheit getan, glaube ich es von großem Nutzen für die Gemeinschaft als Ganze sein kann. Die Gemeinde profitiert von einem Ort mit uns können alle auf sagen: „Diese Technik ist‚gut‘oder‚schlecht‘und wir sollten oder es nicht verwenden, wenn keine besonderen Umstände vorliegen.“

Planen

Für diese Bemühungen sollten wir uns auf objektorientierte Prinzipien konzentrieren (im Gegensatz zu Funktions, Set-basierte oder eine andere Art von Sprachen).

Ich habe nicht eine Antwort auf der Annahme, stattdessen würde ich die Antworten gerne auf die endgültige Sammlung beizutragen oder eine rationale Diskussion der Probleme sein.

Ich weiß, dass dies umstritten, aber ich glaube, wir etwas aus Eisen können. Es gibt Ausnahmen von den meisten jeder Regel und ich glaube, das ist, wo die Meinungsverschiedenheit fallen. Wir sollten Erklärungen abgeben und notieren Sie relevante Ausnahmen und Einwände von Abtrünnigen.

Basis

Ich mag einen Stich nehmen bei der Definition von „Gut“ und „Schlecht“:

  • „Good“ - Diese Technik wird zum ersten Mal und sein, eine dauerhafte Lösung arbeiten. Es wird leicht sein, später zu ändern und die Zeit Investition der Umsetzung schnell bezahlen. Es kann konsequent angewendet und leicht von Programmierern in Zukunft erkannt werden. Insgesamt trägt es zur guten Funktion und senkt Wartungskosten über die Lebensdauer des Produkts.

  • „Bad“ - Diese Technik kann auf kurze Sicht funktionieren, aber bald wird eine Haftung. Es ist sofort schwer zu ändern oder schwieriger wird, im Laufe der Zeit. Die anfängliche Investition kann klein oder groß sein, aber es wird schnell ein wachsend Kosten, schließlich ein versunkene Kosten zu werden und muß um ständig entfernt oder bearbeitet werden. Es wird subjektiv angelegt und inkonsistent und kann von Programmierern in Zukunft eine Überraschung oder nicht leicht erkennbar sein. Insgesamt trägt es zur entscheidenden steigenden Kosten für die Aufrechterhaltung und / oder das Produkt in Betrieb und hemmt oder verhindert Änderungen am Produkt. Durch die Hemmung oder Veränderung zu verhindern, werden nicht nur ein direkt Kosten, sondern eine Chance, Kosten und eine deutliche Haftung.

Starter

Als Beispiel dafür, was ich denke, ein guter Beitrag aussehen würde, würde Ich mag ein „Gut“ -Prinzip vorzuschlagen:

Separation of Concerns

[Kurzbeschreibung]

Beispiel

[Code oder eine andere Art von Beispiel]

Ziele

[Erklärung dessen, was Probleme dieses Prinzip verhindert]

Anwendbarkeit

[Warum, wo und wann würde ich dieses Prinzip verwenden?]

Ausnahmen

[Wann möchte nicht, dass ich dieses Prinzip verwenden, oder wo könnte es tatsächlich schädlich sein?]

Einwände

[Beachten Sie alle abweichenden Meinungen oder Einwände aus der Community hier]

War es hilfreich?

Lösung

Separation of Concerns

Bevorzugen Aggregation Mixin-Stil Vererbung

Während Funktionalität kann von einer Utility-Klasse durch Erben gewonnen werden, in vielen Fällen kann es alle mit einem Mitglied der Klasse gewonnen werden.

Beispiel (Boost.Noncopyable):

Boost.Noncopyable ist eine C ++ Klasse, die eine Kopie Konstruktor oder Zuweisungsoperator fehlt. Es kann als Basisklasse verwendet werden, um die Unterklasse zu verhindern, dass kopiert oder zugewiesen (dies ist das gemeinsame Verhalten). Es kann auch als direktes Mitglied verwendet wird

Konvertieren folgt aus:

class Foo : private boost::noncopyable { ... };

Um dies zu:

class Foo {
    ...
private:
    boost::noncopyable noncopyable_;
};

Beispiel (Abschließbare Objekt):

Java eingeführt, um das synchronized Schlüsselwort als ein Idiom jeden Objekt zu ermöglichen, in einer Thread-Weise verwendet werden. Dies kann in anderen Sprachen gespiegelt werden mutexes auf beliebige Objekte zu liefern. Ein gängiges Beispiel ist Datenstrukturen:

class ThreadsafeVector<T> : public Vector<T>, public Mutex { ... };

Stattdessen werden die beiden Klassen zusammen aggregiert könnten.

struct ThreadsafeVector<T> {
    Vector<T> vector;
    Mutex mutex;
}

Ziele

Die Vererbung wird häufig als ein Code-Wiederverwendungsmechanismus missbraucht. Wenn die Vererbung für etwas anderes als eine IS-A-Beziehung verwendet wird, wird der Gesamt Code Klarheit reduziert.

Mit tiefen Ketten, mixin Basisklassen stark erhöhen die Wahrscheinlichkeit eines „Diamond of Death“ Szenarios, bei dem eine Unterklasse mehr Kopien eines mixin Klasse erben endet.

Anwendbarkeit

Jede Sprache, die Mehrfachvererbung unterstützt.

Ausnahmen

Jeder Fall, in dem die mixin Klasse stellt oder erfordert eine Überlastung Mitglieder. In diesem Fall bedeutet Vererbung in der Regel eine Is-Umgesetzt-In-Terms-of-Beziehung, und ein Aggregat nicht ausreichen werden.

Einwände

Das Ergebnis dieser Transformation der öffentlichen Mitglieder führen können (z MyThreadSafeDataStructure einen öffentlich zugänglichen Mutex als Komponente aufweisen kann).

Andere Tipps

Es gibt einige gut verstanden Prinzipien, die einen guten Ausgangspunkt bilden könnten:

Es ist auch eine gute Idee, bestehende Entwurfsmuster zu studieren Prinzipien, die hinter ihnen zu finden, das wichtigste ist (in der Regel) bevorzugen Komposition der Vererbung.

Ich denke, die kurze Antwort ist, dass „gutes“ OO-Design unter Änderung robust ist, mit dem geringstenen Code Bruch für alle Anforderungen ändern. Wenn Sie alle üblichen Regeln betrachten, sie alle neigen dazu, zu demselben Ergebnis.

Die Schwierigkeit besteht darin, dass Sie die „Güte“ des Designs ohne Kontext beurteilen können; es ist, glaube ich, ein Satz, der für jede Modularisierung, eine Änderung der Anforderungen besteht, den Bruch maximieren, so dass jede Klasse in jedem Verfahren berührt werden.

Wenn Sie es seine strengen wollen, können Sie eine Sammlung von „change Fällen“ und um sie in der Wahrscheinlichkeits Reihenfolge entwickeln, so dass Sie den Bruch für die höchste Wahrscheinlichkeit Änderungen minimieren.

Auf den meisten Fällen jedoch einige gut entwickelte Intuition hilft viel: gerätespezifisch oder Plattform-spezifische Dinge sind in der Regel zu ändern, Geschäftsregeln und Geschäftsprozesse zu verändern neigen, während die Implementierungen von, sagen wir, Arithmetik, sehr selten ändern . (Nicht, wie Sie sich vorstellen können, nie. Betrachten wir zum Beispiel ein Business-System, das oder nicht in der Lage sein, kann die Verwendung von plattform unterstützt BCD-Arithmetik zu machen.)

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