SOLIDをフォローする場合、ファイルの読み取りと書き込みには2つの異なる責任がありますか?


13

SOLIDの調査を始めたばかりで、ファイルの読み取りとファイルへの書き込みが同じ責任であるかどうかはわかりません。

ターゲットは同じファイルタイプです。アプリケーションで.pdfを読み書きしたい。

それが違いを生む場合、アプリケーションはPythonです。

回答:


24

読み取りと書き込みの実装は、非常に凝集性が高い可能性が高いです。一方が変わると、もう一方も変わります。凝集度が高いことは、単一の責任を強く示すものであり、単一の責任の原則は、それらを同じクラスにまとめる必要があることを示しています。これらの操作の凝集度が低い場合、それらを分割すると保守性が向上する可能性があります。

ただし、書き込みなしでデータを読み取るだけの消費者、または読み取りなしで書き込みのみを行う消費者がいる場合、インターフェイスの観点から、インターフェイス分離の原則で規定されているようにこれらの操作を分離する必要があります。つまり、消費者は依存できる2つのインターフェイスを定義する必要がありますが、Fileクラスは両方のインターフェイスを実装します。


8

SOLID原則を適用してオブジェクトを設計する場合、ファイルの読み取りと書き込みを1つの責任と見なすことができます-永続データを操作します

ただし、ファイルの読み取りと書き込みを同じメソッドまたは関数に入れないでください。


5

他の答えのほとんどは、あなたの質問に重要な情報が欠けていることを見落としているようです-あなたが読み書きしようとしている文書が関連しているかどうか、そしてどのように関連しているか教えてくれませんでした!

アプリケーションに「ドキュメントオブジェクト」のようなものがあり、それを最初にPDFファイルに書き込み、次に同じファイルを再び類似のドキュメントオブジェクトに読み込みますか?またはその逆に、PDFをドキュメントに読み込み、それにいくつかの変更を加え、同じドキュメントを新しいPDFに再度保存しますか?それから、読み書きは一つの責任とみなされるべきです。アプリケーションが「PDFエディター」コンポーネント、または「PDF操作ツールキット」のようなものを含んでいるか、または含んでいる場合がこれに該当します。

ただし、アプリケーションの一部がレポートコンポーネントなどでPDFファイルを作成し、アプリケーションの別の無関係な部分が異なるPDF(たとえば、検索エンジンのメール添付ファイルエバリュエーター)を読み取り、後者のPDFには最初のユースケースとの共通点はないため、これらのタスクの役割は異なります。

特にPDFの場合、その2番目のユースケースは、さまざまな種類のアプリケーションで頻繁に見られるケースです。PDFの作成をサポートするライブラリ/コンポーネントははるかに多く、PDFの読み取りもサポートするライブラリ/コンポーネントはごく少数です。1つのライブラリを使用してPDFファイルを生成し、まったく異なるライブラリを使用してPDFを読み取る場合は、PDFの読み取りと書き込みが別々の責任であることは明らかです。


これはスティーブンの答えに似ていますが、具体的な例を提供します。
DavidS

@DavidS:Stevenの答えは非常に抽象的なものですが、OPがPDFファイルを具体的に要求したので、これにもっと具体的な方法で答えるのは理にかなっていると思います。そして、PDFについては、スティーブンの最初の文「読み取りと書き込みの実装は非常にまとまりがある可能性が高い」に同意しません -私の経験では、典型的なPDFのユースケースでは、反対が当てはまります(私は彼に賛成票を出しました)。
ドックブラウン

具体例は優れています。分析のために比較していました。素晴らしい答えです!
ダービッツ

3

Robert C. Martin)によると、責任とは特定のアクターにサービスを提供する一連の機能です。

アクターは、特定の責任の変更の唯一のソースである必要があります(変更する理由は1つだけである必要があります)。

あなたの場合、最初にアクタを最初のステップとして定義し、次に質問をする必要があります。ファイルを読んだり、書いたりするだけで興味がある俳優はいますか?

その場合、ファイルの読み取りと書き込みは2つの別々の責任です。変更のソースは複数あるため(多くのアクターは、読み取りロジックと書き込みについても同じことを変更するように要求する場合があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.