将中间结果存储在类的属性中

时间:2015-04-01 15:09:46

标签: c++ class

假设我有一个包含3个方法和一个属性的类。该类应该在名为result的数组中编码值。因此运行3个函数以获得存储在结果中的最后一个编码结果。

class A{
    public: 
        int size;
        int* result;

        A(int si){
            size=si;
            result=new int[size];
            for(int i=0;i<size;i++)    
                result[i]=5;
        }

        void func_1(){
            for(int i=0;i<size;i++)
                result[i]=i+1;
        }
        void func_2(){
            for(int j=0;j<size;j++)
                result[j]=j+10;
        }
        void func_3(){
            for(int k=0;k<size;k++)
                result[k]=k+4;
        }
};

int main(){
    A a(10);
    a.func_1(); // consider each method as an encoding function (e.g. encryption, randomization, etc)
    a.func_2();
    a.func_3();
    return 0;
}

这里我将中间结果存储在名为result的数据成员数组中。

我的问题是,将中间结果存储在类的属性中并继续更新它是一个坏主意吗? (即违反了班级定义)

如果不知道替代方案会是什么?

2 个答案:

答案 0 :(得分:0)

  

我的问题是,将中间结果存储在类的属性中并继续更新它是一个坏主意吗?

作为一般准则,在完成某项功能后,不应将对象置于无效状态。什么构成有效状态取决于对象和应用程序。

话虽如此,我已经看到很多实例,在完成调用后对象处于无效状态。我可以给你的一个例子来自我的领域知识。有限元网格必须处于某种状态才能被视为有效网格。但是,无论是通过从文件中读取数据还是使用某种网格划分算法在几何体的内存中构建网格来构造网格,在网格对象完全定义并处于有效状态之前会有很多函数调用。与此同时,它将暂时处于无效状态。

遵循指南,但给自己一些松懈。

答案 1 :(得分:0)

我想我现在明白你的问题。 (你的代码示例令人困惑而不是澄清,这让我很难。)

在摘要中,一个类具有由外部调用的方法修改的内部状态是很好的。如果这不可取,那么根本就没有任何内部状态可供选择。

真正的问题是关于为外部使用提供的具体方法。这是一个好的OOD的核心问题,所以你应该研究一下。作为起点,请参阅What are some best object-oriented design practices?

你的例子非常笼统,所以很难描述,但我会尽我所能。如果您的三种编码方法可以独立使用,那么将它们作为三个单独的可调用方法是正确的。如果调用其中一个然后逻辑上排除了另一个的使用(例如,你可能不应该加密使用AES()然后使用encodeToMP3()),那么你应该这样记录,并让你的代码抛出正确的错误/异常,如果用户试图这样做。如果方法调用必须始终紧跟另一个方法调用,那么您应该重构方法,以便将所需的操作组合在一起。在所有这些情况下,您的课程应该完整记录,以便任何用户都能理解如何正确使用它。