21

Stack Overflowの質問に対する回答では、特定のフレームワークが単純で単純なOOPルールである単一責任原則(SRP)に違反していると述べられています。

単一責任の原則は本当にOOPのルールですか?

オブジェクト指向プログラミングの定義についての私の理解は、「オブジェクトとその動作を使用してソフトウェアを作成するパラダイム」です。これには、カプセル化、ポリモーフィズム、継承などの手法が含まれます。

誤解しないでください。SRPが最も優れたオブジェクト指向設計の鍵であると信じていますが、この原則が破られる可能性があり、破られるべきである場合があると感じています(データベースの正規化ルールのように)。私はSRPの利点を積極的に推進しており、私のコードの大部分はこの原則に従っています。

しかし、それはルールであり、したがって、それが破られるべきではないことを意味しますか?

4

6 に答える 6

22

ソフトウェア開発におけるルールがあったとしても、例外なくごくわずかです。後藤の場所はないと思う人もいますが、間違っています。

OOPに関する限り、オブジェクト指向の定義は1つではないため、誰に依頼するかによって、ハードとソフトの原則、パターン、およびプラクティスのセットが異なります。

OOPの古典的な考え方は、メッセージが不透明なオブジェクトに送信され、オブジェクトが自身の内部の知識を使用してメッセージを解釈し、ある種の機能を実行することです。

SRPは、クラス、関数、またはモジュールの役割に適用できるソフトウェアエンジニアリングの原則です。それは何かのまとまりに貢献するので、無関係なビットがぶら下がったり、物事を絡み合わせたり複雑にしたりする複数の役割を持つことなく、うまくまとめられて動作します。

責任が1つしかない場合でも、それは単一の機能から、共通のテーマの一部であるゆるやかに関連する機能のグループにまで及ぶ可能性があります。要素が主に設計されていないものの責任を引き受けるために仮帆装を避けている限り、またはオブジェクトの単純さを薄める他のアドホックなことをして、あなたが望む原則に違反します。

しかし、SRPを正しくする方が、同じように堅牢なより複雑なことを行うよりも簡単であることがわかりました。

于 2008-08-19T00:32:41.993 に答える
5

これらの規則はいずれも法律ではありません。これらは、より多くのガイドラインとベストプラクティスです。「ルール」に従うことが意味をなさず、自分の状況に最適なことをする必要がある場合があります。

あなたが正しいと思うことをすることを恐れないでください。あなたは実際に新しくてより良いルールを思い付くかもしれません。

于 2008-08-19T01:19:32.790 に答える
5

バルボッサ船長の言葉を引用すると:

「..そして第二に、海賊のコードが適用されるためには、あなたは海賊でなければなりません。あなたはそうではありません.そして第三に、コードは実際のルールというよりも、あなたが「ガイドライン」と呼ぶものです....」

ジャック・スパロウとギブスの引用. 「あなたは掟を守るべきだと思っていました。」ギブス氏: 「私たちは、それらがより現実的なガイドラインであると考えました。」

明らかに、海賊はこれをかなりよく理解しています。

「ルール」は、「力」としてのパターンの動きを介して理解できます。

そのため、クラスに単一の責任を持たせようとする力があります。(凝集)

しかし、他のクラスとの結合を抑えようとする力もあります。

すべての設計 (コードだけでなく) と同様に、答えは依存するということです。

于 2008-09-05T07:43:48.473 に答える
1

ああ、これは私が与えた答えに関係していると思います。:)

ほとんどの規則や法律と同様に、これらの規則が関連する根本的な動機があります。根本的な動機が存在しないか、ケースに適用できない場合は、自分のニーズに応じて規則を自由に曲げたり破ったりできます。

そうは言っても、SRP自体はOOPのルールではありませんが、簡単に拡張でき、ユニットテストが可能なOOPアプリケーションを作成するためのベストプラクティスと見なされています。

どちらも、既存のアプリケーションの保守が新しい開発よりも多くの時間を費やすエンタープライズアプリケーション開発において最も重要であると私が考える特性です。

于 2008-08-19T01:53:07.183 に答える
0

他の多くの投稿者が言っているように、すべてのルールは破るために作られています。
そうは言っても、SRP は良いコードを書くためのより重要なルールの 1 つだと思います。オブジェクト指向プログラミングに固有のものではありませんが、クラスが単一の責任を持たない場合、OOP の「カプセル化」部分を正しく行うのは非常に困難です。

結局のところ、複数の責任を持つクラスを正しく簡単にカプセル化するにはどうすればよいでしょうか? 通常、答えは複数のインターフェースであり、多くの言語でかなり役立ちますが、クラスのユーザーは、さまざまな状況でまったく異なる方法で適用される可能性があるため、依然として混乱しています。

于 2008-11-25T09:39:52.660 に答える
-1

SRP は ISP の単なる別の表現です :-) .

そして、「P」は「ルール」ではなく「原則」を意味します:D

于 2008-11-25T14:48:26.827 に答える