2017-02-03 6 views
3

С гибкостью JavaScript мы можем написать код, полный побочных эффектов, или просто чисто функциональный.Любой linter для предупреждения о побочных эффектах в JavaScript?

Я был заинтересован в функциональном JavaScript и хотел бы начать проект в этой парадигме. И переполох об этом, несомненно, поможет мне собрать хорошие практики. Есть ли какой-либо linter для обеспечения чистого функционального и свободного от побочных эффектов стиля?

+0

@VinodLouis: Насколько я знаю, JSLint не предлагает никакой возможности проверить функциональную чистоту. –

+0

Можете ли вы описать, что вы называете «побочными эффектами в JavaScript»? – Justinas

+1

JS построен на побочных эффектах как функция – Thomas

ответ

3

Чистота Анализ эквивалентно решению проблемы остановки, поэтому любой вид статического анализа, который может определить, является ли код является чистым или нечистым является невозможно в общем случае. Всегда будет бесконечно много программ, для которых оно неразрешимо независимо от того, являются ли они чистыми; некоторые из этих программ будут чистыми, некоторые нечистыми.

Теперь вы использовали термин «линтер» вместо статического анализатора (хотя, конечно, линкер - это просто статический анализатор), что, по-видимому, означает, что вы в порядке с приблизительным эвристическим результатом. У вас есть может иметь linter, который иногда говорит вам, что ваш код чист, иногда говорят вам, что ваш код нечист, и в большинстве случаев говорит вам, что он не может решить, является ли ваш код чистым или нечистым. И вы можете иметь белый список операций, которые, как известно, являются чистыми (например, добавление двух Number с использованием оператора +) и черный список операций, которые, как известно, являются нечистыми (например, все, что может генерировать исключение, любые типы циклов , if, Array.prototype.forEach) и выполните эвристическое сканирование для них.

Но в итоге результаты будут слишком ненадежными, чтобы с ними что-либо серьезное.

+1

Почему ' если 'заявления считаются нечистыми? Потому что они ничего не возвращают и, следовательно, должны выполнять побочные эффекты, чтобы сделать что-то значимое? – ftor

+0

Да, вот и все. Другими словами: потому что это * утверждения *. Выражения * по определению * нечистые: «чистота» означает, что вы можете заменить выражение его значением без изменения значения программы. Оператор не имеет значения, ergo, я должен иметь возможность заменить его ничем (т. Е. Удалить его) без изменения значения программы. Это справедливо только для операторов NO-OP, любое утверждение, которое на самом деле ничего не может сделать чистым. –

+0

, если имеет побочные эффекты, только если его части имеют побочные эффекты. Вы можете видеть, что многие ifs использовали, чтобы просто решить, какое значение нужно вернуть. В этом случае, если его можно заменить возвращаемым значением (или, скорее, чем-то вроде тройного оператора) –

0

Вы не можете использовать JS полностью без побочных эффектов. Каждый DOM-доступ является побочным эффектом, и мы могли бы иметь аргумент, что все глобальное пространство имен также может подпадать под это определение.

Лучшее, что вы можете сделать, это оставаться разумным. Я разделив это логически на две группы:

  • работа лошадей (утилиты): их цель состоит в том, чтобы взять некоторые данные и обработать его как-то. Это (в основном) побочные эффекты бесплатно. в основном, потому что иногда эти функции нуждаются в каком-то состоянии, например счетчике или кеше, который можно утверждать как побочный эффект, но поскольку он изолирован/заключен в эти функции, мне все равно.
    как функции, которые вы передаете Array#map() или на обещания then(), и аналогичные места.

  • и управление: эти функции редко выполняют некоторую обработку данных сами по себе, они в основном организуют поток данных, начиная от созданного, до любой обработки (-utilities), которую он должен запускать, вплоть до он заканчивается, например, модифицирует DOM или мутирует объект.

    var theOnesINeed = compose(...); 
    var theOtherOnesINeed = compose(...); 
    var intoADifferentFormat = function(value){ return ... } 
    
    function(event){ 
        var a = someList.filter(theOnesINeed).map(intoADifferentFormat); 
        var b = someOtherList.filter(theOtherOnesINeed); 
        var rows = a.concat(b).map(wrap('<li>', '</li>')); 
    
        document.querySelector('#youYesYou').innerHTML = rows.join('\n'); 
    } 
    

так, что все функции оставаться короткими и простыми, насколько это возможно. И не бойтесь описательных имен (не так, как этот путь к общим :))

 Смежные вопросы

  • Нет связанных вопросов^_^