videoでは、作成者は既存のクラスを取り、それにSingle Responsibility Principleを割り当てます。彼は、データへのアクセス、書式設定、およびレポートの印刷の仕事を持つ印刷クラスを取る。彼は各メソッドを独自のクラスに分割し、データアクセスを処理するDataAccessクラスを作成し、ReportFormatterクラスを作成してReportの書式を処理し、ReportPrinterクラスを作成してReportの印刷を処理します。元のReportクラスには、ReportPrinterのクラスメソッドPrintを呼び出すPrint()メソッドが1つ残っています。 DataAccessとReportFormatterは責任を持っているように見えますが、ReportPrinterはDataAcessとReportFormatterを使用しているため、SRPを壊したり、誤解していませんか?以下の例では、単一の責任原則について混乱しています
答えて
単一責任原則は、特定のクラスが単一の責任(または「変更理由」)を持つ必要があることを示します。その責任はどのように満たされるべきかを示すものではありません。そうすることで、他の複数のクラスの協力者としての協力が必要になることがあります。
SRPは依存関係に対処していません。クラスを単一責任クラスに分割すると、後でその依存関係を解除することが容易になります。 SRPは、一緒に言及された2つの原則のうちの1つ、Cohesion and Couplingの1つに取り組んでいます。 SRPは約高い凝集力であり、依存性は高い結合性を示す可能性がある。良いデザインは、高い結合力と低い結合性を持っています。ときには、これらの2つの原則が不安定になることがあります。
ビデオを見ることなく、合理的なデザインのように聞こえる。 SRPは壊れていません。データアクセスを扱うメソッドがReportPrinterクラスには表示されないため、「必要なデータを取得するために何かを呼び出せる」という概念のみが表示されます。
これを少し押して、データアクセスクラス、フォーマッタクラス、およびプリンタクラスのアクティビティを調整するだけのコーディネータクラスを持つことができます。また、コーディネーターがデータをフォーマッターに送信してプリンターに送信し、コーディネーターがプリンターについて(直接的に)認識しないように、さまざまな方法でオブジェクトを配置することもできます。
狭く絞ったオブジェクトの取り組みを調整するために何かを知っておく必要があります。それが彼らの責任となります。あなたが知らないかケアしていない限り、他のオブジェクトが行うことのアイデアや概念について知っていてもかまいません。how彼らはそれを行います。インターフェースを「責任の継ぎ目」と考えることは良いスタートです。
オブジェクトを「実行」するのではなく、互いにデータを渡すものとしてオブジェクトを考えると便利です。したがって、ReportFormatterは、既存のレポートで(概念的に)オブジェクトを実行するのではなく、書式設定されたレポートを表す新しいオブジェクトを返す(または転送する)。
いいえSRPを壊さない。
はDataAccess implements IDataAccess
ReportFormatter implements IReportFormatter
ReportPrinter implements IReportPrinter
イベントReportPrinter relies on DataAccess and ReportFormatter
ものの、IDataAccess or IReportFormatter
の契約に何らかの変化がそれぞれDataAccess and ReportFormatter
によって実施されるべきであると仮定します。 ReportPrinter
は、これらのクラスの責任の変更について心配しません。
Composition
を指定するか、Mediatorパターンを実装して、これらの3つのクラス間で緩やかな結合を行い、ジョブを完了させることができます。 部分をresponsibility
から離れた場所に保管してください。
- 1. 単一責任の原則と集約
- 2. 単一の責任原則とイベントリスナー
- 3. 単一の責任原則 - チェス盤ピース
- 4. 単一の責任原則:変更理由の詳細度
- 5. Asp.Net MVCアクション - 懸念の分離/単一の責任原則
- 6. 単一責任の原則は有効性の意味を意味します
- 7. ビジネスオブジェクトの静的ファクトリが単一責任原則に違反していますか?
- 8. JavaコアのIteratorにおける単一責任の原則の違反
- 9. シンプルなオブジェクト - 単一の責任とカプセル化の原則による正しいデザインは何ですか?
- 10. "リッチドメインモデル"は単一責任原則に違反する可能性がありますか?
- 11. 「単一責任原則」を使用すると、コンテナにパブリックセッターが強制されます
- 12. は、initWithCoderとカスタムUIViewsについて混乱しています
- 13. 単一の責任原則:クラス内のすべてのパブリックメソッドはすべてのクラス依存関係を使用する必要がありますか?
- 14. テーブル内のルックアップについて混乱しています
- 15. Javascriptのforループについて混乱しています
- 16. C++のリンカについて混乱しています
- 17. Haskellのカスタムデータ型について混乱しています
- 18. perlのエンティティについて混乱しています.pm
- 19. Android:アプリケーションの状態について混乱しています
- 20. AutoMapperの使用について混乱しています
- 21. は、機能についての混乱:
- 22. 一般的なコードレイアウトなどが - 私は、レイアウトを含めについて混乱しています(例アクションバー)
- 23. まだタイムゾーンとコンバージョンについて混乱しています
- 24. は、複数のインタフェースを実装してい<a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Wikipedia</a>から単一責任の原則
- 25. ディレクトリ構造について少し混乱しています
- 26. イベントが関わったときのDemeterの法則/単一責任
- 27. "Scala in Depth"で混乱しています。オプションの例
- 28. Railsについて混乱していますhas_and_belongs_to_many Association
- 29. 「respond_to?」について混乱しています。方法
- 30. ライブラリについて混乱しています
私は、実装全体の単一のクラスが4つの別々のクラスよりも高い結合性を持っていると主張します。単一のクラスは、データアクセス、書式設定、および印刷の実装に結合され、4つの別々のクラスは各クラスの定義にのみ結合されます。より多くのクラスがあるからといって、カップリングが高いことを意味するわけではありません。 –