如何简化/改进Erlang代码?

时间:2011-02-05 13:12:33

标签: refactoring erlang

一个好的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)).

3 个答案:

答案 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条目未知,因此无法在不知道这样做的情况下简化代码。如果你有一个更完整的例子,我们将有更好的时间尝试优化它。

具体问题是我们不知道Expr2Expr3如何依赖于Expr1。我们不知道Expr0的目的是什么,关于Expr4的依赖性,除了使用返回的A之外,我们都不知道。

答案 2 :(得分:0)

为什么在循环函数中需要expr0?