2

Contollerという名前のクラスがあります。そのクラスから 1 つのオブジェクトを作成し、実行時に transactionValue と transactionId を何度も変更したいと考えています。そのための最良の方法は何ですか。デフォルトのコンストラクターから 1 つのオブジェクトを作成し、setControllerValues を新しい値に使用できると思います。それはベストプラクティスですか?

class Controller{
public:
    Controller();
    Controller(int,int);
    setControllerValues(int,int);
private:
    int transactionValue;
    int transactionId;
};


int main()
{
    Controller ct;
    ct.setControllerValues(3,4);
    ct.setControllerValues(6,7);
    ct.setControllerValues(34,45);
}

EDIT:シングルトンについて聞いたことがあります。そのために使用する必要がありますか?(「スケルトン」に変更しました)

4

4 に答える 4

2

グローバルにしよう!いいえ、待ってください、グローバルは悪いです。シングルトンにしよう!いいえ、待ってください。シングルトンはアンチパターンです。必要に応じて引数として渡してください! いいえ、待ってください、トランプ データが悪いです。グローバルにしよう!

何をする人ですか?

あなたはあなたのお金を払い、あなたはあなたの選択をします。

于 2013-03-20T11:31:11.987 に答える
1

はい、それは良い習慣と見なすことができます。そこには何も問題はありません。のプライベート メンバーに書き込む前に、データの検証を行いたい場合がありますsetControllerValues。しかし、それはあなたがそこに持っている非常に簡単なOOPです。

于 2013-03-20T08:27:00.127 に答える
1

あなたが聞いたのはおそらくシングルトンであり、スケルトンではありません。

確かに、あなたが示したアプローチを使用することができますが、私に尋ねさせてください:個別のオブジェクトを作成する代わりに、なぜこれを選択するのですか?

以下の理由で嫌いです。

  • アプリケーション全体で単一のインスタンスを確保したい場合は、適切なシングルトンが必要です (私は好きではありません)。あなたの現在の実装は、誰かが別のコントローラーを作成するのを止めません
  • 複数のインスタンスを処理してから、単一のインスタンスへのアクセスを共有する方がはるかに簡単です。このオブジェクトを他の関数、またはさらに悪いことにスレッドに提供する必要がある場合はどうなるでしょうか?
  • 可変オブジェクトよりも不変オブジェクトについて推論する方が簡単です。ミュータブルな状態は、型の不変条件を無効にする可能性が高くなるため、多くのバグの原因となります。
  • 実際には、実行する必要がある他のロジックと比較して安価なコンストラクターを呼び出すコストだけが得られます

要するに、このアプローチを正当化する可能性のある他の要件を知らなければ、このアプローチには何の利点もありません。とにかくコンパイラによって最適化されるオブジェクトの作成中にいくつかの命令を節約するために、多くの追加の複雑さを導入しました。それは悪いトレードオフです、IMO。

シングルトンに関しては、一般的に私も好きではありません:)理由は次のとおりです。

  • クラス自体がそのライフサイクルの問題(シングルトン、トランジェント、スレッドごとなど)を知っていることに非常に疑いを持っています。これは通常、クライアントがよく知っていることです
  • シングルトンに依存するコードをテストするのははるかに困難です
  • 共有状態 + マルチスレッド = デバッガーとの夜

そうは言っても、完全に理にかなっている場合もあります。ただし、あなたの例はそのような場合ではないようです。

于 2013-03-20T08:41:10.403 に答える
1

場合によります。

一部のプログラムは、変更可能な状態がない (またはほとんどない) 場合に、はるかに簡単に推論できます。たとえば、マルチスレッドプログラム。

他のオブジェクト指向のアプローチでは、ゲッターとセッターは忌み嫌われます。

パフォーマンスとスタック上での新しいオブジェクトの作成という点では、c++11 とコンパイラは、効率的なマシン コードを作成する最善の方法をうまく考え出すことに長けており、あなたや私よりはるかに優れています。

代入演算子の使用を検討します。あるオブジェクトの値を使用して別のオブジェクトを変更できます。

class Controller {
public:
    Controller& operator=(const Controller& other) {
        transactionValue = other.transactionValue;
        transactionId = other.transactionId;
        return *this;
    }        
private:
    int transactionValue;
    int transactionId;
};

そして使用:

Controller permanent(12, 5678);
//...
permanent = Controller(23, 6789);
于 2013-03-20T08:49:13.837 に答える