【发布时间】:2018-11-07 21:17:44
【问题描述】:
我不知道如何构造函数调用。我知道“干净的代码规则”说函数应该只做一件事,并且你应该让它们尽可能小。所以我愿意。
但我不确定如何调用这些函数。我不知道如何命名这些概念,但我正在努力在“在函数内部调用函数”或“链接/管道函数”之间做出选择。在下面的示例中,我有一个非常基本的示例,但我希望它使我所谈论的概念更加清晰。
“Chaining/Piping”使代码更容易进行单元测试,您不需要模拟函数。但是“调用内部函数”使代码更短,可能更具可读性。
你如何选择一种方式或另一种方式?
顺便说一句,如果有人能指出一个好的来源,我很难寻找这些概念之间的差异——那就太好了。
# Calling inside a function
def sum_of_squares(numbers):
return sum([square(num) for num in numbers])
def square(num):
return num*num
numbers = [2,3,4]
square_sum = sum_of_squares(numbers))
print(square_sum) # prints 29
-----
# Chaining/Piping
def sum_of_squares(squares):
return sum(squares)
def square(num):
return num*num
numbers = [2,3,4]
squares = [ square(num) for num in numbers ]
square_sum = sum_of_squares(squares))
print(square_sum) # prints 29
【问题讨论】:
-
一个函数不需要只做一件事,它可以做多个简单的事情,更重要的是它不会(通常)将过程调用(例如写入文件)与有用的返回值。
-
第二种方式客观上是不好的,因为
sum_of_squares只是一个名字不好的sum。这与单元测试完全无关。 -
对于您的示例,单个函数就可以了,或者使用顶部的函数(底部的函数只是
sum_of_squares = sum无意义 -
def sum_of_squares(numbers): return sum(num*num for num in numbers)会很好——当然对于不那么琐碎的例子,分解代码是有意义的 -
感谢您的回答,我对不同类型的(虚构的?)概念更感兴趣。也许这个例子太基础了,我应该在代码审查交流中发布我的代码。
标签: python unit-testing functional-programming