0

実際には、より一般的な問題の例である特定の問題を解決しようとしていました。1 つのオブジェクトが他のオブジェクトに依存するオブジェクトがいくつかあるとします。

Bitmap AnImage;   // Several instances of this object are possible: an image is loaded; then is discarded; then a new image is loaded, and so on.

Public class PixelSelection    
{
     string GenericAttribute;
      int X;
      int Y;

     public PixelSelection(string myAttribute, int x, int y)
     {
          GenericAttribute = myAttribute;
          X = x;
          Y = y;
     }
}

2 番目のオブジェクト:

  1. この方法で作成されます: new PixelSelection("Whatever", AnImage.Width, AnImage.height) したがって、AnImage オブジェクトに依存します。
  2. メイン アプリケーションがサブスクライブできるイベントを公開します。

各クラスの 1 つのインスタンスのみが必要であり、両方のオブジェクトがユーザーの要求に応じて作成されます。Bitmap インスタンスなしで PixelSelection を使用することはできませんが、ユーザーが PixelSelection オブジェクトを操作する必要がある場合にインスタンスが必要になります。

私が扱っている問題は、PixelSelection をビットマップと同期させる方法です。これらは私が検討している可能なシナリオです:

  1. メイン フォームのプロパティとして PixelSelection を宣言し、新しいビットマップが作成されるたびにインスタンス化します。これには毎回新しいイベント登録が必要であり、新しいビットマップの作成が必要になるたびに、開発者は別のコード セクションで参照される新しい PixelSelection オブジェクトをインスタンス化することを覚えておく必要があるため、コードでエラーが発生しやすくなります。
  2. 最初に PixelSelection オブジェクトをインスタンス化し、すべての Bitmap インスタンスに同じオブジェクトを使用して、コード内で実際に使用されている場所でのみ属性 X と Y を更新します。これには、x および y パラメーターのない新しいコンストラクターが必要です。これは、適切な初期化を行わずにインスタンスに対してアクションを実行しようとするときに使用できる Bitmap と、PixelSelection の不一致を管理するコードがないためです。
  3. Bitmap と PixelSelection オブジェクトを持つラッパー オブジェクトをプロパティとして使用します。これは、Bitmap が割り当てられている場合に PixelSelection オブジェクトを適切に作成または更新するためだけに使用されます。このラッパーはソリューション ドメイン モデルに適合しないため、これは非常に不自然 (または汚い) に聞こえます。これは、非常に特定の問題を解決するための回避策にすぎません。
  4. プロパティとして PixelSelection を持つ Bitmap から派生したクラスを作成し、そのライフサイクルを明白な方法で管理します。これは、何かをモデル化するためではなく、オブジェクトのライフサイクルのニーズと使用パターンに対処するためだけに存在する一連のオブジェクトで満たされる超脂肪クラスにつながる可能性があります。

私が下書きした 4 つの暫定的なシナリオは、抽象化が大きく異なり、異なるツールセットを使用しようとしています。さらに悪いことに、オブジェクトのライフサイクルの問題とオブジェクト指向モデリングに関する混乱を示して、オブジェクト指向モデルに対する私の理解が不十分であるという証拠を彼らが示している可能性があると感じています。問題を解決するための最良の方法は何か、ベストプラクティスの観点から、その解決策が適切な答えである理由を特定するのを手伝ってもらえますか? ありがとう。

4

3 に答える 3

0

私が扱っている問題は、PixelSelection と Bitmap を同期させる方法です。

Bitmapinto への参照を追加してみませんPixelSelectionか?

public class PixelSelection    
{
     string GenericAttribute;
     int X;
     int Y;
     private readonly Bitmap bitmap;

     public PixelSelection(string myAttribute, int x, int y, Bitmap bitmap)
     {
          GenericAttribute = myAttribute;
          X = x;
          Y = y;
          this.bitmap = bitmap;
     }
}
于 2013-06-07T10:31:42.550 に答える
0

自分に合った解決策を見つけました。本当の要件は、不要な依存関係を作成することなく、2 つのオブジェクトの同期を維持するために必要なアクションを実行できる単一のコード セクションを持つことであることがわかりました。答えは、イベントです。私にとっての解決策は、メソッドが PictureBox コントロールに画像をロードする完全な責任を持つクラス (シングルトン) を作成することでした。クラスには、イベントを発生させる更新を実行するメソッドがあります。

/*
 * Load the picturebox in the control 
 */
        public   void UpdatePictureBox( Bitmap BitmapToBeLoaded, PictureBox CurrentPictureBox)
        {
            /*
             * If the Bitmap or the picturebox are null there is nothing to update: so exit keeping loaded the previous image
             */
            if (BitmapToBeLoaded == null) return ;

            CurrentPictureBox.Image = BitmapToBeLoaded;                // Assign the Bitmap to the control
            /*
             *  When loading, adapt the control size to the image size to avoid any distortion
             */
            CurrentPictureBox.Width = BitmapToBeLoaded.Width;          // Adapth width of the control size
            CurrentPictureBox.Height = BitmapToBeLoaded.Height;        // Adapth height of the control size    

            /*
             * Publish events defensively: Book .Net Components, pag. 108
             */
            try
            {
                if (null != ImageUpdated) ImageUpdated();    // Fire the event
            }
            catch
            {
            }
            return ;           
        }

このようにして、新しい画像が利用可能になった後に実行されるすべてのアクションは、簡単に見つけて文書化できる単一のコード セクションで、イベントをサブスクライブして実行されます。これが最善の解決策であるとは言いません。でも嬉しいのは、デザインがすっきりして見えること。

于 2013-06-27T09:19:34.430 に答える
0

非常に抽象的な質問に絶対的な答えを出すことは不可能です。定義された問題に関する特定のアドバイスを実際に探しているのではなく、質問に関連するかどうかに関係なく、一般的なガイドラインを探しているのです。

この特定のシナリオでは、PixelSelection クラスとビットマップの間の「強制接続」が実際にはわかりません。PixelSelection には幅と高さが必要ですが、それだけです。Bitmap は必要ありません。不要な依存関係を追加するのは良くありません。

また、bitmap の 1 つのインスタンスと PixelSelection の 1 つのインスタンスのみが必要であると述べています。それらを静的要素/シングルトンとして作成し、必要に応じて更新すると、すべてがうまくいきますか?

より一般的に言えば、純粋な OO 設計の観点からは、ソリューション 3 を選択するのがおそらく賢明です。もちろん、特定のシナリオで他の方法を使用する方が理にかなっている場合を除きます。または、ビットマップへの参照を PixelSelection に追加します...

全体像を把握し、当社がどのような種類の制限に対応しているかを知ることなく、決定的な答えを出すことは不可能です.

于 2013-06-07T10:34:23.323 に答える