我发现过去 2-3 个参数,记住函数的所有参数的能力会受到影响。以及随之而来的可理解性。
传递命名参数会有所帮助。具有方便的类似散列的文字语法的语言使这变得非常容易。以 JavaScript 为例:
g = new Gundam00();
g.fight({opponent: enemy, casualties: 'numerous'});
您还可以利用可变长度参数功能来处理此问题(将奇数参数视为名称,将偶数参数视为实际参数)。
g.fight('opponent',enemy,'casualties', 'numerous');
有些语言实际上直接支持命名参数(参见:http://en.wikipedia.org/wiki/Named_parameter#Use_in_programming_languages)。
最后,您可能需要考虑为此添加其他方法,使用所谓的 Fluent 接口 (http://en.wikipedia.org/wiki/Fluent_interface)。基本上,你有返回对象本身的方法调用,所以你可以将调用链接在一起:
g.opponent(enemy).casualties('numerous').fight();
如果您使用的是明显/静态类型的以类为中心的语言,这可能是最简单的选择。
更新
回应 Setsuna 的评论...在最后一个示例中,如果您有足够的能力,您可以制作像 opponent 和 casualties 这样的简单设置器,它们不会影响任何其他内部状态或计算比设置为其命名的参数的方式。他们只是简单地设置内部属性,然后所有的实际工作都发生在像fight 这样的操作方法中。
如果你不能这样做(或者如果你不喜欢编写操作是亚原子的方法),你可以在这个想法和类似哈希的文字想法之间找到一个中间点,然后创建您自己的集合类,专门用于调用命名参数:
n = new NArgs();
g.fight(n.arg('opponent',enemy).arg('casualties','numerous').arg('motion','slow'));
有点笨拙,但它分离了命名参数问题并让您的方法更加原子化,并且 NArgs 可能是您可以很容易实现的东西,只需将一些方法包装在一种类型的 Collection(HashTable?)或以您的语言提供的其他语言。