首页 > 解决方案 > 我们应该将可以在 O(1) 中获取的变量传递给嵌套函数,还是在每个嵌套函数中调用该函数?

问题描述

下面的例子最好地解释了这个问题。哪个是标准的:(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),但我的目标是把这个问题概括得足够笼统,使它可以应用于任何语言。

有用的链接:
是否有关于函数应该接受多少参数的指南?(建议将此作为对象以避免多个参数)

问题:
  1. 哪个可读性更好?
  2. 哪个性能更好?
  3. 我们应该以一种永远不会出现这种情况的方式编码吗?
  4. (1) 和 (2) 的答案是否会因不同的语言而不同?

PS 这个问题的命名需要一点帮助——不那么冗长,更通用。

标签: performancefunctionparameterscoding-stylestandards

解决方案


我觉得

  1. B是首选,因为它避免了更改参数数量或名称的一些问题。选项A有一个代码气味数据块,并且B是他的解决方案,称为保留整个对象

    两种方法都有trump data气味。这可以通过重新设计 OO 并使传递的变量成为类的成员来解决。或者引入全局变量或上下文变量(但这种情况很少见

  2. 如果没有不需要的副作用或按值复制大对象,则可以忽略性能。我建议您在开发时遵守以下规则:不要过早优化。

  3. “从不”这个词不适用于软件设计。这一切都取决于上下文。

  4. 我认为是这样,不仅针对不同的语言,还针对在一种语言的框架内解决的问题、使用的工具、库、框架等。


推荐阅读