はじめに
Clean Architectureの読書メモです。
読んでみて(途中までですが、)内容が大変難しいと感じました。図を用いて構造の話が展開されていきますが、抽象的なイメージに紐付く具体がないのでそれぞれのアーキテクチャの必要性や実現手法が難解でした。Clean Architectureの前に読む本を薦められたので読んでから戻ってこようと思いました。(一部紹介)
以下、第2部/第6章までのメモ
構造の重要性
ソフトウェアが提供する価値は「振る舞い」と「構造」であるらしい。振る舞いはステークホルダーの要件を満たすこと、構造はソフトウェアがソフトであることだ。このうち価値が大きいのは構造の方らしい。
ソフトであるというのはマシンの振る舞いを簡単に変更できることである。つまり「要件を満たすが変更できないプログラム」と「要件を満たさないが変更ができるプログラム」は後者の方が価値があるということらしい。
これはすんなり理解できるものではなかった。業務で触るコードはまず動くことが第一であり、その次に綺麗さを求めると言われたからだ。しかしそれはコードが少なからず変更可能であることが前提にあったからなのかもしれない。ソフトウェア開発者は機能の緊急性よりアーキテクチャの重要性を説く能力がなければいけないと学んだ。
パラダイムによって与えられた価値
パラダイムが構造化、オブジェクト指向、関数型という3つのプログラミングであるということは知っているし書き方も多少は知っている。しかし、それぞれのパラダイムがもたらした価値は?言われたら困る。なので正しく話せいるよう理解したい。
-
構造化プログラミング
もたらされたのは機能を分割する能力だ。これによってプログラムは反証可能なプログラミングの単位を作成することができるようになった。構造化プログラミングは自由に使うことが出来ていたgoto文を禁止した。goto文が使えるとモジュールを繰り返し小さな塊にしていくことが出来なくなる。小さくした途中にgotoできてしまい依存関係が制御できなくなる。小さな単位にすることで、「バグが存在することを証明するテスト」を使ってプログラムが正しいことを証明できるようになった。
-
オブジェクト指向プログラミング
ソフトウェアアーキテクト曰くオブジェクト指向とは「ポリモーフィズムによりシステムにある全てのソースコードの依存関係を絶対的にする能力」であるらしい。なるほど分からん。今まで聞いてきた話と違う、聞いたことがあるのは、データと関数の組み合わせ、現実の世界を表す、カプセル化・継承・ポリモーフィズムだという話である。ポリモーフィズムが多態性と訳せることは知っていたがそのくらいだ。
ポリモーフィズムとは一つの呼び出しに対して異なる型を用意しそれぞれで振る舞いを実装することだ。これがあることで呼び出される側の変更に対して、呼び出す側が無関心でいることができる。これが依存関係を絶対的にしている。という理解をしました。。。
-
関数型プログラミング
関数型プログラミングがもたらしたのは変化しない変数だ。関数型言語では全てを数学的関数のように扱うために参照透過性のためにイミュータブルを用いて全体を関数の合成で構築する。これにより可変状態をなくし、状態を初期値とイベント(不変)の集約で表せる。可変性の分離は競合、デッドロック、平行更新問題に対してクリティカルな解決策となる。関数型は触ったことがほとんどないがゆえに難しい言葉で誤魔化し気味になりました、、、Haskellでも勉強してみます。