なぜこれを書いたか=結局よく分からない言葉だから
Declarative programming
というパラダイムや、GraphQL
というDeclarative API
。
このDeclarative
は、日本語では「宣言的
」とどの辞書も教えてくれる。
が、ちょっと待ってほしい。。。
「宣言的」という言葉を私は日常会話で発したことがない。
どういう意味なのか分からない言葉に訳されても、誰に説明できない。
納得できる説明はないのだろうかーーー
Wikipedia先生曰くDeclarative programmingは
宣言型プログラミング(英: Declarative programming)は、プログラミングパラダイムの名称だが、
主として2種類の意味がある。第1の意味は、処理方法ではなく対象の性質などを宣言することで
プログラミングするパラダイムを意味する。第2の意味は、純粋関数型プログラミング、論理プログラミング、
制約プログラミングの総称である。
ごめんなさい、やっぱりこれでは他人に説明できない。
StackOverflowの Declarativeのいい答え
Declarative programming は どうやってやるかじゃなくて
何をやりたいか を書くようなプログラミング方法。
どうやってやるかはコンパイラが勝手に決める。
例としてはSQLとかProlog。
何をやりたいか。目的かな?
対義語は
Declarative ⇔ Imperative (命令的,指示的)
なるほど、対義語のImperativeはいちいち細かく指示をすること。。
それなら、Declarativeはいちいち細かく指示しないということか。
では指示しないで何をするのか。
Declarative vs Imperative
- Declarative = WHAT you want
- Imperative = HOW you want
つまり、Declarative は 結局何がしたいのか、という目的だけを説明する。
マイクロマネージメントという言葉があるが、それの反対でビジョンを示すリーダー的なやり方かな。
もしくはトップダウンということか。
私が一番理解できた説明
Declarativeなプログラムの場合、「コーヒー頂戴」と言うだけです。
コーヒーの作り方は言わないで、「コーヒー頂戴」と一言で済ます。
要はこの、一言で済ます、というのが大事なのではないか?
つまり、
「目的を一言(一文)で表す 」
こまごまとはしゃべらない。
これがDeclarativeということなのでしょう。
Declarativeな言語
どうやってやるかを決めないで、目的だけを一文で書く言語としては、SQLなどのクエリ言語がはまります。
以下のような特徴があります。
- 周りの状況を気にしない = 空気を読まない(部下がいくらコーヒー豆は欠品なので調達が必要ですと言おうが、俺はコーヒーが欲しいんだ、で終わらせる)
- 処理の仕方はコンピュータに任せるので、コンピュータが賢ければどんどん最適化される = 自分はバカのまま(コーヒーと水が欲しい、という目的だけ決めるので、やり方は自由。①コーヒーを用意して次に水を用意するのか、②逆の順にするのか、③両方並列処理するのかはコンピュータが決める)
秀逸なアナロジー
2020/6追加
こちらのツイートを御覧ください。
左はオートマティック、右はマニュアルのギアです。特にこのインターフェースだけを見てください。
ツイートでは、左が宣言的、右が命令的であると指摘しています。私もこの意見に賛成です。
オートマティックでは「R 後ろ、N 動かない、D 前に動く、P 駐車」これしか人間が指定しなくていいわけです。これを指定してアクセルを踏むだけで、望む動きが実現されます。やりたいことだけを指定しています。内部でギアを変更する処理は隠蔽されています。
対して、マニュアルでは「1-6のどのギアに接続するか」を指定しなくてはいけません。また、実は書かれていないけども真ん中は「N ニュートラル」になっています。なので、前に加速するには、「1→N→2→N→3...→6」という順番での作業を覚えて実施しなくてはいけません。
でも、それぞれにいいところはあるわけです。
オートマティックはギア変更という作業を隠蔽化し容易化されています。内部は基本的には自動です。(M+ M-があるものもありますが) 簡単なのがいいところです。
対してマニュアルは、こまめにギア変更を指定し加速するなど、自分好みの作業を忠実に実現できるのがいいところです。そもそも楽しい、という人もいるでしょう。
では、どちらがドライバーにとっていいのでしょうか。これは非常に判断が難しくなってきます。
一般的なドライバーの大半はオートマティックのほうが簡単で良い、と言うでしょう。
ただ、レースドライバーは、アクロバティックなカーブを実現するためにマニュアルでなくては困ります。
したがって、どちらのインターフェースがよいかを議論するときには、対象は誰なのかを考えておく必要があるのだと思います。
もしかすると、宣言的であるべきか、命令的であるべきか、を考えるときには、ユーザは誰なのか、その人の目的は何なのか、を考えておくことが大事なのかもしれません。