2008-08-19 7 views
22

Eine answer zu einer Stack-Overflow-Frage besagt, dass ein bestimmtes Framework verletzt eine einfache und einfache OOP-Regel: Single-Responsibility-Prinzip (SRP).Ist die einfache Verantwortung Prinzip eine Regel der OOP?

Ist das Prinzip der einheitlichen Verantwortung wirklich eine Regel der OOP?

Mein Verständnis der Definition von Object Orientated Programming ist "ein Paradigma, wo Objekte und ihr Verhalten verwendet werden, um Software zu erstellen". Dazu gehören die folgenden Techniken: Einkapselung, Polymorphie & Vererbung.

Verstehen Sie mich jetzt nicht falsch - ich glaube, SRP ist der Schlüssel zu den meisten guten OO-Designs, aber ich denke, es gibt Fälle, in denen dieser Grundsatz gebrochen werden kann und sollte (genau wie Datenbanknormalisierungsregeln). Ich treibe aggressiv die Vorteile von SRP, und die große Mehrheit meines Codes folgt diesem Prinzip.

Aber, ist es eine Regel, und damit impliziert, dass es nicht gebrochen werden sollte?

Antwort

22

Sehr wenige Regeln, wenn überhaupt, in der Softwareentwicklung sind ohne Ausnahme. Einige Leute denken, dass es keinen Platz für goto gibt, aber sie sind falsch.

Soweit es OOP geht, gibt es keine einzige Definition von Objektorientiertheit, also abhängig davon, wen Sie fragen, erhalten Sie eine andere Reihe von harten und weichen Prinzipien, Muster und Praktiken.

Die klassische Idee von OOP ist, dass Nachrichten an ansonsten undurchsichtige Objekte gesendet werden und die Objekte die Nachricht mit Kenntnis ihrer eigenen Innereien interpretieren und dann eine Funktion irgendeiner Art ausführen.

SRP ist ein Software-Engineering-Prinzip, das auf die Rolle einer Klasse, einer Funktion oder eines Moduls angewendet werden kann. Es trägt zur Kohäsion von etwas bei, so dass es sich gut zusammenfügt, ohne dass nicht zusammenhängende Teile davon hängen oder mehrere Rollen haben, die die Dinge miteinander verflochten und komplizieren.

Auch mit nur einer Verantwortlichkeit kann dies immer noch von einer einzelnen Funktion bis zu einer Gruppe lose verbundener Funktionen reichen, die Teil eines gemeinsamen Themas sind. Solange du es vermeidest, ein Element in die Verantwortung zu nehmen, etwas zu verantworten, für das es nicht in erster Linie entwickelt wurde, oder etwas anderes zu tun, das die Einfachheit eines Objekts verwässert, dann verstoße gegen jedes Prinzip, das du willst.

Aber ich finde, dass es einfacher ist, SRP richtig zu machen, als etwas komplizierter zu machen, das genauso robust ist.

+0

Die ‚Ausgabe‘ Ich SRP zu überwinden versuchen über ist ‚wie viel ist zu viel‘? Sie könnten es auf eine lächerliche Ebene bringen und dabei 100 Klassen für jede Entität generieren. –

+3

@Prisoner ZERO: Lesen Sie die Antwort auf diese Frage: [Wie-bestimmen-Sie-bestimmen-wie-grob-oder-feinkörnig-eine-Verantwortung-sollte-wann-wann] (http://stackoverflow.com/ Fragen/2455705/How-Do-Sie-bestimmen-wie-grob-oder-fein-gekörnt-eine-Verantwortung-sollte-wann-wann) er macht einen guten Punkt. – User

5

Keine dieser Regeln sind Gesetze. Sie sind mehr Richtlinien und Best Practices. Es gibt Zeiten, in denen es nicht sinnvoll ist, den "Regeln" zu folgen und das zu tun, was für Ihre Situation am besten ist.

Haben Sie keine Angst zu tun, was Sie für richtig halten. Sie könnten tatsächlich mit neueren und besseren Regeln kommen.

1

Ahh, ich denke, das gehört zu einer Antwort, die ich gab. :)

Wie bei den meisten Regeln und Gesetzen, gibt es zugrunde liegende Motive, nach denen diese Regeln relevant sind - wenn das zugrundeliegende Motiv nicht vorhanden ist oder auf Ihren Fall anwendbar ist, dann können Sie die Regeln entsprechend verbiegen/brechen deine eigenen Bedürfnisse.

Das besagt, SRP ist keine Regel von OOP per se, sondern gilt als Best Practices zum Erstellen von OOP-Anwendungen, die sowohl einfach erweiterbar als auch in Einheiten testbar sind.

Beides sind Eigenschaften, die ich für die Entwicklung von Unternehmensanwendungen als äußerst wichtig erachte, wo die Wartung bestehender Anwendungen mehr Zeit in Anspruch nimmt als neue Entwicklungen.

+0

(Edit - Von "answer" zu "comment" verschoben) In der Tat, Jon, Ihre Antwort in dem anderen Thread hat diese Frage ausgelöst. Der Wortlaut der Antwort (ob beabsichtigt oder nicht) löste eine recht interessante Gedankenwelt aus, die in meinem Kopf entbrannte. Als ich "SRP" an meinen Arbeitsplatz drängte, fragte ich mich auf einer tieferen Ebene, wie ich solche Dinge formulieren sollte. Daher diese Frage. Danke für die Auslösung eines so interessanten Denkmusters für mich. :-) –

5

Kapitän Barbossa zu zitieren:

„..Und zweitens müssen Sie ein Pirat für den Code des Piraten sein anzuwenden und du bist nicht Und drittens ist der Code mehr, was Sie nennen würde“ Richtlinien "als tatsächliche Regeln ...."

Um Jack Sparrow zu zitieren & Gibbs. "Ich dachte, du solltest dich an den Code halten." Herr Gibbs: "Wir dachten, sie waren mehr tatsächliche Richtlinien."

So klar verstehen Piraten dies ziemlich gut.

Die „Regeln“ könnten über das Muster Bewegung als „Forces“

es so verstanden werden, ist eine Kraft versucht, die Klasse zu machen eine einzige Verantwortung. (Zusammenhalt)

Aber es gibt auch eine Kraft, die versucht, die Kopplung zu anderen Klassen zu halten.

Wie bei allen Design (nicht nur Code) ist die Antwort, dass es abhängt.

0

Wie viele der anderen Poster gesagt haben, sind alle Regeln gebrochen.
Davon abgesehen denke ich, dass SRP eine der wichtigeren Regeln für das Schreiben von gutem Code ist. Es ist nicht spezifisch für objektorientierte Programmierung, aber der "Verkapselung" -Teil von OOP ist sehr schwer richtig zu machen, wenn die Klasse nicht eine einzige Verantwortung hat.

Schließlich, wie Sie eine Klasse mit mehreren Verantwortlichkeiten richtig und einfach einkapseln? Normalerweise ist die Antwort mehrere Schnittstellen und in vielen Sprachen, die ziemlich viel helfen können, aber es ist immer noch verwirrend für die Benutzer Ihrer Klasse, die es in verschiedenen Situationen auf ganz unterschiedliche Weise anwenden kann.

0

SRP ist nur ein weiterer Ausdruck von ISP :-).

Und die „P“ bedeutet „Prinzip“, nicht „Regel“: D

Verwandte Themen