2

ここで数当てゲームをいじります。2 つの方法があります。Number というオブジェクト クラスを作成し、getter と setter などをnumber.setPlayerNumber使用number.getPlayerNumberしてから、if ステートメントで使用して勝者を決定できます。

これは、静的変数を使用する必要がなく、メソッドのスコープ内にとどまることを意味します(後で面倒になりませんか?(しかし、メインメソッドが乱雑に見える可能性がありますか?...))

import java.util.Random;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class NumberGuess {

    static Number number = new Number();

    static boolean win;

    public static void main(String[] args) {

        int cpuNumber = generateNumber();
        int playerNumber = playerNumber();
        printResults();
        winCondition();

    }

    public static int generateNumber() {
        System.out.println("Generating a number");
        System.out.println("Done!");

        Random rand = new Random();
        int cpuNumber = rand.nextInt(10) + 1;
        number.setCpuNumber(cpuNumber);     

        return cpuNumber;
    }

    public static int playerNumber() {
        Scanner userInput = new Scanner(System.in);

        String playerNum = JOptionPane.showInputDialog(null, "Enter a number between 1 and 10",
                "Player Turn", JOptionPane.INFORMATION_MESSAGE);
        number.setPlayerNumber(Integer.parseInt(playerNum));

        return Integer.parseInt(playerNum);
    }

    public static void printResults(){
        System.out.println("The computers number was: " + number.getCpuNumber());
        System.out.println("Your number was: " +  number.getPlayerNumber());

    }

    public static void winCondition(){

        if(number.getCpuNumber() != number.getPlayerNumber()){
            if(number.getPlayerNumber() < number.getCpuNumber()){
                System.out.println("You lose!\n"
                        + "Guess too low!");
                }else{
                    System.out.println("You lose!\n"
                            + "Guess too high!");
                }
        }

        if(number.getPlayerNumber() == number.getCpuNumber()){
            System.out.println("You have guessed correct. You win!");
        }
    }

}

return メソッドを使用することもできます。つまり、決定に使用するメソッドで変数を使用するには、すべての変数を静的にする必要があります。

import java.util.Random;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class NumberGuess {

    static Number number = new Number();

    static int cpuNumber = generateNumber();
    static int playerNumber = playerNumber();
    static boolean win;

    public static void main(String[] args) {


        printResults();
        winCondition();

    }

    public static int generateNumber() {
        System.out.println("Generating a number");
        System.out.println("Done!");

        Random rand = new Random();
        int cpuNumber = rand.nextInt(10) + 1;   

        return cpuNumber;
    }

    public static int playerNumber() {
        Scanner userInput = new Scanner(System.in);

        String playerNum = JOptionPane.showInputDialog(null, "Enter a number between 1 and 10",
                "Player Turn", JOptionPane.INFORMATION_MESSAGE);
        return Integer.parseInt(playerNum);
    }

    public static void printResults(){
        System.out.println("The computers number was: " + number.getCpuNumber());
        System.out.println("Your number was: " +  number.getPlayerNumber());

    }

    public static void winCondition(){

        if(cpuNumber != playerNumber()){
            if(playerNumber() < cpuNumber){
                System.out.println("You lose!\n"
                        + "Guess too low!");
                }else{
                    System.out.println("You lose!\n"
                            + "Guess too high!");
                }
        }

        if(playerNumber == cpuNumber){
            System.out.println("You have guessed correct. You win!");
        }
    }

}

優れたプログラミング実践の観点から、より効率的なものは何ですか?

4

2 に答える 2

1

どちらも良く見えないと思います、IMHO。また、Java.lang.Number というクラスが既に存在するため、Number は独自のクラスの名前としては不適切です。これらすべての静的メソッドは実際には必要ないという点で、Christian は正しいです。はい、メイン メソッドからロジックを削除するので、「ごちゃごちゃ」しているようには見えませんが、問題は解決せず、通常はスパゲッティ コードになります。さらに、そのようにロジックを個別のメソッドに分離すると、それらのメソッドが相互に情報を渡すことができる厄介なコードを作成することにもなります (これらの静的変数を作成した理由)。

また、単一の数値をカプセル化し、getter と setter を提供するだけのクラス全体を作成してもほとんど意味がありません。必要に応じて単純な整数を使用してこれを行うこともできます。しかし、OOP の目的は、関連するコンポーネントを、再利用できるほど一般的であり、他の環境 (つまり、GUI、コンソール、ネット) で使用できないほど具体的ではないコンテナーに編成することだと思います。

もし私がそれを書いていたら、私は次のようなことをするかもしれません:

import java.util.*;

class GuessingGame {
    private static final Random rng = new Random();
    private int number;

    public void generateNumber() {
        number = rng.nextInt(10);
    }

    public int guess(int guess) {
        return Integer.compare(guess, number);
    }

    public int getNumber() {
        return number;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        GuessingGame game = new GuessingGame();
        game.generateNumber();
        System.out.println("Guess a number:");
        int n = sc.nextInt();
        int result = game.guess(n);
        if (result < 0)
            System.out.println("You guessed too low!");
        else if (result > 0)
            System.out.println("You guessed too high!");
        else
            System.out.println("You win!");
        System.out.println("You guessed: " + n);
        System.out.println("The actual number was: " + game.getNumber());
    }
}

メイン メソッドにコードを含めることに問題はありません。それがその目的です。ただし、これは静的変数を使用すると便利な場合に適しているため、新しい数値を作成するたびに Random の新しいインスタンスが作成されることはありません。これを拡張して、生成可能な最小範囲と最大範囲を含めることもできます。コンストラクターを追加して、それを取得することもできます。

于 2013-08-30T23:35:44.783 に答える
1

Q: なぜこんなことをしないのですか:

import java.util.Random;
...

public class NumberGuess {

   public static void main(String[] args) {
       NumberGuess numberGuess = new NumberGuess ();
       int playerNumber = numberGuess.playerNumber();
       numberGuess.printResults();
       ...

   public int playerNumber () {
      ...

   public static int generateNumber() {
      ...
于 2013-08-30T23:19:50.730 に答える