как упростить / улучшить код Erlang? - PullRequest
2 голосов
/ 05 февраля 2011

Как хороший программист из Эрланга написал бы этот код?

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 ]

4 голосов
/ 06 февраля 2011

Вообще говоря, вы хотите сделать свой код более читабельным. Обычно хорошей идеей является извлечение фрагментов кода для функций, чтобы избежать длинных или глубоко вложенных функций, и предоставление самообъяснимых имен, которые проясняют цельчасти кода:

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 ложно.Хорошие соглашения об именах очень помогают здесь.Вы также можете сделать это с комментариями, но код никогда не устареет, и, следовательно, его легче поддерживать.Я также нахожу короткие функции, которые легче читать, чем действительно простые функции.Даже если у этих длинных функций есть встроенные комментарии.

Как только вы четко заявите, что делает ваша функция, вы можете захотеть сократить код.Короткий код легче читать и поддерживать, но не слишком сокращайте его, используя «умные» конструкции, иначе вы его затените, что противоположно тому, что вы хотите.Вы можете начать с использования сопоставления с образцом в функциональных заголовках:

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) -> ....

Затем вы можете избежать повторения 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) -> ....

И я думаю, что именно для этого куска кода.Имея больше контекста, вы также можете использовать некоторые абстракции, чтобы уменьшить дублирование, но будьте осторожны при абстрагировании, если вы переусердствуете с ним, вы снова затенете код, потеряв преимущество в обслуживании, которое вы ожидали получить, удалив аналогичный код.*

3 голосов
/ 05 февраля 2011

Код, как он написан в настоящее время, сделать проще.Проблема в том, что записи ExprX неизвестны, поэтому нет способа упростить код, не зная, что это выгодно.Если у вас есть более полный пример, у нас будет намного лучше попытаться оптимизировать его.

Конкретная проблема заключается в том, что мы не знаем, как Expr2 и Expr3 зависят отExpr1 например.И мы не знаем, какова цель Expr0, и как насчет зависимости Expr4, кроме того, что она использует возвращенный A.

0 голосов
/ 05 февраля 2011

Зачем нужен expr0 в функции цикла?

...