如何减少传递给main的参数数量

时间:2017-08-30 11:10:25

标签: java design-patterns arguments

有没有办法以某种方式减少或压缩传递给main的参数数量,这些参数很多?

假设我有一个Ludo游戏,我需要传递一些玩家,名字,颜色,玩家类型(人类,计算机),计算机玩家的AI类型。这是很多争论。

我认为我不能使用Effective Java中描述的任何技术。有没有聪明的方法来实现这个目标?

4 个答案:

答案 0 :(得分:1)

如果您愿意对事物进行非规范化并接受例如CSV字符串,那么可以将所有内容减少为一个参数:

"3, Jack, Jill, Jon, ..."

然后在main()方法中解析CSV:

public static void main(String[] args) {
    String input = args[0];
    String[] params = input.split(",\\s+");

    int numPlayers = Integer.parseInt(params[0]);
    String name1 = params[1];
    // and so on
}

答案 1 :(得分:1)

如何将参数存储在文件中,并将文件名路径作为参数

答案 2 :(得分:0)

如果你想在程序开始时获取这些信息,那么你最好从csv文件中读取它们,因为它们很容易在java中访问和操作。

如果您想将这些信息从一个方法传递到另一个方法,我建议使用一个模型类,它存储程序运行时所需的所有有价值的信息。这会提高性能,因为每次将信息传递给新方法时都不需要为变量分配新空间。

答案 3 :(得分:0)

我喜欢在PHP中将长参数列表作为关联数组或在Javascript中作为对象文字传递。在我的函数内部,我有一个默认值的数组。然后我接受传递的params数组并用传递的覆盖默认值。这样我就不必记住任何顺序,我可以省略我不想传递的参数/我想使用默认值的地方,并且数组键使代码在调用函数的地方更具可读性

示例(抱歉,PHP):

function talk(array $params)
{
    $defaults = [
       'foo' => 'Hi,',
       'bar' => 'my ',
       'baz' => 'name is ',
       'foobar' => 'Benni'
    ];

    $eff_params = array_merge($defaults, $params);

    return $eff_params['foo'] . $eff_params['bar'] . $eff_params['baz'] . $eff_params['foobar'];
}

然后调用这个函数:

echo talk([
    'foobar'  => 'Ted',
    'foo'    => 'Hello '
]);

// Hello my name is Ted 
BTW,JQuery经常使用这种技术,例如:因为它是$ .ajax()函数