2

我有一个班级,名为 Contoller。我想从该类创建一个对象,并在运行时一遍又一遍地更改 transactionValue 和 transactionId。什么是最好的方法。我想我可以从默认构造函数创建一个对象并将 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);
}

编辑:我听说过单身人士。我应该用它吗?(我改变了“骨架”)

4

4 回答 4

2

让它成为一个全球性的!不,等等,全局变量很糟糕。让它成为单例!不,等等,单例是一种反模式。将它作为参数传递到任何需要的地方!不,等等,tramp 数据很糟糕。让它成为一个全球性的!

一个人要做什么?

你付你的钱,你做出你的选择。

于 2013-03-20T11:31:11.987 回答
1

是的,它可以被认为是好的做法。那里没有什么问题。也许你想在写给你的私人成员之前做一些数据验证setControllerValues。但是其中的一部分是您所拥有的非常简单的 OOP。

于 2013-03-20T08:27:00.127 回答
1

您听到的可能是单例,而不是骨架。

当然,您可以使用您展示的方法,但让我问您:您为什么选择这种方法而不是创建单独的对象?

我不喜欢它,原因如下:

  • 如果你真的想确保整个应用程序的单个实例,你需要一个合适的单例(不是我喜欢它)。您当前的实现不会阻止任何人创建另一个控制器
  • 处理多个实例比对单个实例的共享访问要容易得多。如果您必须将此对象提供给其他函数,或者更糟糕的是,线程怎么办?
  • 不可变对象比可变对象更容易推理。可变状态是导致大量错误的原因,因为它提供了更多使类型不变量无效的机会
  • 实际上,除了调用构造函数的成本之外,您一无所获,与您需要执行的其他逻辑相比,这很便宜

简而言之,我认为这种方法没有任何好处,因为我不知道其他可能使它更合理的要求。您已经引入了许多额外的复杂性以在对象创建期间保存一些指令,无论如何编译器都会对其进行优化。这是一个糟糕的权衡,IMO。

关于单身人士,总的来说我也不喜欢他们 :) 原因如下:

  • 我非常怀疑类本身知道它的生命周期问题(单例、瞬态、每个线程等)。这是客户通常更了解的事情
  • 依赖单例来测试代码要困难得多
  • 共享状态 + 多线程 = 调试器之夜

话虽如此,有时它们很有意义。但是,您的示例似乎并非如此。

于 2013-03-20T08:41:10.403 回答
1

这取决于。

如果没有可变状态(或很少),一些程序更容易推理;例如,多线程程序。

其他面向对象的方法会说 getter 和 setter 是诅咒。

在性能和在堆栈上创建新对象方面,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 回答