使用class来表示c ++中的任务

时间:2017-06-07 04:21:20

标签: c++ class

我正在写一个函数来完成一项特定的任务。此函数需要一些临时数据来处理任务。问题是如果我在这个函数中做了所有事情,那么这个函数的大小就会很大。然后我想把这个功能分解成许多小功能。但是,如果我这样做,我需要将一些临时数据传递给那些小函数。它使代码看起来不太好。所以我考虑创建一个包含输入,输出和临时数据的私有数据的类,这些小函数成为类的方法。下面是代表我的想法的伪代码。

/* big function */
output big_function(input)
{
    temporary_data data1;
    temporary_data data2;
    temporary_data data3;
    temporary_data data4;
    /* do task here*/
    ...
    return output;
}

/* many small function*/
output function1(input)
{
    temporary_data data1;
    temporary_data data2;
    temporary_data data3;
    temporary_data data4;
    /*do some thing */
    function2(input,data1,data2, data3, data4);
    output = function3(input,data1,data2, data3, data4);
    return output;
}

/* use class*/
class Task
{
public:
    Task(input);
    function1();
    output get_output();
private:
    function2();
    function3();
private:
    input;
    output;
    data1;
    data2;
    data3;
    data4;
}

我的问题是:使用类来表示任务是否正确?

2 个答案:

答案 0 :(得分:0)

使用对象的成员变量以避免参数传递通常会导致代码非常脆弱并且难以读取代码(类似于使用全局变量)。

在我看来,你想要的是:

output function(input);

而不是您的对象所需的三个(实际上是四个)步骤:

Task t(input);
t.function1();
output o = t.get_output();
// destructor is implicitly called at some point

另一个问题是必须按特定顺序调用t上的函数(@VolAnd在他的评论中提到这一点)。

要解决传入和传出大量参数的问题,请将结构传入和传出函数(因此在调用它时清楚读取内容和修改内容):

struct params {
  temporary_data data1;
  temporary_data data2;
  temporary_data data3;
  temporary_data data4;
};

如果适用,请使用多个结构来通信并强制执行临时数据中的状态更改(例如struct unsortedDatastruct sortedData)。

答案 1 :(得分:0)

您班级的公共界面以及内部结构取决于许多因素:

  • 如何使用该类(许多实例或单个,多线程或非多线等)
  • 什么是temporary_data(结构,类,集合/数组,或只是简单类型)
  • 临时数据量和存储数据的位置(将使用的内存 - 静态,自动(堆栈)或动态(堆))
  • 其他相关事项(如错误处理,输入和输出检查等)

对于最简单的实现(调用其他函数的解决方案的一个函数调用),我的建议是考虑:

  • 使用一个静态方法output solve_task(input)而不是三个创建类 - Task(input)(构造函数),function1()(运行解决方案)和output get_output()(获取结果)< / LI>
  • solve_task
  • 调用私有字段和方法也必须是静态的
  • solve_task可以尽可能简单,例如
     output solve_task(input)
     {
        if(!check_input(input))
        {
            // reaction on wrong input
            throw(badInput);
        }
        // data preparation
        function1(input); // init private fields
        function2(input); // find/fill the temporary data
        // solution
        function3(); // works with internal temporary data 
        ...
        functionN(); // works with internal temporary data 
        // providing result
        return prepare_output()
     }