私は3つの基本的な手順を含む多くのコードを記述しています。
- どこかからデータを取得します。
- そのデータを変換します。
- そのデータをどこかに置きます。
私は通常、それぞれの設計パターンに触発された3種類のクラスを使用します。
- ファクトリー-あるリソースからオブジェクトを構築します。
- メディエーター-ファクトリーを使用するには、変換を実行してから、司令官を使用します。
- 司令官-そのデータを別の場所に配置します。
私のクラスは非常に小さく、多くの場合単一の(パブリック)メソッドです。たとえば、データの取得、データの変換、作業の実行、データの保存などです。これはクラスの急増につながりますが、一般的にはうまく機能します。
私がテストに来るときに苦労しているのは、結局は密結合テストになります。例えば;
- 工場-ディスクからファイルを読み取ります。
- Commander-ファイルをディスクに書き込みます。
もう1つがないとテストできません。ディスクの読み取り/書き込みを行うための追加の「テスト」コードを作成することもできますが、それから繰り返します。
.Netを見ると、Fileクラスは別のアプローチをとっており、(私の)ファクトリーとコマンダーの責任を組み合わせています。Create、Delete、Exists、Readの機能がすべて1か所にあります。
.Netの例をたどって、特に外部リソースを扱う場合は、クラスを一緒に結合する必要がありますか?結合されたコードですが、意図的です。テストではなく、元の実装で発生します。
ここでの問題は、単一責任の原則をやや熱心に適用したことですか?読み取りと書き込みを担当する個別のクラスがあります。特定のリソース(システムディスクなど)の処理を担当する結合クラスがある場合。
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
-「責任」と「やるべきこと」を混同していることに注意してください。責任は「関心領域」のようなものです。Fileクラスの責任は、ファイル操作を実行することです。
File
C#からのライブラリの重要な点は、File
クラスがファサードであり、すべてのファイル操作を1か所にまとめることができるということですが、内部では、クラスと同様の読み取り/書き込みクラスを使用して、実際には、ファイル処理のためのより複雑なロジックが含まれています。File
ファイルシステムを実際に使用するプロセスは別のレイヤーの背後で抽象化されるため、このようなクラス()は依然としてSRPに準拠しています。それが事実であるとは言いませんが、そうである可能性があります。:)