我正在写一个函数来完成一项特定的任务。此函数需要一些临时数据来处理任务。问题是如果我在这个函数中做了所有事情,那么这个函数的大小就会很大。然后我想把这个功能分解成许多小功能。但是,如果我这样做,我需要将一些临时数据传递给那些小函数。它使代码看起来不太好。所以我考虑创建一个包含输入,输出和临时数据的私有数据的类,这些小函数成为类的方法。下面是代表我的想法的伪代码。
/* 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;
}
我的问题是:使用类来表示任务是否正确?
答案 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 unsortedData
和struct 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()
}