使用结构参数 v.s 的优点和缺点是什么?多个参数
What are the pros and cons of using a struct argument v.s. multiple parameters
假设我有一个函数接受一对坐标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)
}
使用结构对参数进行分组而不是单独传递参数有哪些优点和缺点?
这些权衡是否因编程语言而异?
结构是首选方式!
当你有一个或两个参数时(就像在你的例子中)没有太大区别但是当你有 4 个或更多参数时区别很明显(你必须输入更少的代码)。
如果您想将参数作为指针或引用传递,您需要输入更少的代码。
使用 structs 的另一个优点是代码更易于维护。
让我们用你自己的例子来实践一下
假设您正在创建一个 CAD 应用程序,并且在最初的想法中,该程序仅在平面 (X, Y) 中工作,因此您将有很多函数使用一个或多个点作为参数,如下所示:
struct point
{
int x;
int y;
}
func Foo1(point a) {}
func Foo2(point a, point b) {}
.
.
.
但几个月后,应用程序设计发生了变化,现在它需要在 space(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,其中两个值的匿名元组基本上与结构相同)。
这也将是高度特定于上下文的。如果你用点做很多工作,那么拥有一个封装点的类型就很有意义了。如果这是整个系统中唯一需要一个点的函数,那么为其创建一个特殊类型可能会非常麻烦。 "should I use a type here" 没有唯一答案(这是你问题的更好版本)。
不要关注函数参数。专注于类型。哪些类型在您的系统中有意义?然后创建适用于这些类型的函数。
假设我有一个函数接受一对坐标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)
}
使用结构对参数进行分组而不是单独传递参数有哪些优点和缺点?
这些权衡是否因编程语言而异?
结构是首选方式!
当你有一个或两个参数时(就像在你的例子中)没有太大区别但是当你有 4 个或更多参数时区别很明显(你必须输入更少的代码)。
如果您想将参数作为指针或引用传递,您需要输入更少的代码。
使用 structs 的另一个优点是代码更易于维护。
让我们用你自己的例子来实践一下
假设您正在创建一个 CAD 应用程序,并且在最初的想法中,该程序仅在平面 (X, Y) 中工作,因此您将有很多函数使用一个或多个点作为参数,如下所示:
struct point
{
int x;
int y;
}
func Foo1(point a) {}
func Foo2(point a, point b) {}
.
.
.
但几个月后,应用程序设计发生了变化,现在它需要在 space(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,其中两个值的匿名元组基本上与结构相同)。
这也将是高度特定于上下文的。如果你用点做很多工作,那么拥有一个封装点的类型就很有意义了。如果这是整个系统中唯一需要一个点的函数,那么为其创建一个特殊类型可能会非常麻烦。 "should I use a type here" 没有唯一答案(这是你问题的更好版本)。
不要关注函数参数。专注于类型。哪些类型在您的系统中有意义?然后创建适用于这些类型的函数。