3

作業するデータ構造 (画像など) があると仮定すると、それをさまざまな方法で前処理および後処理して、さらなる処理手順を容易にします。C++ のような OOP 言語でこの責任を実装する最良の方法は何ですか?

さらに、固有の複雑さを伴うさまざまな処理アルゴリズムが多数あると仮定すると、それらを専用のクラスにカプセル化する可​​能性が非常に高くなります。これは、アルゴリズムの実装が、データが処理されたことを示すために、データに何らかの情報を外部的に設定する必要があることを意味します。また、処理されたことはデータに関連付けられた情報のように見えるため、データオブジェクト自体が独自に決定して設定する必要があるため、それは私にはきれいなデザインのようには見えません。

また、複雑なアプリケーションでは非常に一般的なエラーの原因のように見えます: 誰かが別の処理アルゴリズムを実装したり、データにフラグを適切に設定するのを忘れたり、アプリケーションのまったく異なる部分の何かが期待どおりに機能せず、誰かが多くのエラーを持ったりします。エラーを見つけるのが楽しい。

誰かがこのような sth を実装するための適切で失敗しない方法の一般的な構造の概要を説明できますか?

4

1 に答える 1

0

あなたが求めていることを確実に理解するために、質問を読んだことに基づいた私の仮定を次に示します。

  1. データは、バイトの配列として表すことができるある種のバイナリ形式(おそらく画像ですが、あなたが言うように何でもかまいません)です
  2. データに適用できる多くの処理ステップ (変換と呼びます) があります。
  3. 一部の変換は他の変換に依存します。たとえば、前提条件が適用されていない場合に変換を適用したくない場合などです。不正な変換を適用しようとする試みが検出され、防止されるように、堅牢である必要があります。

問題は、プログラムの複雑さが増すにつれて、将来のバグを回避するオブジェクト指向の方法でこれを行う方法です。

1 つの方法は、バイナリ データとそれに適用された変換の記録の両方をカプセル化するイメージ データ オブジェクトに、Transformation オブジェクト デリゲートを介して変換を実行させることです。Transformation オブジェクトは、処理アルゴリズムと、以前の変換に基づいて適用できるかどうかの知識の両方を実装します。

したがって、次のように定義できます (Java のような命名スタイルで失礼します。C++ を使用してから長い時間が経ちました)。

  1. TransformationType と呼ばれる列挙型
  2. 次のメソッドを持つ Transformer と呼ばれる抽象クラス:
    • TransformationType を返す「getType」というメソッド
    • TransformationType のリストを受け取り、ブール値を返す「canTransform」というメソッド。リストは、データに既に適用されている変換を示し、ブール値は、この変換を実行してもよいかどうかを示します。
    • バイト配列を受け取り、(おそらく変更された) バイト配列を返す「transform」と呼ばれるメソッド
  3. バイト配列と TransformationType のリストを含む BinaryData というクラス。このクラスは、メソッド 'void transform(Transformer t)' を実装して、次のことを行います。
    • トランスフォーマーの「canTransform」メソッドを照会し、変換タイプのリストを渡します。例外をスローするか、canTransform が false を返す場合は戻ります
    • バイト配列を t.transform(data) の呼び出し結果に置き換えます
    • 変圧器のタイプをリストに追加する

これで目的が達成されると思います。画像変換アルゴリズムはクラスでポリモーフィックに定義されていますが、変換の実際の適用はデータ オブジェクトによって「制御」されています。したがって、フラグの設定/チェックなどに関して正しいことを行うために、外部コードを信頼する必要はありません。

于 2014-12-23T23:00:16.530 に答える