一个好的Erlang程序员如何编写这段代码?
loop(expr0) ->
case expr1 of
true ->
A = case expr2 of
true -> ...;
false -> ...
end;
false->
A = case expr3 of
true -> ...;
false -> ...
end
end,
loop(expr4(A)).
答案 0 :(得分:4)
一般来说,您希望使代码更易于阅读。通常最好将代码段提取到函数中以避免长期或深度嵌套的函数,并提供自我解释的名称以澄清一段代码的目的:
loop(expr0) ->
case expr1 of
true ->
A = do_something(expr2);
false->
A = do_something_else(expr3)
end,
loop(expr4(A)).
do_something(E) ->
case E of
true -> ...;
false -> ...
end
do_something_else(E) ->
case E of
true -> ...;
false -> ...
end
现在,一个随意的读者知道如果expr1为真,你的函数会某些东西而如果expr1为假则其他东西。良好的命名约定在这里有很大帮助。您也可以使用注释执行此操作,但代码永远不会过时,因此更易于维护。我还发现短函数比真正的loooong函数更容易阅读。即使这些长函数都有内联的内容。
一旦您清楚地说明了您的功能,您可能希望缩短代码。短代码更容易阅读和维护,但不要使用“聪明”结构缩短太多,否则你会模糊它,这与你想要的相反。您可以从函数头中使用模式匹配开始:
loop(expr0) ->
case expr1 of
true ->
A = do_something(expr2);
false->
A = do_something_else(expr3)
end,
loop(expr4(A)).
do_something(true) -> ...;
do_something(false) -> ....
do_something_else(true) -> ...;
do_something_else(false) -> ....
然后,你可以避免在main函数中重复A(除了嵌套语句中的变量是我一直不喜欢的一个特性)
loop(expr0) ->
A = case expr1 of
true -> do_something(expr2);
false-> do_something_else(expr3)
end,
loop(expr4(A)).
do_something(true) -> ...;
do_something(false) -> ....
do_something_else(true) -> ...;
do_something_else(false) -> ....
我认为就是这段代码。使用更多上下文,您还可以使用一些抽象来减少重复性,但在抽象时要小心,如果过度使用,您还会再次隐藏代码,从而失去通过删除类似代码而获得的维护优势。
答案 1 :(得分:3)
目前编写的代码很难简化。问题是ExprX
条目未知,因此无法在不知道这样做的情况下简化代码。如果你有一个更完整的例子,我们将有更好的时间尝试优化它。
具体问题是我们不知道Expr2
和Expr3
如何依赖于Expr1
。我们不知道Expr0
的目的是什么,关于Expr4
的依赖性,除了使用返回的A
之外,我们都不知道。
答案 2 :(得分:0)
为什么在循环函数中需要expr0?