2011-07-28 45 views
1

最近、私はエレガントに解決する方法がわからない再発性の設計問題に苦労してきました。明示的なデータ構造と明示的なデータ構造

私はいくつかのプレイヤーといくつかの接続された作品をプレイしています。一緒にこれらの作品は、半複雑なコレクションや構造を形成します。今私は2つの方法で、この構造を実現することができます。作品そのものIEのポインタを介し暗黙的構造を保存する次のいずれか

class BigPiece extends Piece { 
    Piece opposingPiece, nextPiece, previousPiece, index; 
} 

または私はコレクションクラスでは、この構造を実装し、集中情報を保つことができる:

class SomeCollection<Collection<Piece>> { 
    SomeOtherCollection<Collection<Piece>> collection 
     = new SomeOtherCollection<Collection<Piece>>(); 

    public SomeCollection() { 
     collection.add(new PieceCollection<Piece>(); 
     collection.add(new PieceCollection<Piece>(); 
     collection.add(new PieceCollection<Piece>(); 
    } 

    public Piece getPiece(int playerIndex, int pieceIndex) { 
     collection.get(playerIndex).get(pieceIndex); 
    } 

    public Piece getOpposingPiece(int playerIndex, int pieceIndex) { 
     int nextPlayerIndex = collection.listIterator(playerIndex).nextIndex(); 
     return this.collection.get(nextPlayerIndex).get(pieceIndex); 
    } 
} 

私は通常第2のものを好んでいますが、それはちょうど私の勇気に基づいており、私はクラスのデザインでそれほど多くの経験はありません。私は両方の面で賛否両論を見ることができます。

私が通常最初に解決する問題は、実際にオブジェクトを一緒にリンクするビルダーまたはファクトリで関連付けを作成する必要があることです。これは私にとって非常に頑強ではないようです。誰がアプリケーションの生涯を通してポインタが実際に正しいのか、私を安心させることができますか?

第2のソリューションは、データをより集中管理します。これは本当に上位のクラスを愚かにする(個々の小片など)。私が通常この問題を抱えているのは、このコレクションをトラバースしたいときはいつでも、それをある程度下げる必要があるということです。あなたは作品を聞くことはできませんねえねえ、相手の作品は何ですか?いいえ、ゲームオブジェクトを取得してコレクションへのポインタを取得する必要があります。そこで、相手の作品が何であるかを尋ねます。これは、あなたのアプリケーション(メソッド連鎖=()メソッドを最終的に実装するために、メソッドchaining =()のデータを収集する、より管理的なクラスを作成します)

確かに、個々の作品もありますが、それは重複した情報しかないので、それは良いアイデアかどうかはわかりません。

答えて

0

私の個人的なお勧めは、最初のものではなく2番目の選択です。 (少なくともこの文脈では)相手の/次の/前の部分が何であるかを知ってはならない。

マネージャクラスは、他の部分への参照を有する部分の代わりにクラス間の通信を容易にする。私はデメテルの法則について完全には知らないと認めますが、Wikipediaは、マネージャクラスが実際に助けてくれるカプセル化のすべてであると私を信じさせてくれます!

私はピース(ここでもこの文脈で)は、別のピースを動かすことができるはずがないと思います。しかし、マネージャークラスは論理的にしたいです。

これは私の提案です。私はそれが助けてくれることを願っています!