Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters 处理大量输入参数和大量输出_Parameters_Oop - Fatal编程技术网

Parameters 处理大量输入参数和大量输出

Parameters 处理大量输入参数和大量输出,parameters,oop,Parameters,Oop,我需要做一个复杂的计算。在我的例子中,创建计算器类(使用策略模式进行抽象)似乎是最自然的 要执行计算,该类需要接受大约20个输入,其中一些是可选的,一些可能会在将来更改等。一旦调用Calculate()方法,大约需要输出20个不同的变量 有很多方法可以实现这一点 作为参数传递给计算方法的输入 通过计算器的属性传入的输入 将输入包装到自己的类中,然后传递给Calculate()方法 Calculate()返回的输出,封装在类中 将输出填充到传递给Calculate()方法的参数中 调用Calcu

我需要做一个复杂的计算。在我的例子中,创建计算器类(使用策略模式进行抽象)似乎是最自然的

要执行计算,该类需要接受大约20个输入,其中一些是可选的,一些可能会在将来更改等。一旦调用Calculate()方法,大约需要输出20个不同的变量

有很多方法可以实现这一点

  • 作为参数传递给计算方法的输入
  • 通过计算器的属性传入的输入
  • 将输入包装到自己的类中,然后传递给Calculate()方法
  • Calculate()返回的输出,封装在类中
  • 将输出填充到传递给Calculate()方法的参数中
  • 调用Calculate()后从计算器的公共属性检索的输出
所有这些方法都有利弊。 你会怎么做

更新: 谢谢你的反馈

此计算器的目的是生成报价。输入内容包括客户地址、利率、目标利润、附加费用、产品id等。输出内容包括报价、实际利润、更多费用等


我已经创建了ICalculateInput和ICalculateOutput接口及其具体类,系统现在运行得非常好。Calculator类还继承自ICalculator接口(因为所涉及的计算因产品来源的公司而异)。

您没有提到该语言,但我假设是c。 我可能会将它们作为结构(或类)传入,并以相同的方式返回输出


或者,我会找到一些方法来重构它并简化预期的输入/输出。

尝试做.net中的数据库提供程序类所做的事情

拥有一个参数类(具有一个带方向的类型和值属性,即输入/输出)&拥有一个参数(参数集合)作为计算器的属性


有关详细信息,请查看.net中用于调用存储过程/函数的OleDBCommand/SQLCommand类。

就我个人而言,我会创建一个自定义输入和输出结构或类,并预填充它们,传入它们,然后接收输出结构或类的返回值。

长的参数列表非常繁重且容易出错。告诉我们更多关于应用程序和环境的信息,但一般来说,传递某个类的对象或使用列表之类的东西都很有诱惑力

我所做的一个相当巧妙的处理方法是使用复合模式。例如,在Java中,您可以创建一个Parameter接口,然后创建一个实现Parameter的对象列表

  • 将输入包装到自己的类中,然后传递给Calculate()方法
  • Calculate()返回的输出,封装在类中
只有当您进行多步骤计算,或者基本计算步骤可能不止一次并且很难重新填充输入时,将状态存储在计算器中才有意义。否则,当您对它进行多线程处理或在代码的不同部分重用同一对象时,它将是一个糟糕的抽象,并且将失败

拥有大量的参数很难维护和读取,如果需要更改,则很难灵活处理


改变参数以生成输出是个坏主意。从调用方的角度看,他“拥有”的类通过将其传递到函数中而发生了更改,这一点并不明显

根据经验,不要创建接受超过3-4个单独参数的方法

在JavaScript中不应执行的操作

var addUser = function (name,surname, age, add1, add2, telephone) {
    //do something
};
与其采取上述措施,不如采取以下措施:

var addUser = function (userDetails) {
    //Do something with userDetails.name etc...
};
//Then invoke the function by passing in an object:
var ud = {name : 'Andreas', surname : 'Grech', age : 20, add1 : 'bla', add2 : 'bla', telephone : 12343}; 
addUser(ud);

通过这种方式,您可以在不中断函数的情况下,按照您喜欢的顺序输入参数,甚至可以跳过一些大多数人建议使用的“参数类”和“结果类”。我同意这种方法,但在我看来,您的参数分为几类。也许您可以为所需参数创建一个参数类,为可选参数或可选参数组创建一个单独的参数类。这样,您可以根据需要的计算类型创建不同的方法

Result calculate(RequiredArgs requiredArgs) {
...
}

Result calculate(RequiredArgs requiredArgs, OptionalArgs optionalArgs) {
}

Result calculate(RequiredArgs requiredArgs, OptionalArgs optionalArgs, OtherOptionalArgs oOpitonalArgs) {
}
这将使您的API更易于使用。如果不想为不同的组创建类,也可以使用映射,但这需要在计算引擎中使用更多验证代码。通常我更喜欢参数类,但必须了解更多关于特定问题的信息才能做出决定


由于线程安全性和对象可重用性,我不会将计算结果存储在计算引擎本身中。维护无状态代码要容易得多。

我同意您的输入和输出应该包含在它们自己的类中

一个可能要考虑的可能性是,如果某些或全部参数是可选的,则使用该结构来构造输入对象。

您忽略了

  • 输入放在字典中,然后传递到计算

有人想知道为什么一个函数有20个输入。。。似乎太过分了。但是如果您需要它们,有些是可选的,并且计算方法将来可能会通过策略模式进行更改,那么传入一组命名变量可能是有意义的。您甚至可以在集合中指定策略模式,这样计算方法就完全通用了

,前提是您已经仔细考虑过这一点,并且确定确实需要所有这些参数:

我很可能使用命名参数,但我的选择语言(Perl)支持顺序无关的命名参数。如果您没有,则下一步就是传入对象