# プログラミングパラダイム
# 目次
# はじめに
この記事は Clean Architecture 達人に学ぶソフトウェアの構造と設計 (opens new window)の第 2 部の内容を要約した内容となっています。
# プログラミングパラダイムとは
プログラミングパラダイムは、プログラマにプログラムの見方を与えるものと言える。例えばオブジェクト指向プログラミングでは、プログラムとはオブジェクトを作りそれを管理するもの。関数型言語では、状態を持たない関数の評価の連続。
Wikipedia (opens new window) より
Wikipedia には多種のパラダイムが載っていますが、Clean Architecture では以下の 3 つのパラダイムについて説明しています。
- 構造化プログラミング
- オブジェクト指向プログラミング
- 関数型プログラミング
# 構造化プログラミング
構造化プログラミングは 1968 年に Edsger Wybe Dijkstra が発見しました。 Dijkstra は goto 文を使うと、モジュールを再帰的に小さな単位に分割出来なくなることにより「分割統治」が使えなくなることに気づき、goto 文は有害であると表明しました。
goto 文のフロー分岐やループ表現を、if 文の選択構文や while 文の反復構文に置き換える記法を制御構文と言い、構造化プログラミングは、順接、分岐、反復の三種の制御構造によって処理の流れを記述することと認識されています。
構造化プログラミングは、モジュールを再帰的に小さな単位に分割することによって、大きな問題は上位レベルの機能に分割し、さらに、下位レベルの機能に分割することが可能です。そうして得られた機能は、構造化プログラミングの制御構造を使って表現することができます。
# オブジェクト指向プログラミング
オブジェクト指向プログラミングは 1966 年に Ole Johan Dahl と Kristen Nygaard が発見しました。 OO(オブジェクト指向)について書かれている文献では、カプセル化、継承、ポリモーフィズムの三原則で OO の性質について説明していることもありますが、Clean Architecture ではポリモーフィズムの有用性について着目して、以下のように説明しています。
OO とは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。
# 依存関係逆転
ポリモーフィズムのような仕組みが用いられる前では、ソースコードの依存関係は制御の流れに従っていました。 ですが、インターフェイスを使うことによって、ソースコードの依存関係(継承関係)を逆転させることができます。 この内容は第 3 部の SOLID 原則の中の 1 つである依存関係の逆転の原則につながりがあります。
# 関数型プログラミング
関数型プログラミングは他の 2 つよりもずっと早い時期、コンピュータプログラミングよりも昔に発明されており、1930 年代に Alonzo Church が発明したラムダ計算にもとづいています。 関数型言語で有名な言語は Haskell、LISP などがあります。
# 参照透過性
参照透過性(さんしょうとうかせい、英: Referential transparency)は、計算機言語の概念の一種である。ある式が参照透過であるとは、その式をその式の値に置き換えてもプログラムの振る舞いが変わらない(言い換えれば、同じ入力に対して同じ作用と同じ出力とを持つプログラムになる)ことを言う。具体的には変数の値は最初に定義した値と常に同じであり、関数は同じ変数を引数として与えられれば同じ値を返すということになる。
Wikipedia (opens new window) より
関数型言語では参照透過性が成り立つものを、純粋関数型言語と呼んだりします。つまり、純粋関数型言語では再代入は禁止されています。
アーキテクチャの観点から考えると、変数の可変性の有無はとても重要です。変数の値が変化しなければ、並行処理のアプリケーションにおける問題は起こりません。