0

私の質問をチェックしていただきありがとうございます。Javaデッキ用の次のコードがあります。配列やおもちゃのコードから離れて、これにベスト プラクティスとオブジェクト指向の原則を使用してみたいと思います。これは、はるかに単純ですが、再利用性が低い方法で実行できることを認識しています。

最終的な目標は、さまざまなゲームの実装に集中しながら、デッキ管理の日常的な部分に対処するために使用できるカードゲーム フレームワークを作成することです。

エラー処理に問題があります。draw() コードの私の考えは次のとおりです -

1) 別のカードがある場合は、それを戻し、反復子を移動します。これにより、破棄はイテレータの後ろにあり、.last() カードが描画されたばかりになるため、破棄パイルの必要がなくなります。

2) 別のカードがなく、「cards」が空の場合は、emptyDeck() メソッドを実行します。このメソッドはサブクラスで実装されます。たとえば、ソリティアでは、デッキを x 回実行した後にゲームを終了したい場合があるため、これ以上カードを引きたくない場合があります。

3) デッキが空ではなく、それ以上カードがない場合は、サブクラス化される endOfDeck() メソッドを呼び出します。繰り返しますが、デッキをシャッフルするか、単純にイテレータをリセットしたい場合があります

ただし、古い「カードを返却する必要があります」というエラー メッセージが表示されます。カスタム例外を作成しようとしましたが、ハンドラー メソッドを 1 つしか指定できません。誰でもこれを行うスマートな方法を提案できますか?

    public abstract class Deck 
{

private ArrayList<Card> cards;
private ListIterator<Card> deckPosition = cards.listIterator();
/**
 * 
 */
public Deck() 
{   
}

public Card draw()
{
    Card drawn;

    try
    {
        if(deckPosition.hasNext())
        {
            drawn = deckPosition.next();
        }
        else if(cards.isEmpty())
        {
            emptyDeck();
        }
        else
        {
            endOfDeck();
        }
    }

    catch(Exception e)
    {
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Deck");
        e.printStackTrace();
    }

    finally
    {
        return drawn;
    }
}

public abstract void endOfDeck();
public abstract void emptyDeck();

}
4

1 に答える 1

3

内部エラーのためにメソッドが意味のある結果を返すことができない場合、メソッドは何かを返すのではなく、例外をスローする必要があります。したがって、メソッド自体が管理できないエラーが描画メソッドで発生した場合、呼び出し元によって処理される例外自体をスローする必要があります。

この場合、新しい例外クラスを作成しますDeckEmptyException。デッキが空の場合、draw メソッドはカードを返す代わりにその例外をスローします。draw メソッドを呼び出す人は誰でも、この例外に対処する必要があります。

于 2013-02-07T14:59:00.213 に答える