あなたが求めていることを確実に理解するために、質問を読んだことに基づいた私の仮定を次に示します。
- データは、バイトの配列として表すことができるある種のバイナリ形式(おそらく画像ですが、あなたが言うように何でもかまいません)です
- データに適用できる多くの処理ステップ (変換と呼びます) があります。
- 一部の変換は他の変換に依存します。たとえば、前提条件が適用されていない場合に変換を適用したくない場合などです。不正な変換を適用しようとする試みが検出され、防止されるように、堅牢である必要があります。
問題は、プログラムの複雑さが増すにつれて、将来のバグを回避するオブジェクト指向の方法でこれを行う方法です。
1 つの方法は、バイナリ データとそれに適用された変換の記録の両方をカプセル化するイメージ データ オブジェクトに、Transformation オブジェクト デリゲートを介して変換を実行させることです。Transformation オブジェクトは、処理アルゴリズムと、以前の変換に基づいて適用できるかどうかの知識の両方を実装します。
したがって、次のように定義できます (Java のような命名スタイルで失礼します。C++ を使用してから長い時間が経ちました)。
- TransformationType と呼ばれる列挙型
- 次のメソッドを持つ Transformer と呼ばれる抽象クラス:
- TransformationType を返す「getType」というメソッド
- TransformationType のリストを受け取り、ブール値を返す「canTransform」というメソッド。リストは、データに既に適用されている変換を示し、ブール値は、この変換を実行してもよいかどうかを示します。
- バイト配列を受け取り、(おそらく変更された) バイト配列を返す「transform」と呼ばれるメソッド
- バイト配列と TransformationType のリストを含む BinaryData というクラス。このクラスは、メソッド 'void transform(Transformer t)' を実装して、次のことを行います。
- トランスフォーマーの「canTransform」メソッドを照会し、変換タイプのリストを渡します。例外をスローするか、canTransform が false を返す場合は戻ります
- バイト配列を t.transform(data) の呼び出し結果に置き換えます
- 変圧器のタイプをリストに追加する
これで目的が達成されると思います。画像変換アルゴリズムはクラスでポリモーフィックに定義されていますが、変換の実際の適用はデータ オブジェクトによって「制御」されています。したがって、フラグの設定/チェックなどに関して正しいことを行うために、外部コードを信頼する必要はありません。