私が参加した最近のいくつかのプロジェクトでは、次のコーディング パターンにはまっています: (これに適切な名前があるかどうかはわかりませんが、とにかく...)
あるオブジェクトが何らかの決定された状態にあり、この状態を外部から変更したくないとしましょう。これらの変更は、任意の動作を意味し、任意のアルゴリズムを呼び出す可能性がありますが、実際には、オブジェクトの状態(メンバー状態、データ状態など)の変更に焦点を当てています。
そして、これらのオブジェクトを変更する 1 つの個別の方法を a と呼びましょうMutator
。Mutators
は一度(一般的に)適用され、のような内部メソッドがapply(Target& target, ...)
あり、オブジェクトの状態の変更を即座に引き起こします(実際、それらはある種の機能オブジェクトです)。
また、チェーンに簡単に同化して、1 つずつ適用することもできます ( Mutator m1, m2, ...
)。BasicMutator
また、いくつかの基本的なwithvirtual void apply(...)
メソッドから派生させることもできます。
アクセスの点で異なる と というクラスを紹介しました。まず、オブジェクトの内部状態を変更することもできInnerMutator
、フレンド( )として宣言する必要があります。ExplicitMutator
friend InnerMutator::access;
これらのプロジェクトでは、私のロジックは次のように機能するようになりました。
- 利用可能なミューテーターを準備し、適用するものを選択します
- を作成し、
object
特定の状態に設定します foreach (mutator) mutator.apply(object);
今質問です。
このスキームはうまく機能するようになり、 (私には)非標準だが有用な設計パターンのサンプルのように思えます。
私が不快に感じるのはそのような
InnerMutator
ものです。状態を変更できるすべてのオブジェクトに対してミューテーターをフレンドとして宣言することは良い考えではないと思います。また、適切な代替手段を見つけたくありません。この状況は解決できますか、
Mutators
それとも同じ結果になる別のパターンをアドバイスしてもらえますか?
ありがとう。