私は2、3年ごとにこの質問に戻るので、ここで質問することで、一度にすべてを解決することにしました。
したがって、シーケンス:
それで、私の現在のアプローチの流れは何ですか? 「適切な現代OOPアーキテクチャー」の方法でそれを解決する方法は?
OperationsServiceをStorageServiceの内部クラスにしますか?これは、すべてのコードが同じファイルに格納されることを意味します(SOLIDのかなりの違反)。
OperationsServiceをStorageServiceの内部クラスにして、部分的にして別のファイルに移動しますか?ちょっと気味が悪いようです。
一般的には、アプリの残りの部分でOperationsServiceを公開したり(IoCコンテナーに登録したりすることすらしないように)したくありません。 OperationsServiceはそれほど大きくないので、3番目(ある種のラッパーサービス)も作成したくありません。
オブジェクトに関しては、「オブジェクトAにはプライベートフィールドがあり、オブジェクトBに対してのみアクセス可能である必要があります。オブジェクトのAの責任はIOであり、オブジェクトのBの責任は一部のロジックであるため、マージできません」と問題を言い換えることができます。
まとめると、次のようになります。
特定のデータに関してOperationsService
をシステムの他の部分より優先する1つの方法は、必要に応じてそのようなデータを直接渡すことです。構成操作ロジックをOperationsService
内に保持し、 StorageService
にパブリックAcceptOperations()
メソッドを追加します。これは、OperationsService
オブジェクトを引数として受け取り、関連する構成操作ロジックを呼び出して、プライベートに保持されている関連構成データを直接渡します。
具体的には、GetConfigPropertyByNameAndDoSomeMagicWithIt()
をOperationsService
のメンバーにすることで、関連するStorageService
インスタンスでAcceptOperations()
を呼び出し、this
を引数として。 AcceptOperations()
自体は、パラメーターとして指定されたOperationsService
インスタンスに対して具体的なManipulateConfig()
メソッドを呼び出し、内部構成データをManipulateConfig()
。
この提案は一部、クラシックOOP Visitor Pattern に似ていますが、Double Dispatchイディオムですが、誰が何を訪問できるかを制限的に定義するという概念を維持し、そのような責任の分離を実行するパターンの背後にある元のアイデアを確実に維持します "... [それ構造]を変更せずに既存のオブジェクト構造に新しい操作を追加する機能を提供します。 "このようなパターンの全体的な考え方は、 Open-closed主義 に従うことを支援することですこれはSOLID原則の1つであり、それを維持することは、そもそもあなたの懸念事項であると述べたものです。
友好的にしたいクラスを別のアセンブリに配置できます。次に、アセンブリの外部から利用可能にするものだけをpublicとして宣言します。他のアセンブリのクラスから非表示にするものは、宣言internalです。これはあなたが望むものをほとんどあなたに与えるはずです。
OOPの観点からは、友人はパブリックメンバー以外のアクセスを許可するため、これは本質的に反対のOOPなので、これは友人よりも優れています。
オブジェクトは内部状態を処理することになっており、必要に応じてオブジェクト自体を変更する必要があります。オブジェクトを誤って抽出したと思います。 _Storage Service
_は実際には永続性マネージャーであり、内部値として構成値を保持するべきではありません。ストレージサービスは、ファイルからオブジェクトへの変換、およびその逆の変換を管理するだけです。次に、構成値を処理したりそれらを公開したりするすべてのメソッドを持つ構成オブジェクト、または作成時に構成オブジェクトを受け入れ、必要なアクセスメソッドを公開する構成マネージャークラスを使用できます。
あなたが問題を抱えている理由は、_Storage Service
_が現在単一責任の原則を破っているからです。 GetConfigPropertyByNameAndDoSomeMagicWithIt()
でさらに分解しようとすると、より明確になります。そのような場合の適切な解決策は、より明確な責任を持つオブジェクトにリファクタリングすることです。友人は貧弱な設計に対する応急処置の解決策です。
私が見逃しているのは、IConfigurationServiceであり、その具体的なバージョンはIConfigStorageServiceに依存しています。ファイルから設定を取得するLocalConfigStorageService、またはクラウドバケットから取得するS3ConfigStorageServiceを使用できます。または、データベースから取得するDatabaseConfigStorageService。 3つのケースすべてで、IConfigStorageServiceは、構成を取得し、IConfigurationServiceの構成に対する更新を格納します。
IConfigurationServiceは、返された構成を使用して、コンシューマーの要求に応答します。
これは具体的には Bridge Pattern のインスタンスです