2017-04-09 9 views
3

私は現在、Javaで5カードドローポーカーのゲームのコンソール実装を作成しています。新しいオブジェクトのインスタンス化とreset()メソッドの実装

私はHandOfCardsというクラスを持っています。ハンドオフカードは、プレーヤーのカードを扱い、賭け、勝者を決定する個々の手続きを処理します。私はまた、GameOfPokerというクラスを持っています。このクラスは、複数のポーカーの手を容易にし、ポーカーのゲームを完全に表現しています。

私は、次のようなGameOfPokerためHandOfPokerインスタンスを作成します:

public class HandOfPoker{  
    public void reset(List<PokerPlayer> players) { 
    this.players = players; 
    } 
} 

public class GameOfPoker{ 
    public play() { 
    // carry out game 
    // then after a hand, I could either instantiate: 
    //handOfPoker = new HandOfPoker(players, deck); 
    // or I could reset: 
    handOfPoker.reset(); 
    // now I'm ready to play another hand. 
    } 
} 

HandOfPoker handOfPoker = new HandOfPoker(List<PokerPlayer> players, DeckOfCards deck); 

私の質問はGameOfPokerに、私は新しいオブジェクトをインスタンス化しなければならないか、私はHandOfPoker内のリセット方法を定義する必要があり、あります

直感的には、reset()のアプローチがよりよく見えるように感じます。新しいインスタンスを作成する必要があるため、新しいオブジェクトをインスタンス化するとコストがかかるように見え、古いオブジェクトはゴミ箱に入れなければなりません。

ここではベストプラクティスのアプローチがありますか、または2つのアプローチの違いがそれほど問題ではありませんか?

答えて

6

一般に、新しいオブジェクトを作成してガベージコレクタに破棄させるのは、非常にタイトなループで何度も行われない限り、高価なものではありません。あなたがゲームで手に一度それを行う場合、あなたは違いを測定することができなくなります。複数の間で共有されることはありませんHandOfPokerもし

  • したがって、それはあなたがreset()方法かどうかを実装する必要があるかどうかを決定しながら、あなたのコードの人間の読者にあなたのデザインを表現するために、最も論理的な方法に集中するのが最善ですオブジェクトはreset()を使用していないため、コードの読者にとってはより洗練された外観をしています。なぜなら、何が起きているのかを見るためにreset()の内部を見る必要がないからです。

  • HandOfPokerが複数のオブジェクト間で共有されている場合、新しいオブジェクトを複数の場所に設定するのではなく、reset()を持つ方がよいでしょう。
+1

さらに、リセットするにはフィールドの明示的な再初期化が必要ですが、新しいオブジェクトのフィールドはすでに「0」/「false」/「null」に初期化されています。これらの値が新しいインスタンスに適している場合、新しいオブジェクトを作成するよりも実際にフィールドを手動でリセットする方が実際にはコストがかかるかもしれません。しかし、これは不要なマイクロ最適化であり、これを考慮しないでください。この答えで既に述べたように、プログラムロジックに焦点を当てる必要はありません。 – Andreas

関連する問題