В соответствии с принципом разделения команд и запросов , а также мышлением в данных и DDD с презентациями Clojure следует отделять побочные эффекты (изменяющие мир) от вычислений и решений, чтобы было легче понять и протестировать обе части.
Это оставляет без ответа вопрос: где относительно границы мы должны поставить «спрашивать мир»? С одной стороны, запрос данных из внешних систем (таких как база данных, API экстентальных сервисов и т. Д.) Не является прозрачным по ссылкам и, следовательно, не должен сочетаться с чисто вычислительным кодом и кодом для принятия решений. С другой стороны, проблематично или, возможно, невозможно отделить их от вычислительной части и передать в качестве аргумента, потому что мы можем заранее не знать, какие данные нам могут потребоваться.
Ответы:
Это случай, когда, как отмечено в комментариях, передача возможности извлечения данных (например, первоклассная функция, объект, который реализует интерфейс и т. Д.) Обеспечивает удобный механизм для выделения побочных эффектов.
Функция высшего порядка, чье тело чисто, имеет нефиксированную чистоту: http://books.google.com/books?id=Yb8azEfnDYgC&pg=PA143#v=onepage&q&f=false
Я писал об этом, называя этот тип функции потенциально чистой функцией: http://adamjonrichardson.com/2014/01/13/potentially-pure-functions/
Если вы комбинируете потенциально чистую функцию с сквозными функциями (в которых отсутствуют разветвленные конструкции и делают как можно меньше), комбинацию, которую я называю наборами изоляции, вы можете довольно эффективно изолировать побочные эффекты и создать очень тестируемый код: http: // adamjonrichardson.com/2014/01/15/isolating-side-effects-using-isolation-sets/
источник
Вы сохраняете результат в классе, сначала это кажется немного странным, но в результате получается более простой код. Например, нет никаких временных переменных в вызывающей.
источник