我们应该将可以在 O(1) 中获取的变量传递给嵌套函数,还是在每个嵌套函数中调用该函数?
Should we pass a variable that can be acquired in O(1) into nested functions, or recall that function within every nested function?
下面的例子最好地解释了这个问题。哪个是标准的:(A)或(B)?
A) 在每个嵌套函数中传递变量:
def bar(X, y, n_rows, n_cols):
# Do stuff....
return stuff
def foo(X, y, n_rows, n_cols):
stuff = bar(X, y, n_rows, n_cols)
# Do stuff...
return stuff
B) 在每个嵌套函数中调用 O(1) 函数:
def bar(X, y):
n_rows = get_number_of_rows(X) # X.shape[0]
n_cols = get_number_of_cols(X) # X.shape[1]
# Do stuff....
return stuff
def foo(X, y):
n_rows = get_number_of_rows(X) # X.shape[0]
n_cols = get_number_of_cols(X) # X.shape[1]
stuff = bar(X, y)
# Do stuff...
return stuff
将行数和列数传递给嵌套函数似乎有点冗长,但另一方面,保持设置变量似乎效率低下。我什至不太确定是否可以在恒定时间 O(1) 内获取行数和列数。我在 Python 中写了这个(在现实中使用 R),但我的目标是足够通用地构建这个问题,以便它可以应用于任何语言。
有用的链接:
Are there guidelines on how many parameters a function should accept?(建议将其设为对象以避免使用多个参数)
问题:
- 哪个可读性更好?
- 哪个性能更好?
- 我们是否应该以一种永远不会出现这种情况的方式进行编码?
- (1) 和 (2) 的答案是否会因不同的语言而有所不同?
P.S。在这个问题的命名方面需要一点帮助——不那么冗长更通用。
我认为
B
是首选,因为它避免了一些更改参数数量或名称的问题。选项 A
有代码味道 data clumps, and B
is his solution called preserve whole object。
而且这两种方法都有 trump data
的味道。这可以通过使 OO re-design 并使传递的变量成为 class 的成员来解决。或者引入全局或上下文变量(但这种情况相当罕见)
如果没有不需要的副作用或按值复制大对象,那么性能可以忽略不计。我建议您在开发时遵守以下规则:Don't do premature optimization.
“从不”一词不适用于软件设计。这完全取决于上下文。
我是这么认为的,不仅针对不同的语言,还针对在一种语言的框架内解决的问题,使用的工具,库,框架等等
下面的例子最好地解释了这个问题。哪个是标准的:(A)或(B)?
A) 在每个嵌套函数中传递变量:def bar(X, y, n_rows, n_cols):
# Do stuff....
return stuff
def foo(X, y, n_rows, n_cols):
stuff = bar(X, y, n_rows, n_cols)
# Do stuff...
return stuff
B) 在每个嵌套函数中调用 O(1) 函数:
def bar(X, y):
n_rows = get_number_of_rows(X) # X.shape[0]
n_cols = get_number_of_cols(X) # X.shape[1]
# Do stuff....
return stuff
def foo(X, y):
n_rows = get_number_of_rows(X) # X.shape[0]
n_cols = get_number_of_cols(X) # X.shape[1]
stuff = bar(X, y)
# Do stuff...
return stuff
将行数和列数传递给嵌套函数似乎有点冗长,但另一方面,保持设置变量似乎效率低下。我什至不太确定是否可以在恒定时间 O(1) 内获取行数和列数。我在 Python 中写了这个(在现实中使用 R),但我的目标是足够通用地构建这个问题,以便它可以应用于任何语言。
有用的链接:
Are there guidelines on how many parameters a function should accept?(建议将其设为对象以避免使用多个参数)
- 哪个可读性更好?
- 哪个性能更好?
- 我们是否应该以一种永远不会出现这种情况的方式进行编码?
- (1) 和 (2) 的答案是否会因不同的语言而有所不同?
P.S。在这个问题的命名方面需要一点帮助——不那么冗长更通用。
我认为
B
是首选,因为它避免了一些更改参数数量或名称的问题。选项A
有代码味道 data clumps, andB
is his solution called preserve whole object。而且这两种方法都有
trump data
的味道。这可以通过使 OO re-design 并使传递的变量成为 class 的成员来解决。或者引入全局或上下文变量(但这种情况相当罕见)如果没有不需要的副作用或按值复制大对象,那么性能可以忽略不计。我建议您在开发时遵守以下规则:Don't do premature optimization.
“从不”一词不适用于软件设计。这完全取决于上下文。
我是这么认为的,不仅针对不同的语言,还针对在一种语言的框架内解决的问题,使用的工具,库,框架等等