在设计函数时,您是否使用这些值传递对象的显式值?

时间:2011-07-28 04:10:08

标签: design-patterns architecture

这只是一个简单的设计问题......谁的回答可能是更多的意见或偏好,或者“它取决于”但不过我会问它。

如果我需要创建一个取值的函数,但是我有一个包含这些值的对象,那么你只传递整个对象或值。

如:

private void myFunction (int obj.a, double obj.b, bool obj.c , Object subObj)

private void myFunction (Object obj)

我正在查看我编写的一些代码,但这与我的编写方式不一致。现在我想清理代码,但这些差异使它更加有效。

是否存在与(KISS,DRY,SOLID)相关的行业“拇指规则”?

您可能会遵循一些规则或指南吗?

我还有其他方法吗?

感谢。

P.S。我猜对象可能是IObject,这可能更好(??)但我认为这不会改变整体问题。

5 个答案:

答案 0 :(得分:4)

虽然从程序员到程序员的答案可能各不相同,但人们已经提出了一些经验法则,例如“一旦你得到四个论点,就将它们全部捆绑在一个对象中。”

请注意,使用具有良好对象文字的语言在单个对象中传递一组参数要容易得多,并且不要求您声明类或调用getter,因此语言本身确实存在。

Rebecca Murphey最近的博客文章正在深入探讨这个问题。我想你可能会喜欢它:http://blog.rebeccamurphey.com/objects-as-arguments-in-javascript-where-do-y

答案 1 :(得分:1)

myFunction是否需要了解Object?如果是这样,请传递Object。或者myFunction只需要三个可以来自任何地方的值吗?如果是,则传递三个值。作为一般规则,倾向于后一种选择,因为它为您提供了更通用的功能和更少的依赖性。如果myFunction确实需要了解Object,那么它应该是Object的方法。

答案 2 :(得分:1)

问题归结为:做“有意义”的论点是一个有意义的对象吗? 如果是这样,您可以将它们放在一起作为“参数对象”但是,如果该参数对象仅在此特定上下文中使用,则它再次没有意义。

示例,myMethod(int a,int b,float d);参数甚至没有正确的名称,所以根本不会为它制作一个Parameter对象。现在提出这个问题,setOwner(String familyName,String firstName,Date birthday),显然这描述了一个完整的人物,所以为什么不使用Person-Object?

最后:如果您的API主要关注在您的域中有意义的对象,而不是传递原始或简单类型,那么您的API会变得更具表现力。

E.g。在Java UI编程中,我经常使用Dimensions对象而不是宽度和高度作为参数。

答案 3 :(得分:0)

我作为一般OOP的观点(弗兰克:我没有太多经验):

这取决于方法的功能。如果希望方法仅操作特定类型对象的值,则接受此类对象作为参数可以提供更好的含义。但是如果你想让方法操纵一般函数(不是特定于任何对象),那么传递单个值会给出更好的含义。

答案 4 :(得分:0)

当您将Object传递给函数并在其中使用其成员(属性/方法)时,您将在该Object上创建物理依赖关系。这意味着无论何时出于任何原因需要在Object中更改某些内容,您还需要考虑如何在此函数中使用它。有时它是可取的,有时不是 - 它取决于背景。一般的经验法则是依赖性越小越好。传递显式参数而不是Object也更适合依赖性反转原则,因为我们不依赖于Object的具体实现。 也就是说,为函数提供许多参数并不是很实用,并且通常只为此目的引入特定类型的对象 - 容器。