天使の取り分

ソフトウェア開発に関するよもやま

Clean Architectureを読む(4)

6章 FUNCTIONAL PROGRAMMING

3章で、関数型言語は割当てに規律を課す(Functional programming impose discipline on assignment.)と述べられているのはどういうことでしょうか。

関数型言語における変数(variable)は変わりません。mutableな変数がなければ、競合状態やデッドロックなどの並行性に関する諸問題は発生しません。なので関数型言語で記述されたプログラムは一般に並行実行性が高いです。しかしながら、Haskellのような純粋関数型言語を用いていない限り、すべての変数をimmutableにするというのは現実的に困難です。ですから、妥協案としてはimmutableなコンポーネントと、mutableなコンポーネントとをしっかり分けて設計すべきだと述べられています。

また、イベントソーシングの考え方についても言及されています。イベントソーシングとは、状態は永続化して管理せずトランザクションのみを永続化し、状態はこれまでのトランザクションの積み重ねとして導出しようという考え方です。(例えば口座の残高は、すべての入出金を順番に計算していけば求められる)。イベントソーシングにおいてはCRUDのUとDは存在しないため、必然的に同時更新の問題は発生しないというわけです。

というわけで、関数型言語は変数への値の割当てに規律を課すのだと捉えることができます。純粋関数型言語であれば変数の値を変えることはできませんし、一般的な関数型言語であっても、引数の値が同じであれば関数の呼び出し結果は必ず同一となる性質(参照透過性)があるので、並行実行の問題にとどまらずプログラムの安全性が増します(例えば、状態に依存した再現性の低いバグの混入を防ぐことができるなど)。