Parameters 处理大量输入参数和大量输出
我需要做一个复杂的计算。在我的例子中,创建计算器类(使用策略模式进行抽象)似乎是最自然的 要执行计算,该类需要接受大约20个输入,其中一些是可选的,一些可能会在将来更改等。一旦调用Calculate()方法,大约需要输出20个不同的变量 有很多方法可以实现这一点Parameters 处理大量输入参数和大量输出,parameters,oop,Parameters,Oop,我需要做一个复杂的计算。在我的例子中,创建计算器类(使用策略模式进行抽象)似乎是最自然的 要执行计算,该类需要接受大约20个输入,其中一些是可选的,一些可能会在将来更改等。一旦调用Calculate()方法,大约需要输出20个不同的变量 有很多方法可以实现这一点 作为参数传递给计算方法的输入 通过计算器的属性传入的输入 将输入包装到自己的类中,然后传递给Calculate()方法 Calculate()返回的输出,封装在类中 将输出填充到传递给Calculate()方法的参数中 调用Calcu
- 作为参数传递给计算方法的输入
- 通过计算器的属性传入的输入
- 将输入包装到自己的类中,然后传递给Calculate()方法
- Calculate()返回的输出,封装在类中
- 将输出填充到传递给Calculate()方法的参数中
- 调用Calculate()后从计算器的公共属性检索的输出
我已经创建了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)支持顺序无关的命名参数。如果您没有,则下一步就是传入对象