2

私が最もよく使うミニパターンは次のとおりです。

VideoLookup = new ArrayList  { new ArrayList { buttonVideo1, "Video01.flv" },
                               new ArrayList { buttonVideo2, "Video02.flv" },
                               new ArrayList { buttonVideo3, "Video03.flv" }, 
                               new ArrayList { buttonVideo4, "Video04.flv" },
                               new ArrayList { buttonVideo4, "Video04.flv" }
                             };

これは、ボタンごとに大文字と小文字を区別するswitchステートメントではなく、クリックされたボタンをArrayListの各項目と比較できることを意味します。次に、一致するものを見つけたら、正しいファイルを起動します(ただし、2番目の部分であるアクションは、デリゲートまたはその他のものである可能性があります)。

主な利点は、switchステートメントのケースごとに正しいコードをすべて追加することを忘れないという問題がないことです。ルックアップArrayListに新しい項目を追加するだけです。

(はい、ArrayListを使用するのが最善の方法ではないことはわかっていますが、古いコードです。また、毎回配列をループすることは、switchステートメントを使用するほど効率的ではないことを知っていますが、このコードはタイトループ)

時間/労力を節約したり、コードを読みやすくしたりするために使用するミニパターンを他に持っている人はいますか?GUIに関連している必要はありません

更新:このコードをコピーしないでください。悪いことはわかっていましたが、どれほど悪いかはわかりませんでした。代わりにこのようなものを使用してください。

Hashtable PlayerLookup = new Hashtable();
PlayerLookup.Add(buttonVideo1, "Video01.flv");
PlayerLookup.Add(buttonVideo2, "Video02.flv");
PlayerLookup.Add(buttonVideo3, "Video03.flv");
PlayerLookup.Add(buttonVideo4, "Video04.flv");

string fileName = PlayerLookup[currentButton].ToString();            
4

9 に答える 9

3

ボタン参照とファイル名を表す文字列、そしてこれらのもののリストを持つ構造体またはオブジェクトを作成するだけです。または、辞書を使用して、自分でさらに簡単にすることもできます。改善する方法はたくさんあります。:)

于 2009-02-13T20:32:42.580 に答える
3

スイッチに関して、私はこの種のことをよく書いています。

public Object createSomething(String param)
{
    return s == null                          ? new NullObject() :
           s.equals("foo")                    ? new Foo() :
           s.equals("bar")                    ? new Bar() :
           s.equals("baz") || s.equals("car") ? new BazCar() :
                                                new Object();
}

通常の switch ステートメントに比べて読みやすく、より複雑な比較ができると思います。ええ、各条件を比較する必要があるため遅くなりますが、99% の時間は問題ではありません。

于 2009-02-13T20:36:57.733 に答える
3

Java では、パブリック インターフェイスを実装するプライベート 内部クラスが、密結合された要素で構成されるオブジェクトに非常に役立つ場合があります。Allen Holub のVisual Proxyアーキテクチャを使用して UI を作成するコンテキストでこのミニ パターン (イディオム) が議論されているのを見たことがありますが、それ以上のことはありません。私の知る限り、名前はありません。

たとえば、Iterator を提供できる Collection インターフェースがあるとします。

public interface Collection
{
  ...

  public Iterator iterate();
}

public interface Iterator
{
  public boolean hasNext();
  public Object next();
}

Collection を実装する Stack がある場合、その Iterator をプライベート内部クラスとして実装できます。

public class Stack implements Collection
{
  ...

  public Iterator iterate()
  {
    return new IteratorImpl();
  }

  private class IteratorImpl implements Iterator
  {
    public boolean hasNext() { ... }
    public Object next() { ... }
  }
}

Stack.IteratorImpl は、Stack のすべてのプライベート メソッドとフィールドに完全にアクセスできます。同時に、Stack.IteratorImpl は Stack 以外には見えません。

Stack とその Iterator は、密結合になる傾向があります。最悪の場合、Stack の Iterator を public クラスとして実装すると、Stack のカプセル化を破らざるを得なくなる可能性があります。private 内部クラスを使用すると、これを回避できます。いずれにせよ、実際には実装の詳細である何かでクラス階層を汚染することは避けてください。

于 2009-04-17T23:20:18.380 に答える
1

私がコードを急いで大量生産しているとき (締め切り! 締め切り! なぜ私は stackoverflow.com にいるの? 締め切り!)、次のようなコードに行き着きます:

Button1.Click += (o,e) => { DoSomething(foo); };

これにより、ある時点でメモリリークが発生しますか? わからない!これはおそらく質問に値します。あっ!締め切り!

于 2009-06-13T01:43:05.737 に答える
0

Windows フォームの場合、Tag フィールドを使用して疑似コマンド文字列を配置し、共有ボタン セットに対して単一のイベント ハンドラーを使用できるようにすることがよくあります。これは、ほぼ同じことを行うがパラメーター化されているボタンに特に適しています。

最初の例では、ボタンのタグをビデオ ファイルの名前と同じに設定します。ルックアップは必要ありません。

アクションをディスパッチするための何らかの形式のテキストベースのコマンド プロセッサを持つアプリケーションの場合、Tag はコマンド プロセッサに供給される文字列です。いい作品。

(ちなみに、ミニパターンに使用される「イディオム」という用語を見たことがあります...)

于 2009-02-13T21:01:20.670 に答える
0

おそらく、これを行うためのより良い方法 (vbEx2005/.Net2.0) が既に存在しますが、いくつかのパラメーターを受け取るメソッドと、すべての、またはそれらのパラメーターの 1 つを除くすべて、およびデリゲートを生成します。デリゲートは、呼び出されると、指定されたパラメーターを使用して指定された関数を呼び出します。ParameterizedThreadStart のような ParamArray ベースのものとは異なり、すべてがタイプ セーフです。

たとえば、次のように言います。

Sub Foo(param1 は整数、param2 は文字列)
    ...
サブ終了

...
  (整数の) アクションとしての行為を薄暗くする = _
      ActionOf(of Integer).NewInv(AddressOf Foo,"こんにちは")

  アクト(5)
...

その結果、Foo が宣言されたオブジェクトで Foo(5, "Hello there") が呼び出されます。残念ながら、サポートしたいパラメーターの数ごとに個別の汎用クラスとメソッドを用意する必要がありますが、余分なコードをあちこちに散らばらせて作成するよりも、すべてのカット アンド ペーストを 1 つのファイルにまとめたほうがよいでしょう。適切な代表者。

于 2010-09-27T19:10:47.153 に答える