使用结构实参与使用多个形参的优缺点是什么?



假设我有一个函数,取一对坐标xy:

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)
}

使用结构体分组参数而不是单独传递它们的优点和缺点是什么?

这些权衡在编程语言之间是否有所不同?

结构体是首选的方式!

当你有一个或两个参数时(就像在你的例子中),没有太大的区别,但是当你有4个或更多的参数时,区别是明显的(你必须输入更少的代码)。

如果你想传递参数作为指针或引用,你必须输入更少的代码。

structs的另一个优点是代码更容易维护。

让我们用你自己的例子

看看它在实践中的应用

想象你正在创建一个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)

这将是高度特定于语言的。在某些语言中创建结构是很自然的,而在其他语言中则不然。命名参数在某些语言中是很自然的,在其他语言中则不然。有些语言不区分这两种情况(考虑ML,两个值的匿名元组基本上与结构体相同)。

这也将是高度特定于上下文的。如果你做了很多关于点的工作,那么使用一个封装点的类型是很有意义的。如果这是整个系统中唯一一个取点的函数,那么为它创建一个特殊类型可能会非常麻烦。对于"我是否应该在这里使用类型"(这是你问题的更好版本),没有唯一的答案。

不要关注函数参数。关注类型。在您的系统中,哪些类型是有意义的?然后创建在这些类型上工作的函数。

最新更新