2012-01-24 8 views
1

ボールが衝突するオブジェクトに応じて解決アクションが必要なゲームに取り組んでいます。オブジェクトの仕様if節の動作

解像度メソッド内のコードの多くは、ヒットすることができた異なるタイプのオブジェクトの全てに適用されるが、一部はまた、特定のオブジェクトタイプに固有です。

擬似コードは次のようになります。

resolve (Object a) { 

if (some test) { 
    if (Object a is rect) { 
    // do one thing 
    } else { 
    // do something else thing 
} else if (another test) { 
    if (Object a is rect) { 
    // do one thing 
    } else { 
    // do something else thing 
} else if (third test) { 
    if (Object a is rect) { 
    // do one thing 
    } else { 
    // do something else thing 
} 
} 

しかし、初心者には、これは(理由節の場合、各内のオブジェクトタイプのテストの)種類の雑然と感じているが、私は非常に把握することはできませんどのように改善する?私はメソッドをオーバーライドし、それに渡されるサブクラスに基づいて動作を持たせることができますが、その後両方のメソッドで同じコードをたくさん使用することになります。

この方法は、ボール(上、下など)の現在位置をテストし、それに応じてボールの速度を調整します。オブジェクトが長方形の場合、新しい速度は円とは異なります。

誰でも助けてもらえますか?

+0

、あなたはそこに3回の場合で同じロジックと他の部分を書いていますか? – Jayy

答えて

3

説明したように、visitorパターンはコードのモジュール化をサポートするので、良い考えです。これは、各テストのコードが独自のクラスとメソッドを保持するため、メソッドが過度に長く複雑になるのを防ぐのに役立ちます。

は、それは今もあなたが、これは、二重派遣として知られている技術によって行われているように、オブジェクトが長方形であるかないかどうかを確認する必要がありません。 GameObjectはそれがどのクラスのインスタンスであるかを知っているため、Visitorで適切な解決メソッドを呼び出します。

また、あなたが、具体的ゲームオブジェクトの別のサブクラスを処理する必要があるかのように、あなたが最初の訪問者の具体的な実装を変更開始後、ResolveVisitorインタフェースを変更し、保守を支援します。あなたが偶然一つを忘れると、コンパイラはコードをコンパイルして問題を指摘することはできません。ここ

は、ビジターパターンの詳細な例である:

void resolve(GameObject obj) { 
    if (first test) { 
     obj.accept(new FirstTestVisitor()); 
    } else if (second test) { 
     obj.accept(new SecondTestVistor()); 
    } else { 
     obj.accept(new DefaultVisitor()); 
    } 
} 

interface GameObject { 
    public void accept(ResolveVisitor visitor); 
} 

interface ResolveVisitor { 
    public void resolve(Rectangle rect); 
    public void resolve(GameObject obj); // default case 
} 

class Rectangle implements GameObject { 
    public void accept(Visitor visitor) { 
     visitor.resolve(this); 
     // Rectangle and its subclasses will call resolve(Rectangle) 
     // whereas all other GameObjects will call resolve(GameObject) 
     // though other GameObjects will need their own accept method 
    } 
} 

ただ明確に3210
class FirstTestVisitor implements ResolveVisitor { 
    public void accept(Rectangle rect) { 
     // logic for first test and if rect goes here 
    } 
    public void accept(GameObject obj) { 
     // logic for first test and not rect goes here 
    } 
} 
0

あなたはVisitorパターンを使用しようとすることができます:visitor

をするか、この操作を行うことができます。resolve(ISomeInterface a) { a.react(ball); } 反応-方法は、あなたのクラス階層の各クラスで定義されます。