DMMF本とは別の優良な関数型思考プログラミングの実践本『Grokking Simplicity』を読んだ
対象読者
- 2 ~ 5 年の経験を持つプログラマー向け
- 少なくとも 1 つのプログラミング言語を知っている人
- ある程度の規模のシステムを拡張するときに苦痛を感じたことがある人
- JavaScript、 C、C#、C++、または Java を読むことができる人
本の構成
- 第 1 章〜第 2 章:関数型プログラミング(以下、FP)の紹介と、何が可能になるのかについて概要説明
- 第 3 章〜第 9 章: コードをアクション、計算、データで区別することの紹介と実践
- 第 10 章〜第 19 章: 第一級抽象化の考え方の紹介と実践
最初から順番に読むことを推奨しており、各章に演習問題もついているので進めながら理解度を増していく
コードはJavaScriptで書かれているが、推奨ではなく FP に慣れていない人に教えるのに最適な言語のため利用しているとのこと
本に出てくる要点
以下の要素を使って、シンプルに実装していくための実践本
- 関数型プログラミング
- コードをActions、Calculations、Dataで区別する
- Stratified design
- 第一級抽象化
関数型プログラミング
副作用のない純粋な関数のみの使用を理想とするプログラミングスタイル
副作用というのは戻り値以外の関数の動作のことで、例えば
- メールを送信する
- ファイルの読み取り
など
ただ、ソフトウェア開発で副作用がないようにすることは不可能に近い
関数型プログラミングは長い歴史があり、これらの副作用との向きあってきたので対処法がある
そのため、理想だけの非現実的なプログラミング手法では決してないことが説明される
コードをActions、Calculations、Dataで区別する
大前提として関数型プログラミングではコードを以下の3つに区別する
- Actions: 実行タイミング、実行回数に依存する
- Calculations: 実行タイミング、実行回数に依存しない
- Data: 何かを実行することはできないが、実行しなくても意味がわかる
このデータ区別が関数型プログラミング の基本になる
Stratified design
データの区別をする前に、まずはコードを「更新頻度」別にまずは整理する
そうすると幾つかの階層が見えてくる
本にあった自動ピザ作成システムを例に挙げると、以下のように「ビジネスルール」「ドメインルール」「技術スタック」の3つの抽象された階層に分けられる
更新頻度 | 動作 | 階層 |
---|---|---|
高 | ピザのメニューを毎週かえる | ビジネスルール |
中 | ピザを作る | ドメインルール |
低 | ◯◯のプログラミング言語で実装する | 技術スタック |
関数型プログラミングではこのように抽象レイヤーで階層化して設計することをStratified design(ストラティファイドデザイン)
と呼ぶ
階層は3層に分けられるとは限らず、プロジェクトによっては何層にもなることがある
第一級抽象化
抽象化して説明された動作は実施にはもっと処理が複雑である場合が多い
例えば、「ピザを作る」という動作は実際には
「生地を伸ばす」→「ソースを塗る」→「具材をのせる」→「焼く」
のような処理が隠れている
このように本当は大きな処理を隠して「ピザを作る」と表現し、そのレイヤー中で「ピザを作る」として扱えるようにすることを第一級抽象化
と呼ぶ
これは再帰的で「生地を伸ばす」もまた大きな処理の抽象表現で、その中の動作もまた処理の抽象表現である
最終的にはプログラミング言語が提供する機能になる
まとめ
この本は以下の要素を使って、シンプルに実装していくための実践本で、
- 関数型プログラミング
- コードをActions、Calculations、Dataで区別する
- Stratified design
- 第一級抽象化
多くのページをさいて丁寧に説明されているので読みやすい
この要素を使った関数型思考が身につけらればビジネスの変更に耐えらえる堅牢なソフトウェアが作れるかもしれない