假设我有一个带有一对坐标x
和y
的函数:
myFunction(int x, int y)
{
// Do stuff...
}
现在,我可以将这些参数包装到Point
结构中:
struct Point
{
int x;
int y;
}
myFunction(Point p)
甚至为程序员提供两种选择:
myFunction(int x, int y)
myFunction(Point p)
{
myFunction(p.x, p.y)
}
使用结构分组参数而不是单独传递它们有什么优缺点?
这些权衡因编程语言而异吗?
答案 0 :(得分:3)
结构是首选方式!
当你有一个或两个参数时(比如你的例子),没有太大的区别,但当你有4个或更多参数时,差别是显而易见的(你必须输入更少的代码)。
如果您想将参数作为指针或引用传递,则可以输入更少的代码。
使用 struct 的另一个好处是代码更易于维护。
让我们在实践中使用您自己的示例
来看待它想象一下,您正在创建一个CAD应用程序,并且在最初的想法中,程序只能在一个平面(X,Y)中工作,因此您将有很多函数用作参数一个或多个点,类似于这样:
struct point
{
int x;
int y;
}
func Foo1(point a) {}
func Foo2(point a, point b) {}
.
.
.
但是几个月后应用程序设计发生了变化,现在它需要在空间(3D世界)中工作,因此您需要将Z坐标添加到点。
如果您正在使用结构,您唯一需要做的就是将Z变量添加到结构中并完成(当然,您需要更新函数中的公式)但如果您不使用您需要将Z参数添加到使用点作为参数的每个函数的结构。
func Foo1(int x, int y, int z) {}
func Foo2(int p1x, int p1y, int p1z, int p2X, int p2Y, int p2Z) {}
您可以在此处查看更详细的说明https://en.wikipedia.org/wiki/Struct_(C_programming_language)
答案 1 :(得分:3)
这将是高度语言特定的。结构在某些语言中很自然,而在其他语言中则不然。命名参数在某些语言中很自然,而在其他语言中则不然。有些语言不区分你的两种情况(考虑ML,其中两个值的匿名元组与结构基本相同)。
这也是高度针对具体情况的。如果你用点做了很多工作,那么拥有一个封装点的类型是很有意义的。如果这是整个系统中唯一需要一个点的功能,那么为此创建一个特殊类型可能非常麻烦。没有人回答"我应该在这里使用一种类型" (这是你问题的更好版本)。
不要专注于函数参数。专注于类型。什么类型的系统有意义?然后创建适用于这些类型的函数。