Существует ли идиоматический способ заказать аргументы функции в Erlang?

mbUnit стоит alook, он имеет ряд функций, сопоставимых с NUnit, он имеет свой собственный GUI или может быть интегрирован в VS, если Вы имеете Resharper. Я также рекомендовал бы Rhino Mocks, если Вы делаете какой-либо вид TDD.

12
задан pjb3 24 November 2009 в 04:04
поделиться

2 ответа

Хорошо, немного истории, насколько я помню, и некоторые принципы, лежащие в основе моего стиля.

Как сказал Кристиан, библиотеки развивались и имели тенденцию получать порядок аргументов и ощущения от импульсов, которыми мы были как раз тогда. Так, например, причина, по которой element / setelement имеет такой порядок аргументов, заключается в том, что он соответствует предикату arg / 3 в Прологе; логично тогда, но не сейчас. Часто сначала мы работали над , над , но, к сожалению, не всегда. Часто это хороший выбор, поскольку он позволяет удобно добавлять «необязательные» аргументы в конец; например строка: substr / 2/3. На функции с последним аргументом часто влияли функциональные языки с каррированием, например Haskell, где очень легко использовать каррирование и частичное вычисление для создания определенных функций, которые затем могут быть применены к объекту . Это очень заметно в функциях более высокого порядка в списках.

Единственное влияние, которое мы не оказали, было из мира объектно-ориентированных приложений. : -)

Обычно нам, по крайней мере, удавалось быть последовательным внутри модуля, но не всегда. См. Списки снова. Мы действительно пытались добиться некоторой согласованности, чтобы порядок аргументов в функциях более высокого порядка в dict / sets соответствовал порядку аргументов соответствующих функций в списках.

Проблема также усугублялась тем, что мы, особенно я , относился к библиотекам довольно бесцеремонно. Я просто не видел в них аргумента в пользу языка, поэтому меня это не особо беспокоило. «Если вам нужна библиотека, которая что-то делает, просто напишите ее» был мой девиз. Это означало, что мои библиотеки были структурированы, но не всегда с одинаковой структурой. :-) Так появилось много начальных библиотек.

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

Мой личный стиль обычно структурирован, хотя я не знаю, соответствует ли он каким-либо письменным руководствам или стандартам.

Я обычно иметь вещь или вещь , над которой я работаю, в качестве первых аргументов или, по крайней мере, очень близко к началу; порядок зависит от того, что вам удобнее. Если есть глобальное состояние, которое связано через весь модуль, что обычно есть, он помещается в качестве последнего аргумента и имеет очень информативное имя, например St0, St1, ... (я принадлежу к церкви коротких имен переменных). Аргументы, которые связаны через функции (как ввод, так и вывод). Я стараюсь сохранять тот же порядок аргументов, что и порядок возврата. Это упрощает просмотр структуры кода. Кроме того, я пытаюсь сгруппировать аргументы, которые принадлежат друг другу. Кроме того, там, где это возможно, я стараюсь сохранять один и тот же порядок аргументов во всем модуле.

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

Небольшой пример, который может помочь:

fubar({f,A0,B0}, Arg2, Ch0, Arg4, St0) ->
    {A1,Ch1,St1} = foo(A0, Arg2, Ch0, St0),
    {B1,Ch2,St2} = bar(B0, Arg4, Ch1, St1),
    Res = baz(A1, B1),
    {Res,Ch2,St2}.

Здесь Ch - это локальная связанная через переменная, а St - более глобальное состояние. Посмотрите код на github для LFE, особенно компилятора, если вам нужен более длинный пример.

Он стал намного длиннее, чем должен был быть, извините.

PS Я использовал слово вещь вместо объект , чтобы избежать путаницы в том, о чем я говорю.

19
ответ дан 2 December 2019 в 06:45
поделиться

Нет, не существует постоянно используемой идиомы в том смысле, в котором вы имеете в виду.

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

4
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: