【问题标题】:Storing intermediate results in a class's attribute将中间结果存储在类的属性中
【发布时间】:2015-04-02 00:37:02
【问题描述】:

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

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 的数据成员数组中。

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

如果这不是一个好主意,还有什么替代方案?

【问题讨论】:

  • 在不知道如何使用此类的情况下很难评估此类设计的正确性。您能否提供更多上下文,也许是一些显示 A 对象的示例用法的代码?
  • 您的代码不会按原样编译。您的函数中的 for 循环不正确。
  • 另外,请不要将所有内容放在一条线上。留白很便宜。
  • @DavidLively 代码已修改,希望对您有所帮助。
  • 此外,数据并不是真正可访问的(或者是否有意将成员公开?),因此从未使用过。即使它是可访问的,也可以很容易地按需计算。总之,您的代码没有解决任何问题,因此可以将其删除。也许您还想稍微澄清一下您的问题,因为就目前而言,您还不清楚您想要什么,更不用说什么可以替代了。

标签: c++ class


【解决方案1】:

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

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

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

遵循指导方针,但要放松一下。

【讨论】:

  • 感谢您的回答和示例。你知道任何使用这个想法的教科书,所以我可以把它作为参考吗?
  • 我个人认为这个答案没有用。 “有效”与“无效”的概念在本质上没有意义,因为使用错误很容易将设计得最好的类置于“无效”状态。例如,您可以关闭一个 IO 流,然后尝试从中读取。
  • @Adrian,我没有参考教科书。我的回答是基于经验。
  • @RSahu 为什么让每个函数返回一个更新值数组是个坏主意?
  • @Adrian,不一定是坏事。我会尝试举一个例子,让函数让对象处于“无效”状态是个坏主意。
【解决方案2】:

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

在抽象中,一个类的内部状态可以被外部调用的方法修改。如果这不是我们所希望的,那么就没有必要为一个类设置任何内部状态了。

真正的问题是关于提供给外部使用的具体方法。这是良好 OOD 的核心问题,因此您应该对此进行研究。作为起点,请参阅What are some best object-oriented design practices?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2010-11-15
    • 2018-04-30
    相关资源
    最近更新 更多