我正在编写一个库的算法,我根本没有使用函数调用。 该算法大约有100行,并且没有重复的代码。或者我应该使用内联?
答案 0 :(得分:11)
您的算法可读吗?将它分成几个函数可能有利于可读性(因此可维护性),即使它不会减少重复。
答案 1 :(得分:6)
这是两个问题:
1.的答案是:它取决于。一般来说,许多人喜欢将功能放在一个屏幕上,因此可以一目了然地阅读。所以100条线是极限。参见例如 Good practice class line count关于类/方法大小的讨论。
2.答案是:不要过早优化。首先介绍,然后根据需要进行优化。 SO上有太多类似的问题要链接到......
答案 2 :(得分:5)
大多数情况下,如果我的算法超过20行,我使用了错误的抽象级别。下一个错误修正将增加10行,以下功能将增加40行的功能。
最好将功能块移动到更小的功能中,以他们所做的命名。对我来说更好,因为它允许我分开例如从微观行为的宏观行动序列。更好的维护,因为您可以查看代码的全局结构,并放大感兴趣的部分。
答案 3 :(得分:2)
你应该问自己的问题,来判断100行算法是否正常是:
我的代码的所有部分的意图是否明显?
如果你有一个块,比方说10行左右做一些不明显的事情,那么把它放在一个函数中并给它一个好名字要比添加一个注释或什么也不做都好。
罗伯特·C·马丁的“清洁代码”是一本你可能想要查看的书,如果你发现自己一再问自己这样的问题。答案 4 :(得分:1)
您的问题非常模糊,我能提供的最好的问题是"How often should you refactor?"和"How and How often do you refactor your code?"。
答案 5 :(得分:1)
可能合理。但通常情况并非如此。如果你有深层嵌套循环和ifs,那么整个方法都使用变量,那么理解流程要困难得多。我会说如果你在一个方法中有100行,你对这个算法没有好好考虑。举个例子: if(x> y) z = x; 其他 z = y; 当然用z = max(x,y)来表达得更好;这些是算法中的模式,当找到并提取时,将使您的方法表达算法的意图,而不是实现细节......
print max(x,y)
或
print (x > y ? x : y)
或
print GetPreferredValue(x, y)
其中GetPreferredValue()只执行max(x,y),但它告诉你 WHAT 你要输出。
答案 6 :(得分:0)
内联是编译器的“提示”;这意味着编译器可能会或可能不会内联代码。
在您的情况下,编译器可能会忽略内联,因为它看起来像一个大函数。
答案 7 :(得分:0)
首先,函数用于代码重用。如果您没有任何重复代码,则不需要使用函数,只要考虑性能。
为了便于阅读,你仍然可以考虑它。
答案 8 :(得分:0)
好吧,冒泡排序算法短于100行并且不使用任何函数调用,那你为什么要这样做:)
我的回答是“是的,如果您认为这是最好的方法,那么编写这样的算法是完全合理的”
答案 9 :(得分:0)
没有看到代码,很难说。
可能有用的指南是查看您的代码,看看算法中是否有任何明显的阶段,特别是如果它们之前有标题注释。如果有,我发现删除标题注释并拆分为命名良好的函数通常更具可读性。唯一需要注意的是,你不应该将大量的参数(可能不超过3个)传递给函数,因为这会破坏任何可读性的好处。
这假设算法不必尽可能快,但即便如此,内联通常也会成功。一般来说,更喜欢可读性并记住函数是一种非常好的抽象形式。
答案 10 :(得分:0)
一般情况下,如果不将代码分解为函数,就不会节省太多,只要这样做就不会比其他情况更多地执行低级代码了。进入和退出功能的成本就是这样,并且通常并不重要,除非你在实际占主导地位的低水平上做到这一点。
功能调用的真实成本就像信用卡一样,它们很容易调用,因此它们可以轻松地花费超过必要的周期,特别是如果它们出现在多层抽象。