1

初心者の質問です。私の単純な学習じゃんけんゲーム プログラムでは、単一のゲーム インスタンス クラスがあります。ゲーム インスタンス クラスには、合計ターン数、勝利数、引き分け数などのプライベート メンバーがいくつかあります。これらのクラス メンバーは、ゲームを開始して処理するパブリック ゲーム インスタンスのクラス メソッドでのみ使用されます。適切なコード スタイルに従って、クラス メンバー用に特別なプライベート ゲッター メソッドとセッター メソッドを作成する必要がありますか? ゲーム処理メソッドでクラス メンバを直接操作する方がよいでしょうか?

class GameInstance{
    unsigned int m_totalTurns;
    unsigned int m_wins;
    unsigned int m_loses;
    unsigned int m_ties;
    int getWins() const;               // is it a bad idea?  
    int getLoses() const;              // is it a bad idea?  
    int getTotalTurns() const;         // is it a bad idea?  
    int getTies() const;               // is it a bad idea?  

    // some setters-like incrementing  // is it a bad idea?
    // same private members functions  // is it a bad idea?    
    // ....                            // is it a bad idea?  

    void finishGame();

public:
    explicit GameInstance():m_totalTurns(0), m_wins(0), m_loses(0), m_ties(0){}; 
    void startGame();
};
4

4 に答える 4

4

おそらくゲッターを公開するか、それらを使用しても意味がありません。

ゲッターまたはセッターに関しては、それらはクラスのインターフェースの一部です。これらのメンバーを直接取得したり設定したりすることを外部から許可したくない場合は、ゲッターとセッターを公開しないでください。

あなたの場合、ゲッターはアイデアかもしれませんが、セッターはそれが悪い考えかもしれません.どちらがaddResult()勝ち、引き分け、または負けを指定し、関連する統計に1を追加したいのですか.

個々のゲッターの代わりに、一度に 4 つすべてを返す「getGameStats()」を使用できます。

パブリック アクセスを許可するのではなく (アクセスをまったく許可しないのではなく) ゲッターについて質問する場合は、メソッドを持つクラスの場合、通常はすべてのデータ メンバーをプライベートにして、ゲッターと、必要に応じてセッターを使用する必要があります。また、変数がアクセスされているポイントにブレークポイントを挿入できるため、それらを使用しているコードをデバッグするのも簡単です。

「純粋なデータ」構造体では、メンバーを公開できます。実際、この場合、getGameStats() 関数から返される "GameStats" 構造体があるかもしれません。GameStats 自体には数字だけが含まれており、これらを公開することができます。ただし、クラス内の GameStats のインスタンスはプライベート インスタンスである必要があります。

于 2012-11-30T09:46:25.367 に答える
1

良いアプローチだと思います。実装を隠します。編集する方が簡単です。を使用する場所が 100 あるとしますgetTotalTurns()。ある日、ゲッターのロジックを変更する必要があります。そして、100 ではなく 1 つの場所を変更する必要があります。パフォーマンスについて考えないでください。コンパイラはおそらくこれらすべての関数をインライン化します。@CachCowが言ったように、それらを非公開にする本当の理由はありません(セッター/ゲッター)。それらを保護して、派生クラスへのアクセスを許可することができます。しかし、ほとんどの場合、getter/setter は公開用です。

于 2012-11-30T09:46:20.600 に答える
0

ここで、ゲッターとセッターをいつ/なぜ使用する必要があるかについて、かなり良い議論があります:
SO ゲッターとセッターの質問

しかし、内部使用だけであっても、それらを使用する価値があることがよくあります。値にアクセスするときに、値にアクセスするときに統一された方法でそれを行うことを保証し、それらを編集するときに、それらがどのようにルールに準拠しているかを確認します変更する必要があります。

基本的に、ほとんどの状況でコードをよりきれいにするのに役立ちます。

編集:
プライベートゲッターとセッターの使用に関しては個人的な選択であるため、私が知らないことがない限り、本当の「間違った」答えはありません。

于 2012-11-30T10:06:38.833 に答える
0

シングルスレッド プロジェクトで、メイン インターフェイスとユーザーとのやり取りがすべて GameInstance クラスにある場合、ゲーム プロセス中にこれらのフィールドにアクセスする必要はありません。ゲームが終了すると、構造体を介してそれらをすべて取得できます。

struct GameInfo
{
    unsigned int m_totalTurns;
    unsigned int m_wins;
    unsigned int m_loses;
    unsigned int m_ties;
};

class GameInstance
{
private:
    GameInfo gameInfo;
public:
    GameInfo GetInfo() const;
};

このアプローチは依然として安全ですが、煩わしい数のゲッターを記述する必要はありません。

于 2012-11-30T10:01:25.867 に答える