3

私は宿題のために単純なカードゲーム「戦争」を書いています。ゲームが機能するようになったので、よりモジュール化して組織化しようとしています。以下はMain()、プログラムの大部分を含むセクションです。このコースは C# で教えられていますが、C# コースではありません。むしろ、基本的なロジックと OOP の概念を学んでいるので、一部の C# 機能を利用していない可能性があります。

bool sameCard = true;

while (sameCard)
{
    sameCard = false;
    card1.setVal(random.Next(1,14));        // set card value
    val1 = determineFace(card1.getVal());   // assign 'face' cards accordingly
    suit = suitArr[random.Next(0,4)];       // choose suit string from array
    card1.setSuit(suit);                    // set card suit
    card2.setVal(random.Next(1,14));        // rinse, repeat for card2...
    val2 = determineFace(card2.getVal());    
    suit = suitArr[random.Next(0,4)];        
    card2.setSuit(suit);  

    // check if same card is drawn twice:

    catchDuplicate(ref card1, ref card2, ref sameCard); 
}
Console.WriteLine ("Player: {0} of {1}", val1, card1.getSuit());
Console.WriteLine ("Computer: {0} of {1}", val2, card2.getSuit());

// compare card values, display winner:

determineWinner(card1, card2);   

だからここに私の質問があります:

  • Main() でループを使用しても、モジュラーと見なすことはできますか?
  • カードを引くプロセスは適切に書かれているか、適切に含まれていますか?
  • メソッドでメッセージを出力することは悪い習慣と見なされますか (つまり: determineWinner())?

プログラミングを始めて 2 学期しか経っていませんが、この段階で良い習慣を身に付けたいと思っています。任意の入力/アドバイスをいただければ幸いです。

編集:

catchDuplicate() は boolean メソッドになり、呼び出しは次のようになります。

sameCard = catchDuplicate(card1, card2);

@ダグラスに感謝します。

4

4 に答える 4

3

Main() でループを使用しても、モジュラーと見なすことはできますか?

はい、できます。ただし、多くの場合、MainOOP プログラムにはコア機能を開始するほんの一握りのメソッド呼び出ししか含まれておらず、コア機能は他のクラスに格納されます。

カードを引くプロセスは適切に書かれているか、適切に含まれていますか?

部分的に。私があなたのコードを正しく理解していれば (あなたは のみを示していますMain)、あなたはいくつかのアクションを実行しますが、間違った順序または間違った値で実行すると、うまくいかない可能性があります。次のように考えてみてください: クラス ライブラリ (製品全体ではなく、クラスのみ) を販売する場合初心者のユーザーがライブラリを使用する最も明確な方法は何でしょうか?

Deckつまり、カードのデッキを含むクラスを考えてみましょう。作成時に、すべてのカードを作成してシャッフルします。Shuffleクラスのユーザーがデッキをシャッフルする必要があるときにデッキをシャッフルするメソッドを提供し、カードを処理するためのメソッドを追加しますDrawCard

さらに、独自のクラスに含まれていないメソッドがありますが、クラスの方が優れている機能があります。つまり、determineFaceクラスのメソッドである方が適しています( is が type であるとCard仮定します)。card2Card

メソッド (つまり、determinWinner()) でメッセージを出力することは悪い習慣と見なされますか?

はいといいえ。テスト中にのみメッセージを表示したい場合は、 を使用しますDebug.WriteLine。本番ビルドでは、これらは no-ops になります。ただし、製品版でメッセージを記述する場合は、メソッドの名前からこれが明確であることを確認してください。つまり、WriteWinnerToConsoleまたは何か。

これを行わない方が一般的です: 情報をどの形式で出力しますか? どのようなテキストを添付する必要がありますか? ローカリゼーションをどのように処理しますか? ただし、プログラムを作成するときは、明らかに、画面 (またはフォーム、または Web ページ) に何かを書き込むメソッドが含まれている必要があります。これらは通常、その目的のために特定のクラスに含まれています。ここでは、それは例えばクラスである可能性がありCardGameXます。

