#213 プログラミング言語のパラダイム??
2024/1/14 ·
-
本日ですが カイチが最近読んでいるクリーンアーキテクチャーというボブ王子3本ボブクリーンシリーズ日本で一番売れてるクリーンシリーズじゃないですかそれクリーンコードよりもはるかに薄いんじゃないかっていうそうだね3分の1くらいじゃないめちゃくちゃ読みやすいんじゃないかっていうこれなんだろそんなにこれ結構最近読んだ本の中で一番優しいんじゃないかって思ってるくらいの本なんですけどえーマジ?なんとなくそうなんだ結構なんかクリーンコードは具体的なことと書いてますけどうん
-
アーキテクチャ系の本って結構抽象的なこと書いてるんですけど今途中なんですが割と具体的なこと書いてくれてる気持ち僕1年目の時背伸びして意味わかんない本いっぱい読んだって言った中の1個がそれですね今面白いですかなり具体的ならいいなフィロソフィーオブソフトウェアデザインと並行して読んでるんですけどバトルが始まってる感があって変な楽しみが出してる
-
そのバトルは後でエピソードにできればと思うんですが今日は別で僕結構プログラミングパラダイムちょっとほっといてたなとマジ?いう気持ちがあってですねなんでしょうか勘違いしてたんですよ勘違いしてた僕はプログラミングパラダイムをプログラミングのパラダイムをプログラミング言語のパラダイムを勘違いしてましたほうパラダイムとはなんでしょうかお?
-
パラダイムとは何でしょうかパラダイムとはふわっとですけどなんていうんですかね言語の思想そうだね書き方のルールというか思想はいはいはいいわゆるですよJavaオブジェクト思考言語ってありますねそうですねあとなんだスカラー関数型って言われますよねスカラーはねミックスなんですよね
-
そのミックスなんですよねって言うんですよPythonもミックスなんですよでJavaもミックスなんですよっていうあたりを僕は勘違いしたんですねくっきり分かれるもんだと思ってたんですけどそうじゃないっていう話を僕はあんまりよく知らなくてその辺ちょっとおざなりにしてるエンジニア結構いるんじゃないかなと
-
思っててですね確かに言うて手続き型の部分ない言語なんてないからなそうなんですよだからプログラミングパラダイムプログラミング言語のパラダイムって言語ごとにがっちり分かれるわけじゃなくてこの言語ってこの要素あるよねっていう分け方が正しいんですよ確かにその辺のねちょっと認識僕ちょっと誤ってててっきり
-
オブジェクト思考言語っていうパラダイムは手続きっていうニュアンスも含むしこういうのを含めて含めて含めてJavaみたいなやつがそうだよねだと思ってたんですよそうじゃないという話をしますっていうのではい
-
導入が長かったんですが今日は構造化プログラミング関数型プログラミングオブジェクト思考プログラミングこの3つのパラダイムこれクリーンアーキテクチャで紹介されてたんですけどもこのパラダイムについてじゅんぺいが解像度を高く話せるようにしますきためっちゃ嬉しいつまり最後にじゅんぺいがまとめをしてくれますってことはまず最初に現段階の状態を確認しておかないといけないってことですかめっちゃ嬉しいとか言ったけどやっぱやっぱ
-
最近のポッドキャストの反省なんですけど学びを
-
Lにはやっぱりアウトプットしかないというので最後に順平に喋らせるべきなんじゃないかと確かにそういえばいつだか順平の学びみたいな感じでアウトプットしてた時期あったのにあれナチュラルに消滅したな今回は復活の時期だなこれ最後にプログラミングパラダイスの簡単なまとめを順平にしてもらうっていうのゴールにちょっとお話ししていこうかなと思うんですけど一旦
-
じゃあちょっと構造化プログラミング関数型プログラミングオブジェクト思考プログラミングどんなイメージっていう構造化プログラミングに関してはほぼ聞いたこともないです2個目の手続き型ですか関数型ですか関数型も関数がいっぱいあるオブジェクト思考は
-
3つ目オブジェクト思考型オブジェクト思考プログラミングこれはオブジェクトとしていろんなものを扱ってどっからでも呼び出せたりみたいな感じで便利な書き方ありがとうございますこれをすごいクロートっぽいまとめができるようにしますじゃあいきますねまずですよプログラミングパラダイムこれってまずなんなんやとなんでこんなの生まれてるんじゃと
-
いうところなんですけどこれはですねこのボブおじさん曰く自由に描けるとぐっちゃぐちゃになるから制約を持たせることによって綺麗に描けるようにしようっていう思想でパラダイムっていうのがどんどん生まれてきたとそうなんだうん
-
なのでそういう観点でちょっと構造化プログラミングと関数型プログラミングオブジェクト思考プログラミングちょっと3つを見ていきましょうじゃあまず順番最初構造化プログラミングですね構造化プログラミング言語っていうのは大抵そうです大抵当てはまります確かにC Python大抵そうこれは最初に導入されたパラダイムらしいです
-
確かにダイクストラさんという人が発見したらしいんですけどこれなんだっていうとエドガーダイクストラまず構造化プログラミングが出る前のプログラムってどうなってたかっていうとGoTo文GoToマーケットのGoToっていう関数があってGoTo文を使ってたらしいんですねGoTo文って何かっていうと手続き中の指定された場所に無条件にジャンプすることができる制御文です
-
なんでgo to 何々って書いてると今読んでる行とは全く別のファイルに行ったりとか別の行行ったりとか自由なところに飛べるっていうめちゃくちゃ強いこれ超恐ろしくないですかどんだけ読みづらくなんねんとだって処理の順番にプログラム書く必要がないんですもんっていうgo to 文のせいでまずなんか理解できないプログラムがいっぱいありましたと構造化プログラミングの前はね
-
なので作ってる人以外は理解できない状態だったらしいんですよはいはいはいそういう風な状況あるなって気づいたダイクストラさんがプログラマーってプログラミングうまくできてないんじゃないかなってことに気づきますなるほど複雑なプログラマー人間の脳が扱うには複雑すぎるなってどうしようかなとダイクストラさん考えましたよしそうだ数学の証明を適用させようという発想になります
-
どういうことじゃとなんか天才の人って感じ数学者ですからねプログラミングの数学の証明って思い出してみるとえーなんかもともとある定理とかこの定理に当てはめたらこことここがこうなるから結果として正しいみたいな証明の仕方するじゃないですか機能法とか入り法そうそうとかね大工さんはこれをなんか
-
いわゆるU-Gridの階層って言うらしいんですけど難しい言葉なんで聞かなかったことにしてもらってこんな感じでプログラミングを書けないか正しいものを積み重ねていってプログラムを整理するみたいな考え方で書けないかっていうのでプログラミングの書き方をうーんって考えていったと研究していった結果ちょっと待ってくださいね研究していった結果この数学の証明的な感じで書く
-
方法っていうのはGoTo文適切に使うと綺麗に書けそうだとただGoTo文自由に使わせると汚いことにできるというのはもう既に自明なので上手いこと使うのを強制させようという話になりますなるほどでそこで登場したのがIf, Then, ElseとかDo, While条件分岐とかループあれ中はGoToでいろいろ言ってるらしいんですけど
-
要はあれですよねif文がtrueだったらtrueのところにジャンプしてその処理が終わったらelseは飛ばしたところにジャンプしてそうですそうですでfalseだったときはelseのところにジャンプしてみたいなイメージですよねそうですそうですでループは多分毎回毎回同じポイントに戻って条件分岐やってるのかなとそうですそうです
-
続けるか続けないかっていうので1,2,3来たらまた2に戻ってまた1に戻ってみたいなことをジャンプでGoToでやってるけどそれを意識させないようにラッピングしてるとそうですそうですっていうのでダイクストラさんは最終的にさっき言ったような選択if選択と反復ループあとは順次処理普通に上からどんどんやっていくこれを組み合わせることでプログラムを
-
記述することができるというのが特定されてそれで構造化プログラミングが生まれますありがとうございますありがとうですよありがとうだわでその後これええやんってことでダイクストラさんはGoTo文は有害であるという論文を出します攻め方がなんか
-
ネチっこいっすね学者なんてそこしかないんじゃないですか今時ブログはありますけど当時なかったでしょうからそうなんだめっちゃいい公文見つけたじゃなくてGoToはカスみたいな感じの攻めがあるGoTo文は有害であるっていう論文ですあるかもしれないかなちょっと忘れましたけどちなみに炎上したらしいですしたんだ当時もそういうのあるんだちゃんと炎上したらしいですただ
-
今日構造化プログラミングがあるってことは大工ストローさん勝利したという結末ではあるんですけどというのが構造化プログラミングの成り立ちなんですけどその後ですねちなみにGoTo文は今のプログラミング言語にも残ってるんですけど見たい見てみたいGoTo書いてあるとこPHPとか書けるよ
-
だけど安全な形で提供してるらしいそうですみたいですあんま無秩序なGoToではないみたいな制限があるらしいですねって書いてました無秩序GoToしたいですわなんでやねん破壊神じゃんパワー強すぎるな
-
最終的に今は構造化プログラミングかけてはいるんですけどこれはどうやら大工スターさんが最初に想像してたような数学的なU-Gridの階層構造じゃないらしいんですねこのボブ王子さんが言うには数学的な階層構造っていうのは定理って数学的に証明できる正しいやつなんですけどソフトウェアって数学的に正しいって証明できないんですってソフトウェアっていうかライブラリー
-
ここで言う証明って何なんだろう正しく動くこれが正しいと証明ですソフトウェアはどういう風に証明するかというと
-
こうすると失敗しないっていうのだけが分かるだけなんですよ失敗っていうのはエラーとかで止まらないみたいなイメージですかねそうです成功っていうのはそれがビジネスにプラスの価値をもたらしたぜみたいなそういうことなのかな数学的証明は絶対に正しいっていうのが分かるのが数学的証明です数学的に証明できるのが数学的証明数学的に証明したかったけど物理的違う科学的な証明しかできないらしいんですソフトウェアってもうちょっと具体的に言うと
-
物理法則あるじゃないですかFイコールMAでしたっけアインシュタインあれって数学的に証明できないんですよなぜなら観測して計測するしかないじゃないですかでも計測なんてブレますよねいろんな要素で今わかってるのは空気抵抗とかあるかもしれないですけど空気抵抗だけでそうなってるのかなんてわかんないじゃないですかなるほど科学は後から反例見つかるケースもあるよねみたいな感じかそうですそうです
-
数学は絶対に反例見つからないんですけど物理はまあまあなんかいろんなことやっても合ってるから合ってるねっていう物理というか科学か科学っていうのは化学じゃない方が科学のぎ編の方っていうような考え方らしくてソフトウェアも科学的ななんか階層構造になってるみたいな話らしいですこれすごいポイントでソフトウェアテストの原則ってあってソフトウェアテストって正しいことを証明することできないんですよ
-
ソフトウェアが合ってることを証明するんじゃなくてこのケースでは合ってるってことだけを証明するもの今回システムテストやりましたバグ出ませんでしたバグないですって言っちゃダメなんですよ見つかってないだけなんでみたいな話だなと思ってここ読んでましたっていうので構造化プログラミングの成り立ちとか性質見たと思うんですけど
-
つまり純平くんここ大事です構造化プログラミングは何かというとまずそもそもプログラミングパラダイムなので制限を持たせるためのもの書き方に制限を持たせるためのものです何に制限を持たせたかというとあそうだすいませんちょっと一個言い忘れてたんですがまとめでさらっと追加するんですけど順次処理一つ上から順番に処理する二つ目選択三つ目繰り返しさっき言いましたねこの三つとあとは機能の分割
-
そこも含まれるんだこれをやるのが構造化プログラミングっていうものです機能の選択ってちなみに分割って関数みたいなものですかそうです
-
なのでこの命令の順番とか移行のやり方このコードの移行のやり方に対して制限規律を課したのが構造化プログラミングというものですなんで世の中の大抵のプログラミング言語そうなってるなって思いますね今多分皆さんが触ってるのもそうですイフとループ使えない言語見たことないですよねないあんまないてかないアセンブリとかアセンブリはエグいねわかんないけどね
-
けどねでもいればアセンブリもあんじゃ アセンブリはないかあれより後だもんだってできたのもそうだと思いますはい 次関数型はいいや関数型の僕あんまり触ったことないん でね言うてを はいっていうのでちょっとあの超簡単なコードを想像するチャレンジなんですけど はいはい整数を2乗するコードを考えています うん
-
これはそうね整数を二乗したものを例えばフォーループで0から25いや2425個ねだから合計0123Gから24までなので合計25個の数字をそれぞれ二乗して表示しますと表示しますとじゃあどうなってるかというと多分クラス作ってクラスの中でメイン関数作ってでフォア分多分
-
0から25までループしますiは1個ずつ増やしますシステム.out.printlni×iで0から014で出力させますっていうのがJavaのコードなるほどオブジェクト作ってそのメイン関数の中でループ処理で1から順番にやっていくと標準出力していくとその時点で手続きの恩恵を受けてますねはい
-
これはまあJavaですと関数型じゃないやつじゃあ関数型言語どうなってるかこの僕は関数型あんま詳しくないのでこの本にあった例そのままJavaもそうなんですけどそのまま引用するんですけどまずCloserってよくわかんない言語ですでどうなってるかというとまず最初にプリント文みたいなやつをまず最初にいきなり呼び出しますでプリント文の中にすいませんちょっとコードを説明するのが難しいんで動き方だけ言いますはい
-
関数型どうやってやるかっていうとさっきJavaはiっていう変数を変化させながら二乗を表示しました関数型はまず無限の整数リストを用意してダーンっていうボコーンって用意してそのリストを数字を二乗にする関数に渡してそれぞれ二乗して25個だけの要素0から24なのでそれを含んだリストを返す
-
っていう動きなんですよ頭悪そうなんで無限?これが関数型の特徴でして関数型っていうのはどうやらJavaのように可変変数を持たないっていうパラダイムらしいんですよ可変変数って何かっていうと変わる変数ですね可能変わる変数で可変変数関数型プログラミングは可変変数がないですうんうんうん
-
変数の上書きがない変更がない制限してそう制限してそうな感じしますよねこれ何が便利かっていうと物事が変わらないことによって競合状態デッドロック並列更新並列処理この辺りがすごくやりやすくなるんですよなるほど要は競合っていうのは一個の値を別々の方法で同時に更新しようとしてるから起きるよねっていうことからですかそうですそうですそうですはい
-
それがないんですよそれゆえパフォーマンスがいいんですねパフォーマンスいいって言いますもんね関数型ってね早いとかね
-
っていうのがモチベーションで関数型言語っていうのが出てきています一応その中にもループとかもあるわけですよねループあるループあるかなボコンって用意したの1個ずつやってる1個ずつやってる一気に24個用意してJavaとかだと1個ずつi0にして0に移動して0次i1にして
-
1の2乗1って言ってるけど関数型はボーン用意して1個ずつボーン用意してそれぞれに対してやってるだけ関数型のパラダイム組んでる言語だとマップ使うイメージありますねマップ関数ですね配列のそれぞれに対して処理をする関数ですね例えばさっきのだったら1から25の配列みたいなのがあってそっからマップ関数使うんですよ全部にキーをくっつけて
-
取り出せるようにするみたいな感じなんですかキーを付けてというかそれに対して適用したい関数をさらに引数で渡してあげるみたいな感じなのでマップの中の引数で渡す関数にも名前ついてるんですよ例えば2乗だったらスクエアかスクエアとかなるほどこの値に対して全体にスクエアしますよみたいな感じの見た目になるんで可読性も上がるとか言われてますよね関数型とかだと
-
好みな気がしますけどね好みかわかんないけど好みかはいはいわかりましたっていうような形で処理するんですね基本的に普遍で処理するちょっともう少しわかりやすく具体例を挙げると銀行の口座残高想像してみて多分可変変数を使いやすさと口座残高を記録していくんですよ多分
-
1万円で1000円入ったから1万1000円だったけど3000引き落とされたから8000円ってやるのが可変変数を使った考え方で不変変数だとどうするかどうするんだろうって思うじゃないですかどうするかっていうとトランザクションを記録しておくんですねトランザクションっていうのは手続き記録ですか手続き記録さえ記録しておけばその時に
-
何円だったかが出るとなので常に残高を持っておくんじゃなくて取引履歴だけを持っておくそれぞれをバーンという配列の中に突っ込んでおけば合計出るよねって通帳だけ貴重した状態ちょっと違うな残高見えるな残高ないやつですねっていうような考え方でやるのが関数型プログラミングなのでまとめると関数型プログラミングは変数の代入に制限を課すもの
-
なるほどこれが関数型プログラミングですこの切り口おもろって思って読んでたんですよ確かに関数型って言われた時にパッてイメージしちゃうのは純粋関数型言語とかだと決まりあるんですよねそうなんですか確か作る関数は全部引数渡さなきゃいけなくてかつ絶対に返り値が必要みたいな結構いろいろそういう制約とかがあって
-
最初にそっち出てきちゃうんですけど変数を制限するっていう全然関数じゃない切り口で来るのおもろいですねこれがボブイズムですボブイズムかっこよかっこよ最後さっきのりさんが手続き型の恩恵受けてるなとか言ってたと思うんですけど手続き型は今回出てこない出てこない
-
そこも知りたいごめんそれは知らんはいボブおじさんも触れてない了解です今回は構造化と関数化調べて教えてくださいいずれはいじゅんぺいが調べて教えてくださいはい最後オブジェクト思考プログラミングこのショーが一番面白かった確かに何制限してんだなぜならボブおじさんがめちゃくちゃ喧嘩越しだったからそっちえー
-
そっちなんだ多分なんか親殺されたんでしょうねオブジェクトことを思考言語にマジでそんなにファイティングボブモード深掘りの公開収録行った時に和田さんがボブおじさんプロレスラーですからって言ってたのがすごい印象に残っててボブおじさんプロレスラーだったなというのが思い起こされたショーでしたマジかオブジェクト思考レスリングしてんだはい
-
じゃあちょっとあのまあ順平ものりさんもオブジェクト思考言語まあ慣れてると思うのでちょっとあのさっきみたいな基礎的な話だと面白くないかと思うのでオブジェクト思考って何でしょうねっていう順平最初聞いちゃったからのりさんなんかどうです値と手続きをセットにしたデータ型を駆使する言語だと思ってます値とあ
-
値と手続きをセットにしてそのスコープに留めることによって関係あるものって密集することが多いよねっていう理論に基づいたプログラミング言語だと思ってますありがとうございます
-
クリーンアーキテクチャの中で一つの答えにデータと関数の組み合わせがあるっていう話があってそういうことですかプロパティがあってそのプロパティを操作するメソッドが集まってるじゃないですかクラスとかオブジェクトってそういう風に関係あるデータと関係ある処理をまとめておくことによってしかもその
-
データも処理も公開範囲をプロテクテッドとかアクセス就職紙で制限できるんでいじられたいやつだけを公開してそうじゃないやつは閉じ込めておきつつも絶妙なスコープ感で関係ある処理をまとめておける言語ありがとうございますカプセル化の話までいったってことですねはい
-
それを踏まえてお話を聞いていただきたいんですけどまず最初データと関数の組み合わせがあると一つの答えにあるというふうにボブさん言っていますこれに対してボブさん何を言っているかというとこれはよく引き合いに出されるか満足できない答えですとすいませんクラスのメソッドと単なるメソッドが別のもののように扱われているからだと
-
クラスのメソッドと一般的な野良関数とメソッドってことですかねそれはボブさんいわく一緒です野良関数って何ですか普通にクラスの中にじゃなくて単純に定義しただけの関数じゃないそうですクラスの中にじゃなくてJavaはクラスにしか書けないと思うんですけどPythonとかだと別にあれそうじゃないのわかんないPythonは野良関数書けるんで
-
クラスの中じゃないちょっとあれだけど普通のPHPとかだと関数とメソッドで違うんですよ英語にした方が分かりやすいんですけど普通の関数がファンクションでクラスの関数がメンバーファンクションとかで呼ばれるんですよっていう
-
っていう感じクラスのメソッドとメソッドが別のもののように扱われているからだバカバカしいと言ってますすごいですね2つ目よくあるのは現実の世界をモデル化する方法これに対してボブジさんは言い訳がましい答えだと
-
これに関しては俺もずっとよく分かってないなと思ってるけど現実の世界をモデル化とは何を意味してるんだろうかどうしてそんなことをしたいと思うだろうか
-
おそらくこれはオブジェクト思考を使えばソフトウェアとの現実世界の距離が近くなるのでソフトウェアのことが理解しやすくなるといったことを意図しているんだろうあまりにも言い訳がましい答えだがそもそも定義が雑すぎる結局オブジェクト思考とは何なのかは明らかにしていないとこれは同意これは同意しますオブジェクト思考はブチギレていますはい
-
そっから最後にカプセル化継承ポリモピズム3つの言葉で説明しようとする人がいるとおーわかったとじゃあ一個一個見ていってやろうってのがこのショーですもう胃が痛いで1つ目カプセル化ボブさんカプセル化なんてオブジェクト思考言語じゃなくてもできるやろって言ってますそうなのかとまずカプセル化なんでしょうねというところから言うとカプセル化
-
よく言われますけどデータと関数の間に周囲に線を引くことができるもの隠せる隠蔽できるものその線の外側ではデータは見えないようになっていて一部の関数だけが見えるようになっているパブリックメソッドだけ呼び出してその中に何を扱っているかは隠されているただこれはC言語でもできますそうなんだらしいですC言語
-
まあちょっとあんまり馴染みないかもしれないですけどえっとまあパイソンとか他の言語もそうですがライブラリインポートするじゃないですかああ似たようなことができますC言語もまあ一緒のことができてなるほどパッケージでパッケージがもうそもそもカプセル化できてるよねってことかそうですC言語は関数型なんですかはい違う手続とか構造化はいで
-
なのでC言語を触ったことある人はよくわかると思うんですけどよくあるstandardio.hっていうプリントとかを使おうとしたときにプリントとか使うのですらライブラリーインポットしなきゃいけないんですけどC言語はそういったライブラリーってそもそも隠蔽できてるよねこれはカプセル化と言えますよねとしたがってカプセル化はオブジェクト思考言語じゃなくてもできるだろうというのがボブおじさんの主張ですでもそれは
-
グーの音が出てしまった次継承継承何なのかというとスコープ内の変数と関数のグループを再度宣言したもの今あるやつを再度宣言したものですオブジェクト思考言語が優れたカプセル化はさっき与えてくれなかったけど継承ならば確実に与えてくれるはずだよねとしかしこれもC言語のプログラマが手動でやってきたことなんやて
-
いう風に書いてるんですがこれどうやってたかっていうと手動でやってるだけですどういうこと?もう一回同じプログラムを書いてるってことですか?その通り命名でこれなんかこの系譜っぽいなとか命名とかあと場所でただ似たようなものを2個書いてっていう風にやってたというのでオブジェクト思考言語の
-
継承に比べると便利なものじゃなかったとだから新しいものを与えてくれたわけじゃないけど便利になりましたとなるほどねカプセル化ではほとんどポイントを獲得できなかったけど継承については半分ぐらい上げてもいいかなとおお
-
珍しいな珍しいね非常に何がですかカプセル化ってもうさ情報工学の神やみたいな感じになっているのにそこをボコボコにして逆に継承によってスパゲティコードが生まれてしまったよってところがいっぱいあるから継承ボコボコにされがちなのに逆なんだね逆って言ってもそこまで評価高くないですけどね確かに最後ポリモフィズム一応分かりづらいですよこれが今までの3つの中では確かに
-
これC言語でもポリモフィズムが垣間見えるものがありますって話をしててポリモフィズム何かっていうとこの本の中でサクッと説明されてなかったので難しいかもしれませんが同じ呼び出し方をするけど実際に動くやつが違うみたいな実装の仕方っていうんですか具体例を言うと現実で言おうとしてるそれともプログラムで言おうとしてるこれから具体例が出るのでそのまま喋っちゃいますわなるほど
-
C言語であったポリモフィズムの例C言語ではget char put charっていう文字列を読み込んだり書き込んだりするやつがあるんですけどなのでstandard in標準入力と標準出力の読み込み書き込みをやるメソッドですとこれはポリモフィズムが現れています何かというと例えばですよどのデバイスに対してstandard outするのか出力するのか
-
これってポリモフィズムなんですねなぜかというとプログラムからハローワールドって出すとするじゃないですかそれ今じゅんぺいが手元にあるMacのディスプレイなのか接続してる外部ディスプレイに出すのかとかって勝手にやってくれるじゃないですか同じ出力するっていう関数なのにOS単位でいうと吉田に振り分けてくれてるとユニックスってちょっと前にもありましたけど
-
全てをファイルとして扱ってるじゃないですかなのでそれらに対して絶対に持っとけよっていうメソッドが定義されてますディスプレイも何もかもファイルも何もかもオープンクローズリードライトシークっていうメソッドを全部持っとけっていう決まりになってるのでなので同じメソッドを呼び出しても違う振る舞いをするポリモフィズムそれが実現されてるピンとこないポイントあります?
-
なんか全部標準出力に出してるだけなんじゃないかなっていうどのデバイスにするかはその標準出力を指定してるのってCじゃなくてOSなんじゃねっていうそういうことではありますねなるほどどうなんだろうOSがそもそもCかもしれないですよねOSは確かにCで作られてるイメージあるねじゃあポリモフィズムですねC言語の中でなってますよねただあれだよね
-
アプリケーションで見たときにポリ持ってないよねあんまりアプリケーションのCとOSのCって別ですよねそうなのかそうかもしれないですけどその間のどこかにはポリ持ってますよね
-
それは
-
感覚の問題だな言ってる意味は分かりますよ言ってる意味は分かりますけどOSっていう範囲でもそうですよね例えばハローワールドをプリント文じゃなくて何かをエンターを押した時とかOSの範囲の処理で同じことをやっても違うことが起きることありますよね例えばデータを読み込む時にメモリーから読み込むのかハードディスクから読み込むのかどっちもリードを使ってるだけですけど多分ヨシナに振り分けられるはず
-
それを実現しているところはどこかにあるんですよねなるほどそこがOS側でどう実装されているかによって変わりそうだなと思っていてOSの中で普通に分岐しているだけなのかそれともポリモフィズムを使っているのかがちょっとイメージ湧いていないかもしれない分岐しているとポリモフィズムじゃないんですか違うような気がするな
-
分岐しててもいいのか分岐してるものな気がしてるんだよななんかその結局ちょっと後でディスカッションしましょうかすいませんちょっと聞いてる人もモヤモヤしてるかもしれないですが一旦ポリモフィズムとしましょうはいこのいろんな振る舞いをすること多体性ですもんねとりあえずオブジェクト思考じゃなくてもできるよっていうまあそうですそうですしかしただそのボブさん全面的に喧嘩するわけではなくてCでやろうと思ったらこうやってやりますとうん
-
こうやってやってますとただ一方でCでやろうと思った時って関数から直接例えばさっき言ったget char文字の読み込みする時にメモリーから読み込むかテキストファイルから読み込むかっていうのを指定して読み込むわけなんですけどこれって直接メモリーとかテキストファイルっていう
-
クラスじゃないんですけどファイルっていうんですか関数メモリーのリード関数に直接ポインターを指定して実行してるんですよこれを直接実行するっていう形で書かれてるんですねこれがどうやらクッソ危ないですとなるほどメモリーのリードを直接呼び込むとかそういうことができてしまうとそこちょろっと書き換えたら読んじゃいけないとこ読めちゃうとか
-
っていうのが関数型じゃなくて手続き型C言語のポリモフィズムの危ないところオブジェクト思考言語っていうのはこのポインターを経由して関数を呼び出すというものに性描くを与えることで安全で強力な力を出すポリモフィズムを手に入れたんです確かにオブジェクト思考でポインターある系あんまないかもっていうのをポポジさんが言ってますはい
-
じゅんぺいがポインターについて悩んでいるよくわかりましたねポインターはですねプログラムってメモリに一回ロードしてきて動かすんですよそのメモリって例えばPCだったら16GBのメモリとかあるじゃないですかその中のどこにプログラムが置かれたかっていうのってわからないですよねこっちからだとなんですけどC言語とかだと
-
そのポインターを参照してアクセスするみたいなことができて例えば15番地のプログラム動かすみたいなはいはい重症的なのがポインターってことですかそうそうそうそうなるほどマウスのポインターが出てきちゃってたんで僕はもうなるほどそういうことですねポインターを指定してなんかできると危ないよねっていうことですよねそうですそうですなんで危ないんだろう
-
2のものとか動かせたりとか変数とかもあれですよね確かポインターのラッパーですよねはいというのでそれがオブジェクト思考の強いところですよというところからもう少しブレイクダウンしていってポリモフィズムはポインターを経由して関数を呼び出すというものを制約するものオブジェクト思考における安全にポリモフィズムを使うというのが非常に強いところですと
-
でこのポリモフィズムってどうしました?やっと意味わかったわアドレスを指定するとダメな理由あ、ついてにお願いします同じ関数を読んだ時に別のメモリのアドレスが動くよっていうのがポリモフィズムってことですよねはいそうですだけど直接指定できちゃうとなんかもう無限ポリモフィズムができてしまうよねうんうんうんうんうんだけどオブジェクト思考のポリモフィズムを使えばその辺がなんかうまく制約できるよねっていうことか
-
ポイントは直接指定方式だとどこからでも指定できちゃうからみたいなあ、秩序がなさすぎてってことですかさっきのGoTo文の話じゃないですけどそうそうそうだから結果全然リードと関係ない処理も動いちゃうじゃんみたいなことができちゃうから危険なのかそうですね僕らはOS作ることないですけどアプリ作るときも同じことができちゃうからってことかそうですねっていうので結局そのパラダイムって
-
わかりやすいコードを書くためにいろいろ生まれてきたものであってこのポリモフィズムとかもこれができると何ができるかというとポリモフィズムとセットになるのって多分インターフェースとかだと思うんですねどういう意味かというとインターフェースで定義されたものどうしようかな動物動物にしよう動物走る歩く鳴くご飯食べるみたいなメソッドがあるインターフェースはいはいで
-
鳴くってやるとワンワンかもしれないしニャーニャーかもしれないですとなるほどこれがポリモフィズムなんですけどこれインターフェースができますとインターフェースって何をやってるかっていうと抽象化をしてるんですねこの例えば犬飼ってる人カイチが犬飼ってますと犬飼ってるカイチがワンワン鳴く犬の犬の
-
鳴くっていうメソッドを呼び出すとします状況もよくわかんないんですけどその時に僕は猫が何て鳴くか知らなくてもいいじゃないですかうんうん
-
あと猫がなんて鳴くかも知らなくてもいいですし他にライオンっていう動物がいるのも知る必要もないんですよなるほどね使ってる側からしたら指示の仕方だけ分かってればいいとそうですそうですこれがポリモフィズムがないと僕はドッグっていうのを覚えなきゃいけないと猫も飼いたいってなったらドッグとキャット覚えなきゃいけないとそれがアニマルで良くなってるのがポリモフィズムの上手いとここれによって分かりやすい行動をかけるようになってると
-
いう話ですねここからちょっと時間が結構いっちゃったので話そうと思ったことをがっつりカットするんですけど本当はここからインターフェンス逆転原則ですね話をちょっとして終わろうと思ったんですが時間がパンパンすぎるので断念しますはい来たか
-
聞きたかったらちょっとお便りくださいはい送りますそうですね確かに僕がお便り送りますまとめるとボブボジさんの主張曰くカプセル化継承ポリモフィズムってあったんですけどポリモフィズムはすごいとポリモフィズムはすごいと継承は0.5点うん
-
カプセル化はできるやろっていう話でこのポリモフィズが一番すげえんだとこれによってめちゃくちゃソフトウェアがわかりやすく欠けてるんだっていうのがポポジさんの主張でじゃあ何に結局制約を持たせるものなのかというと間接的な制御の移行に規律を課すものと
-
関節的な移行の制御関節的な制御の移行ですだからさっき言ってたポインターの話ポリモフィズムもそうですけどインターフェースを呼び出すだけでその奥にいるメソッドを呼び出してるわけじゃないですかこれ関節的に呼び出してるもの関節的に制御してるもの
-
この間接的な制御そのものに対して規律を課しているのがオブジェクト思考言語これは関数型じゃなくて手続き型のプログラミング言語ではできないそれに制限を課しているのがオブジェクト思考言語なんだって話で最後に順弁のためにおされをすると3つ出ましたね構造化と関数型とオブジェクト思考構造化プログラミングは
-
でもおさらいしちゃうと俺言うことなくないですか分かったじゃあ出たじゃあ順平によるおさらいじゃあ順平によるおさらいお願いしますごめんなさい最後に一個参考情報だけ順平さっきさ手続き型聞きたいって言ってたじゃん僕メモしてましたえらい読んでて俺も気になったんだ助かります違いがほとんどないです手続き型と構造ほぼ同じだと思ってたGoToの有無ですそうなんだらしいです
-
僕は知らない分かんなくてGPT-4に聞いてディスカッションして結果GoToの有無みたいです手続きにはGoToがある構造化はGoToがないもしくは制限が加えられているなのでGoTo使えるやつは手続き型と言える使えないやつは構造化らしいありがとうございますちょっと上に書いておけよ俺って思うわ今まとめの
-
台本見てポンと書いてたけどじゃあちょっと今日じゅんぺいにまとめをしてもらって締めようかなと思います構造化型構造型構造化プログラミング構造化プログラミングはGoToでどこでも行けちゃってたやつをそれ良くないからって言って順序順序順序順次処理と選択すごい
-
なんだループ繰り返し最後やべえ最後出てこない最後サクッと出たよ最後にプラスみたいな感じでチョンって出てきてさっきまで覚えてたんですよさっきまで覚えてたんですけど出てこないですね4つ目機能分割ですね機能分割はいはいはいライブラリとかそれ時点がはいはいはいっていうのを
-
新たに取り入れたやつが構造化なんだっけ構造化プログラミングはいですで2個目が関数型プログラミングこれはもうあれです変数に制御を設けてないやつ逆だな制限設けてるやつな変数に最大限しないやつ
-
普遍変数を使うやつはいはいはい普遍変数ってもう不思議な言葉だよね確かにね定数やんって思うよねそうだよねこれはあの和訳の癖かもしれないですねあー確かにでもまあイミュータブルバリアブルとかなってたのかななってたかもしれないですねそうか制限を設けそういうことですね制限を設けるやつ設けるやつはいOKですゆえにヘル処理とかが早くてそうなんかそういうのに使われるそうそうはい
-
でオブジェクト思考はまあポリモフィズムがめっちゃ強いここは認めてあげようっていう言語他のやつは他の言語でも別にできるやろうっていうボブ視点ボブ視点なんだよなそれボブ島がっていうので間接的な制御に制限を持たすものですねでごめんなさいそれで
-
ちょっとその中で思うのがそれってつまり構造型プログラミングのもとにそこら辺のオブジェクト思考とか関数型とかがあるんじゃないかなって思ってなんか同列ではない気がしたんですよねそうそう合ってます?そうそうそうそう俺が勘違いしてたのもそこなんだよねあーなるほど同列じゃないんだよね
-
時系列もそうだよね多分時系列は多分手続き型があってそこから関数がピュッて出てきてその後にオブジェクト思考ポッて出てきてる理論はそうです実際の言語はちょっと分かんないですけどそうなんだよ分かれてるものじゃなくてオブジェクト思考プログラミングの中でも構造化プログラミングの考え方というかもあるし関数型とオブジェクト思考はがっつり分かれてるかもしれないけど
-
別れてないの?いやないよな今はないはずあんま聞いたことない気もするっていうその英語日本語みたいな感じじゃなくて料理に近いねどう?和食みたいな?和食だけどカレーってさ日本の料理みたいな感じのカレーあるじゃんあるでもインドじゃんインドって言われてるやつ言われてる
-
なんかそういう感じじゃないそれぞれのエッセンスを取り入れつつなんか独自に発展してってるよみたいな海外でも脱脂文化今取り入れてってますよみたいな感じしない?
-
多分わかんなくもないギリギリわかんなくもないけどもうちょっといいやつある気がした50点くらいの感じありがとうございます今日伝えたかったのは3つの特徴とそれぞれって分裂してるものじゃない僕も恥ずかしながら勘違いしてたところであったのでWikiとか見て例えばPythonで言うと構造化プログラミングでもあるしオブジェクト思考プログラミングでもあってって書いてたらはぁって思ってたんですけどそういうことだったんだなと
-
分かったのでその学びの共有をしたくて書き下した次第でしたありがとうございますだいぶクリアになりましたこれは本読むと面白いんでボブおじさんの怒りとかにもちょっと触れるかもしれないのでいいねでも読み応えあって楽しいですねなるほどね時間が結構いってしまったのでサクッと締めちゃいますねではハッシュタグひまじんプログラマーでSNSのXでフィードバック募集してますので
-
ご意見ご感想お願いいたしますそうですね皆さんのプロレスも聞かせてくださいお願いしますエンターテイナーとしてはプロレスできるようになりたいんですけどね確かにねそこまでまだ自信がない自信がなくてできないそれだあと叩かれた時に耐えれるメンタルもないそれよなはい
-
あとは説明欄からGoogleフォームでお便り要望を募集していますのでこちらお気軽にお願いいたしますバシバシお待ちしております各種ポッドキャストプラットフォームでのフォロー高評価お待ちしていますのでこちらも高評価お願いいたします皆さんの応援をお願いしますいいねはいでは
-
パラダイム他にもいろいろあるのでただちょっとね実はほっときがちみたいなところを取ってこれれたらと思うので次回もお楽しみくださいありがとうございましたバイバイ
#213 プログラミング言語のパラダイム??