Closed11

宣言型、命令型、手続き型の違いを考える

Kyosuke AwataKyosuke Awata

まずWikipediaを参照してみる。

宣言型プログラミング

宣言型プログラミング(英: Declarative programming)は、数理論理学的な性質を表わしている総称的なプログラミングパラダイムである。命令型プログラミングと対をなしてのプログラミング言語の分類用語としても扱われている。その書式は、式の計算構造を主に表示的意味論下のロジックで表現するものになり、式枠外の副作用を伴なう制御フローや自由変数の多用などは排除されるようになる[1]。
宣言型言語は、ドメイン知識における”what the program must accomplish”(何をなすべきか)方針で、副作用を排除した式や純粋関数の実装に努める[2]。これは命令型言語の”how to accomplish it”(どうなすべきか)方針で、副作用を前提にした操作的意味論下のアルゴリズム実装とよく対比される[3]。
宣言的パラダイムは、関数型、論理型、データフローなどを包括し、データベース問い合わせ言語、マークアップ言語、ドメイン固有言語、構成管理、正規表現などにも言及されており、並行計算との親和性も特筆されている[4]。

宣言型プログラミング - Wikipedia

命令型プログラミング

命令型プログラミング(英: Imperative Programming)は、プログラムの状態(英語版)を変化させるステートメントを基本文に用いる総称的なプログラミングパラダイムである。ステートメントではコマンド(命令文)が多用される。宣言型プログラミングと対をなしてのプログラミング言語の分類用語としても扱われている。宣言型の数学的性質に対して、命令型はノイマン型コンピュータ向けの計算機科学特有の性質である。このパラダイムは、手続き型、構造化、モジュラー(英語版)、オブジェクト指向などを包括している。
ステートメント上のコマンドで状態は変化され、変化した状態の参照でステートメントの動作も変化することは副作用と呼ばれる。コマンドと副作用の存在によって命令型プログラミングは、各オペレータを状態の遷移と照らし合わせて解釈することになる。このことから命令型はhow a program operates(どう処理するか)と形容される。
宣言型プログラミングの基本文の式の方針は、コマンドと副作用を持たないことなので、そこでの参照透過な各オペレータは、その定義のままに把握できる。このことから宣言型はwhat a program accomplishes(なにを果たすか)と形容される。

命令型プログラミング - Wikipedia

手続き型プログラミング

手続き型プログラミング(てつづきがたプログラミング、英: Procedural programming)は、手続きの定義と呼出しの機能によって、プログラムに構造性とモジュール性を持たせたプログラミングパラダイムである。命令型プログラミングを土台にしている。近年では、オブジェクト指向から比較的距離を置いている命令型言語を指して、手続き型とすることが多い。FORTRAN、COBOL、ALGOL、BASIC、Pascal、C言語、Visual Basic、Goなどがある。
手続き(procedure)は言語ごとにサブルーチン、関数、サブプログラムとも呼ばれており、任意の手続き名に一定のコード群を結び付けたプログラムユニットである。手続きはパラメータ値の入力によってそのプロセスを多分岐化してその処理結果になるリターン値を出力する。入力と出力の無い手続きも定義できるので、これは宣言型言語の関数と対比されることがある。

手続き型プログラミング - Wikipedia

Kyosuke AwataKyosuke Awata

どうやら命令型というのは死語っぽい。
今は命令型に手続きの定義と呼び出しを加えることで手続き型と同じように扱われている模様。
ということで、この先命令型については特に深掘りしない。

Kyosuke AwataKyosuke Awata

最近は手続き型よりも宣言型の方が優れている(?)ような風潮があるのはなぜか?

宣言型は参照透過性があるので、同じ引数で呼び出しを行えば、同じ結果を返すことを保証できる
手続き型の場合は参照透過性がないため、同じ結果を返すとは限らない

-> つまりDDDでいうドメインモデルは宣言型ではないということか?

Kyosuke AwataKyosuke Awata

結局宣言型で書くと言っても、どこかに副作用や状態に依存する処理は存在してしまうわけであって、それを分離して分離してってやっていくと「どうやっているのか」を隠蔽できて「何をやっているのか」を書くだけで良くなるってことかな

Kyosuke AwataKyosuke Awata

そうすると、DDDにおけるドメインモデルの内部実装はインスタンスの状態に依存してしまうから、そこに全てのそういう処理を隠蔽してあげることで、外部から見たら宣言的に書けてると言えそうだ(違うのかもしれないけど)

Kyosuke AwataKyosuke Awata

宣言型といえばReactをよく耳にするけど、あれも結局Reactが手続きに関する部分を吸収してくれるから、我々利用者は宣言するだけでうまく動いてくれるようなイメージかな

Kyosuke AwataKyosuke Awata

でもなんか今でも手続型で書く人の方が多い(少なくとも自分の周りには)理由はわかる気がする。
IT業界の構造的に、大企業とかだとやたらと作り込まれた設計書に従って実装していくから、その文章をそのままコードに反映させると手続型になるもんね。って感じはする

このスクラップは2021/12/24にクローズされました