一般的な考え方
「1 つのメソッド/関数には 1 つのタスクと 1 つのタスクしか持たず、副作用があってはならない (2 乗計算して印刷すると、印刷が副作用になるなど)」という原則について考えてください。

クラスの原則は、非常に高レベルです。クラスには、論理的に一緒に属し、同じプロパティ/フィールドのセットで動作するメソッドが含まれています。反対の例:ShuffleクラスのメソッドであってはなりませんCard。ただし、論理的には class に属しDeckます。

于 2012-04-07T20:39:27.697 に答える
3

宿題の主な問題がモジュラー アプリケーションの作成である場合は、すべてのロジックを特殊なクラスにカプセル化する必要があります。各クラスは 1 つのジョブのみを実行する必要があります。カードを操作する関数は、カード クラスに属している必要があります。カードを引く関数は、別のクラスにする必要があります。

それがあなたの宿題の目標だと思います、がんばってください!

于 2012-04-07T20:19:45.027 に答える
2

「ベスト プラクティス」に関するすべてのアドバイスは、一粒の塩で受け止めてください。常に自分で考えてください。

それは言った:

  • Main() でループを使用しても、モジュラーと見なすことはできますか?

2 つの概念は独立しています。Main() が高レベルのロジックのみを実行する (つまり、他のメソッドを呼び出す) 場合、アルゴリズムがループを必要とするため、ループ内で実行するかどうかは問題ではありません。(不必要にループを追加することはありませんよね?)

経験則として、可能/実用的であれば、プログラムを自己文書化してください。「読みやすい」ものにして、新しい人 (または今から数か月後のあなた) がそれを見ても、どのレベルでも理解できるようにします。

  • カードを引くプロセスは適切に書かれているか、適切に含まれていますか?

いいえ。まず第一に、カードを 2 回選択してはいけません。より「モジュラー」なアプローチの場合、次のようなものがあります。

while ( Deck.NumCards >= 2 )
{
   Card card1 = Deck.GetACard();
   Card card2 = Deck.GetACard();
   PrintSomeStuffAboutACard( GetWinner( card1, card2 ) );
}
  • メソッド (つまり、determineWinner()) でメッセージを出力することは悪い習慣と見なされますか?

determineWinnerメッセージを印刷する目的はありますか?答えが「いいえ」の場合、それは「悪い習慣」の問題ではなく、機能が明らかに間違っています。

とはいえ、「デバッグ」ビルドと「リリース」ビルドというものがあります。アプリケーションをデバッグし、何が機能し、何が機能しないかを判断するのに役立つように、ログ メッセージを追加することをお勧めします。

それらが関連しており、「リリース」ビルドで実行されていないことを確認してください。

于 2012-04-07T20:36:05.263 に答える
1

Q:Main()でループを使用しても、モジュール式と見なすことができますか?

A:はい、ループを使用できますが、モジュール性には実際には影響しません。

Q:カードの描画プロセスは適切に記述されていますか/適切に含まれていますか?

A:よりモジュール化したい場合は、DrawCardを関数/メソッドに変えてください。DrawCardの代わりにDrawCardsを書くだけかもしれませんが、そこには最適化とモジュール性の問題があります。

Q:メソッド(つまり、determineWinner())でメッセージを出力することは悪い習慣と見なされますか?

A:メソッドでメッセージを印刷することは悪い習慣ではないと思いますが、それはコンテキストに依存します。理想的には、ゲーム自体はゲームロジック以外は何も処理しません。プログラムはある種のゲームオブジェクトを持つことができ、ゲームオブジェクトから状態を読み取ることができます。このようにして、ゲームをテキストベースからグラフィカルに技術的に変更できます。つまり、これはモジュール化には理想的ですが、期限を考えると実用的ではない可能性があります。十分な時間がないため、ベストプラクティスをいつ犠牲にする必要があるかを常に決定する必要があります。悲しいことに、これは非常に頻繁に発生します。

ゲームロジックをそのプレゼンテーションから分離します。このような単純なゲームでは、それは不必要な依存関係です。

于 2012-04-07T20:23:58.287 に答える