C++ 强制类调用顺序要求

C++ 强制类调用顺序要求,c++,oop,C++,Oop,我试图设计一个类,它封装了一些数据的处理、结果的缓存以及通过成员函数对结果的访问 我目前的设计如下: class DataProcessor { public: DataProcessor(); void populateUsing(const rawDataSource &source); // Must call populateUsing() first! int getDataX() const; int getDataY() const

我试图设计一个类,它封装了一些数据的处理、结果的缓存以及通过成员函数对结果的访问

我目前的设计如下:

class DataProcessor
{
public:
    DataProcessor();
    void populateUsing(const rawDataSource &source);

    // Must call populateUsing() first!
    int getDataX() const;
    int getDataY() const;
};
还有一个额外的限制:提供的
rawDataSource
的生存期可能在调用
populatesing()
getData[XY]()

在达到此设计之前,我经历了各种备选方案,包括:

  • rawDataSource
    参数传递给构造函数
  • 有一个私有的
    isPopulated
    标志,由
    getDataX()
    等检查,然后可以抛出异常、返回错误值或调用
    populatinging()
    本身
  • 备选方案1可以工作,但不够,因为处理可能需要很长时间,如果未调用
    getData[XY]()
    ,则可能实际上不需要。我想按需执行处理

    备选方案2不充分,因为:

    • 我不能在这段代码中抛出异常而不引起严重的麻烦(和糟糕的用法)
    • 返回错误代码可能是可能的,但需要重新排列参数以允许传递错误代码
    • 无法调用
      populateUsing()
      ,因为不能保证
      rawDataSource
      仍然有效
    我的总体目标是提供一个易于使用且不易误用的类接口。仅使用注释强制执行成员函数调用顺序似乎违反了我的“难以滥用”目标

    考虑到我的限制,首选的设计是什么?如果您认为这是实践中最好的,请随意推荐我的一个备选方案

    (这个问题会更好地发布给程序员吗?

    考虑到你的两个主要“目标”

    我试图设计一个类来封装一些 数据、结果缓存以及通过成员访问结果 功能

    我的总体目标是提供一个易于使用的类接口 使用方便,不易误用。强制执行成员函数调用顺序 除了一句评论之外什么都没有,似乎违反了我的“难以滥用”原则 目标

    我会阻止客户做出所有决定和评估

    那怎么办

    class DataProcessor {
    
    public:
    
        int getDataX(const rawDataSource &source);   // Probably you should rename the methods
        int getDataY(const rawDataSource &source);
    };
    


    这样,您只需在需要时处理数据。您可以检查您的数据是否已被处理并且仍然有效。

    我认为我的类实际上应该是这样的:

    class DataProcessor
    {
    private:
        // Moved to private. Now called by the constructor.
        void populateUsing(const rawDataSource &source);
    
    public:
        DataProcessor(const rawDataSource &source);
    
        int getDataX() const;
        int getDataY() const;
    };
    
    populationing()
    作为一个公共函数的原因是允许灵活地确定何时进行(可能是密集的)处理


    但是,调用方仍然可以通过在需要时(或当所需的rawDataSource有效时)简单地创建
    数据处理器
    对象来控制处理时间。

    这可能适用于其他具有类似设计要求的对象。但是,在我的例子中,在调用getData[XY]时,rawDataSource对象不可用。
    class DataProcessor
    {
    private:
        // Moved to private. Now called by the constructor.
        void populateUsing(const rawDataSource &source);
    
    public:
        DataProcessor(const rawDataSource &source);
    
        int getDataX() const;
        int getDataY() const;
    };