在运行时中反复使用和反对的最佳做法是什么

时间:2013-03-20 08:22:47

标签: c++ class object static singleton

我有一个名为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 个答案:

答案 0 :(得分:2)

让它成为全球化的!不,等等,全局变坏了。让它成为一个单身人士!不,等等,单身人士是反模式。无论何处需要,都可以将其作为参数传递!不,等等,流浪汉数据不好。让它成为一个全球性的!

一个人要做什么?

你支付了钱,然后你可以选择。

答案 1 :(得分:1)

是的,这可以被视为良好做法。那里没有错。也许您想在setControllerValues写入私人成员之前进行一些数据验证。但是你可以在那里找到非常直接的OOP。

答案 2 :(得分:1)

你听到的可能是singleton,而不是骨架。

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

我不喜欢它,原因如下:

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

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

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

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

话虽这么说,但有时候他们才有意义。但是,你的例子似乎并非如此。

答案 3 :(得分: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);