戦士だから「戦う」コマンドを持っているわけで、人間だからではないですよね。戦えない人間だっているんですから。それに、戦士は人間の役割であって、人間を継承するものではないですよね。そう考えると、これらの設計はヤバいぞ?って見えてくると思います。あまりにも具体的過ぎるし、「is-a」の関係ですらないんですよ。 「戦士 is a 人間」は成り立っているようで成り立っていません。オークにだって、トロルにだって、リザードマンにだって「戦士」はいますから。
@@Sola.No.17 うーん。戦士や人間クラスを作らずに、キャラクタークラスを作って、インスタンス化するときに職業データの参照をメンバに持たせるということですか?すいません理解が足りなくて。 なんとなく正解は16:54辺りで水野さんが言っていたことに近い? >>「戦士 is a 人間」は成り立っているようで成り立っていません。 確かにそうですね、まずいですね。これは堀元さんが真っ先に嫌うことな気がしますがどうなんだろ。
【参考文献】
○コーディングを支える技術
amzn.to/3TscsJp
○オブジェクト指向の考え方 5th Edition
amzn.to/3lpDaFQ
○WEB+DB PRESS Vol.132
amzn.to/3JtYkuv
○プログラミング言語大全
amzn.to/3yNiYRf
○はじめてのLisp関数型プログラミング
amzn.to/3yNj3V3
○論理哲学論考
amzn.to/43h3vqM
【サポーターコミュニティ加入はこちらから】
yurugengo.com/support
【おたよりフォーム】
forms.gle/BLEZpLcdEPmoZTH4A
※皆様からの楽しいおたよりをお待ちしています!
🎉
水野さん、ずっと言語学ラジオやってて笑う
無謀なメタファーを放り込むホリモーティズムは今回なかったですね
オブジェクト指向って
人間が認知しやすいように作ってるから
図らずも認知言語学とちょっと重なってくるの好き
その逆で人間にとって最も扱いづらい考え方でもある。
オブジェクト指向の最大の欠点は、コアに潜むバグです。
複雑に継承されたコードは、発狂ものです。
@@takenonya1672
「た」の回で、ゆる言語学ラジオが苦戦していたのは
複雑に継承された結果って事ですね
初手カウンターの流れ面白すぎるってw
プログラミング言語の話してるときに水野さんが自然言語のはなし挟み込むの、専門家とかだと正確性を第一に考える都合上そう簡単に突っ込めないけど、一般人に近いこの二人だからこそできることだと考えるとまじで唯一無二だなこれ
ポリモーフィズムの凄さを水野さんがピンと来ないというのがむしろ凄さの証拠なのでは、という気がしました。
内部処理(コンピュータ側の都合)を意識せずに、人間の自然な思考に近い形で実装できるがゆえに、「こんなことができるんですよー」と説明されても「普通じゃん」となってしまうわけですよね。
つまり、水野さんが特別さを感じられないほど、自然な思考に近い形になっているということなんじゃないでしょうか。
これはインスタンスが違うとメソッドが違うことをプログラマが考慮しなくていいっていうエラサがあるわけだから、戦士、魔法使いという実態があって、
戦うって命令をすれば必ず剣で攻撃するか魔法で攻撃するかを自動でしてくれる位の説明じゃないと意図が分からないのは当然な気がする。
実態を考えないとない命令をした時にエラーになるみたいなニュアンスを想起出来ない
鳥クラスを作ってペンギンの表現に窮した場合、実は開発したいシステムにとって意味がある分類は飛ぶ/飛ばないではなかったかを再考する価値があると思います。
生物学的に"正しい"鳥類という分類に従った鳥クラスより、飛行クラスと歩行クラスのほうがうれしいかもしれません。
これは言語学で言うと雪国では「雪」を表す単語が生活上有益な区分に従ってさらに細分化されているのと類似しているとと思います。
コンピュータサイエンスも言語学も認知科学に親和性の高い部分があるので、そういうジャンルになるとこの二人の組み合わせは面白くなるよなーと思ってたまさにその回でした。
なお最悪の組み合わせだったのはプリンのやつw
察しが良すぎる水野さん好き
お互いの得意が噛み合ってて、(真面目なテーマの中では特に)お二人が楽しそうでお気に入りの回
ポリモーフィズムは初めて見たとき感動したな。
配列に動物クラスのいろんな種類のインスタンスを詰めて、全員に鳴いてもらうみたいなコードで感動した記憶があります。
ポインタも型のチエックもキャストも分岐もなしにこの複雑な処理が直感的に書けるということで、うまくやるなーと感心しました。
オブジェクト指向で継承しまくったソースを使うと、
作る方は楽だけどバグが発生したときの原因追及するときにすごい苦労するんだよねぇ
しかも継承元に問題があるときに修正したときに継承先にどれくらいの影響があるか分からないのも怖い
ですね。なのでRustやGoなど最近の言語では継承をサポートしなくなってます
ポリモーフィズムが初めて腑に落ちたのはcompositeパターンの説明を見た時だった
知らなければ出てこない発想だし再帰も出てくるし初心者がプログラミングの面白さに気づく最高の題材だと思ってる
オーバーライドは自然言語で置き換えると
「パンを食う」と「時間を食う」みたいなもんですかね
水野さんが「何言ってんだコイツ」だけで処理せずにちゃんと理解しようと試みているのが素晴らしいと思います。
的の外れたことを言ってしまうのも微笑ましいです(実際、プログラムを学んだ人じゃないと分かりにくいですから)。
そして今回のように言語学との類似性を見出した時などはお見事だと思います。
水野さんが認知言語学の例えに持っていくの良いですね。オブジェクト指向を理解してきた。
実際にオブジェクト指向設計するのは難しいです。C言語で慣れた人間なので。
このチャンネルを見ていると、コンピュータサイエンスと言語学は意外と近しい学問なのかもと思えてくる
計算理論もプログラミング言語も言語学も根っこにあるのはチョムスキーの生成文法だから、それはそう
そもそも論理学や数学を用いているので多分ベースにはしていると思いますよ
特に人工知能の分野だと『人間の思考に近づける』という試みなのでベースにはしていると思います
我々が認知しているこの「現実世界」とやらは一体何番目の入れ子構造の世界なんでしょうね……?
「コンピュータはちゃんと動く必要がある」っていうのが、
逆に人とかの動物はちゃんとしてなくても動ける・動いた結果が実現してればある意味で正解みたいになるのが面白いですね。
水野さんの察しが良すぎて毎回タッカーさんの気持ちが疑似体験できる
めんどくささを減らすだと理解されにくいですよねー!
使い回しが発生しがちで、その際に、修正漏れが発生しやすくなってバグが発生しやすくなるって言うとわりと理解てもらえた記憶があります。笑
いつも楽しく視聴させてもらってます。
「オブジェクト指向と認知言語学」の後半でお二人が
「コンピュータの上にコンピュータをつくる」と仰ってるのは
仮想化や仮想マシンの概念の話っぽいな~と思いました。
今後はそういうテーマも扱ってくださると嬉しいです。
14:47 これ、個人開発者が適当に作った場合じゃなくて、商用開発でまじめに作った場合にも結構同じことが起きていているよね…
コンピューター科学と言語学の殴り合い面白いのでもっと見たいです。
言語学を大学で収めて今SEとして働いてるからこのラジオめっちゃおもろい
修めて、な。にどとまちがえるな
野生の堀元水野だ!
@@user-uy4br8kv4b 文脈を読んで上手く変換しないIMEがクソなんだよ
これは日本語の大型アップデート時でオーバーロードされてることを暗に指摘しているんですね!
@@millipferd IPPON!
このIME野郎は言語の線状性をちゃんと考慮できてないですね。
楽しみに待ってました
33:20
マインクラフト内にマインクラフトを作った人もいるらしいですよね。
ヴィトゲンシュタインの話は僕も論理哲学論考を手に取った時に感じた事と同じですね。本の中身の記述自体がとてもソースコード的だなと感じましたし。
認知言語学や生成文法の話を聞いた時もアプローチが似てるなと思ってましたけど、この動画の話を聞きながら思ったのは、言語学はあくまで現実の自然を記述しようとしてるのに対して、オブジェクト指向プログラミングのベクトルはその逆で、プログラミング"言語"の記述から仮想の自然を生成しようとしてるように見えるので、物理学的な視点で見ると、時間ベクトルがお互いの分野で矛盾を生みそうだなとか思ったりしました。
最近話題になってる生成系AIも画像生成と文章生成では、全く違うアプローチになってる事ももしかしたらこの動画の話題と深いところで繋がってそうな気がしますね。
ほかのラジオもいいけどこの2人の面白さはずば抜けてるように感じる
実際のコーディングの思考手順をよく考えてみると、
1. てきとうな名前のクラスを作って、やらせたい仕事一式を記述する。
2. 「この仕事をするのは何係だろう?」と比喩を考えてクラス名を改善する。
3. 仕事の細かい手順を書き込む。
4. 複数のクラスを作っているうちに、だんだん、親クラスにまとめたほうが効率いいなと思うようになる。
5. 「この仕事をする人達は何部の何課だろう?」と比喩を考えて親クラスを作って、基礎的な仕事をそっちに移していく。
といったところです。
すべては比喩であり水野さんの気づきは圧倒的に正しいと思いました。
改めてコンピュータ科学と言語学的の、この2人のタッグ最強すぎる
収録を通して考察が深まっていくあたりがたまらない
プログラミングパラダイムの最終回がオブジェクト指向で終わってしまうのは微妙では?と思っていたら、次回に続くとのことで安心しましたw
水野さんの凄さを痛感出来る回が増えた ChatGPTの回では主役を張れる
オブジェクト指向の本質というか、根底にある考え方って「いかにヒューマンエラーを減らすか」という部分にあったりします。ちょっと文系的に言うと「人にやさしく」と言ったところで、例えば、カプセル化は変数と処理をひとまとめにすることでスコープ範囲をコントロールでき、継承によって繰り返しの処理をできるだけ減らすことができるので、それはプログラム構造の整理→コードの簡素化→可読性の向上につながります。コンピューターの高性能化によりチームでのコーディングが複雑になるにつれ、連携不足や難読化が加速しヒューマンエラーに起因するバグの量産がオブジェクト指向言語がよく使われることにつながったと思います。
同時期にXPやアジャイル開発等が流行り始めたのも、偶然の一致ではないというのが私の見解です。あと、後半は宇宙シミュレーション仮説につながる話だなーと思いましたw
20:15 水野さんのテロップのWhom did you seeに誤植があります
お二人の会話、ニヤニヤが止まらない😊
すっかり「ゆる哲学ラジオ」でしたね!
いや、人間と世界の関係の本質に関わる対話だったから「ガチ哲学ラジオ」でした!!
28:20 『論理哲学論考』の主張は「言語が有意味であるためには世界の構造がこのようになっていなければならない」という逆の発想だと聞いたことがありますが、「世界の成り立ちを言語に基づいて説明する」という点はオブジェクト指向と確かに似ていると思います。
オブジェクト指向は世界をどう切り取ってプログラム化するかの話をしているので、
人間が考える世界とはどのようなものか?を考える哲学・論理学や、
人間が世界について記述するために用いる言語などと近接するのは必然と言えば必然
シンエヴァでも反宇宙の事物は人間に知覚出来ないから過去のイベントを経由して理解させている描写がありましたね
水野さんの言う特徴をいくつか用意してラベル付けするアプローチは、Rust言語のTraitに近そうですね。
代表的な概念全体を親として1つ継承するのではなくて、概念を複数の特徴に分割しておいて、こっちの特徴は受け継ぐがあっちの特徴は受け継がない…といった柔軟な記述ができる。TypeScriptのUnion型にも近しさがありそうです。
Rustは堀元さんが好きな言語じゃなさそうな匂いがしますが、古典的なオブジェクト指向モデルの問題を乗り越えた最新のプログラミング言語についてもいつか語って欲しいです!
「ポリモーフィズムは、オブジェクト指向の奥義」と思っているので、水野さんにも多少なりとも響いたのをみて嬉しくなりました。
論理哲学論考に辿り着くのエモすぎる
C# を勉強していて、どうしてもポリモーフィズムで何を言いたいのかを理解できず色々と説明を見て回っていたのですが、この動画でやっと理解できてとても助かりました。ありがとうございました。
すごい!!ふざけて話してるこのラジオが人の役に立つ日が来るとは!!
こちらこそ投げ銭ありがとうございます!!励みになります~!!
17:22 〇〇らしさというのは、オブジェクト指向の「インターフェース」に該当するではないかと思います。
例えば、一定の順番で並べられるオブジェは「Comparable」を実装したり、中にいろんなものが入れれるコンテナオブジェは「Enumerable」を実装したりとか
Comparable を implements していても「一定の順序で並べられる」とは限らないです……!
(Comparable を implements している class の instance の集合が、Comparable#compareTo の結果に従ってトポロジカルソートが可能とは限らないので!)
28:40 あたりの水野さんの話は、業務要件定義にあたりますね。
ポリモーフィズムの真価は「具象クラスを知らなくても操作できる」ところにあると思う。これのおかげでフレームワークがはかどったと言えるのでは。
動画でそう言ってるやん
知らない事で、得する事もあるけど、組み込み時のデバッグは、致命的。
「オブジェクト指向プログラミングを用いたGPT4上にコンピュータや人間を抽象的な自然言語を用いて、記述できるのでは?そしてそれはGPT4上に世界を再現できるのでは?」という落合陽一さんの発言とこの動画の内容がメチャクチャ、リンクしてて、とても参考になりました
メタファーの話も論理哲学論考の話もプログラミング言語も全部、技術的には圏論で全て扱えそうですね〜
後半の言語理解におけるメタファーの話、DDD文脈で語られることの多いユビキタス言語の話を思い出しました。そういう肉付けもできるなと。
実際には「人間」みたいなクラスをつくるというよりは
語尾が -or型になっている「〇〇するもの」で書くのが規約になっていて
まさしく「流れるもの」を「時間」と「川」に継承させるように
分類で安易に継承するのではなく、目的に従って意思を継承するようにしたい(これは宗教戦争か?)
初学者なのですが、この規範はどの言語を想定していますか?
@@atsushigrizlupo8479
いや、命名規則は宗教戦争だから...言語よりチーム内ルール次第だ
ただ-erとか-orとかついてるとクラスだなぁって思うし
動詞ならメソッドだなぁって、ワイは思う
単純な動詞+er(or)は、型やクラスってよりも、インターフェースに付ける名前と認識していますね。名詞+動詞+er(or)は、一番やっちゃ駄目な型(クラス)定義ですね。後で絶対に困ることになります。
@@gochuui1 なるほど。ありがとうございます!
マイクラの話で思ったのが「いつから自分達の世界が1番目と錯覚していた?」
面白かったです。ヨーデルって例えは、アーティスティックな表現という次元で分類をしたら、それもまた難しいということなのでは?とおもいました。原典もみてみますね。
遙か昔、組み込みJavaのプログラムをアセンブラにして見た事があるけど、インスタンス化とかでメモリコピーが多様されているのを見て、実装は大変だなと思った事がある。っと同時に当時Javaは速くないと言われていた理由が分かった気がしたのを思い出しました。動画内で"コピーとは違う"というのが何回か出てきて思い出した次第です。プログラムの世界は、01からどんどん遠くなって行く事がある意味進化と言えますが、最近のAIにプログラミングさせる状況を見ると中々感慨深い物があります。
今回の水野さんは途中から獲物を狙うような目つきで、
堀元の野郎が頑張って発表したテーマを言語学とかの知識で”カマしてやろう”って感じがして面白い。
ちょうどこの頃は堀元の野郎がゆる言語学ラジオから始まった活動なのに、他の分野にも広げて小銭を稼ごうとしている時期だから、水野さんも色々考えていたんだろうか?
オーバーロードと一緒に出てくるのがジェネリック
機械語を世界の真理とするなら、オブジェクト指向は糖衣表現。
一般的な人間の認知能力の限界に絶望した先達達が考え出した窮余の一策。
などと下らないことを考えながら聞いていたのですが、次回の話題に期待しています。
水野さん、俺より本能的にオブジェクト指向理解ってる(インフラエンジニア歴20年選手
27:14あたりからの水野さんの解釈面白いし、言語学からの解釈がコンピュータサイエンスの概念の「たとえ」として秀逸でうまく機能してて、相乗的にどちらの概念も理解が深まる面白現象を今回特に感じました。このラジオ、このお二人ならではですね。
7ヶ月たってあらためてTH-camにおすすめされて見ればこれが神回であると思いきや、オブジェクト指向は古いって!
ポリモーフィズムでめちゃくちゃ腑に落ちたのは、JavaとかのtoStringメソッドかなぁ
ユーザー側としてはtoStringがあるということだけ知っていれば、対象がInteger型だろうがObject型だろうが気にせず文字列に変換することが出来るので便利よねっていう
いまだにオブジェクト指向の神話に浸っているので次回が楽しみです。
個人的にオブジェクト指向は分類学の影響を強く受けてる気がするんですよね。
ハトやスズメは鳥類、犬やネコは哺乳類
で、鳥は飛ぶ、犬やネコは…とか
ただ、鳥にも飛ばない鳥がいたり、哺乳類にも飛ぶのがいたりして、実際そのまま適用できなかったり、そもそも使いこなすのにもいろんな勉強が必要で微妙なコードもたくさん量産したんですよね。
水野さんの話聞いてると、自然言語の考え方ってプログラミングと近いものがあるのかもですね。
「宇宙シミュレーション仮説」というのものありますかし、マイクラの中で世界が再現され、コンピュータが再構成されるのも自然かも知れませんね。
今回の話の中で、継承の話をしている時は「どうやって色々なジョブのキャラを簡単に実装しよう?」だったのが
ポリモーフィズムの話になるとレイヤーが1つ上がって「どうやってたたかうコマンドを実装しよう?」になるんですよね。
そしてその段階になると「たたかうコマンドって何するコマンドなの?」という問い対して大抵の人は「キャラに通常攻撃させるコマンドだよ」という説明になるのと同じように、この段階になると、人間はもはやそのキャラが何のジョブかなんてどうでもよくなってしまうんですよね。
なので「キャラに通常攻撃させる」という人間が自然言語で行う仕様説明と近い形で記述できるようになるポリモーフィズムという機能はかなり偉いんですよね。
ポケットモンスターリスコフの置換原則 レイコフの生成意味論
今回めっちゃおもろかったな
オブジェクト指向の定義をクラスとインスタンスにしてしまうと、プロトタイプベースのオブジェクト指向言語が定義を満たさなくなっちゃいますね
水野さんの言ってる鳥らしさの構成要素を複数定義する立場は、もしかしたら mixin に似てるかも…?
堀元さんと水野さんの牽強付会、我田引水合戦がいつ見ても面白いw
メタファーの話のところ、ダックタイピング知ったら水野さん感動しそう
ゲーム開発だと、どちらかと言えば管理目的で継承させることが多いと思います。
例えば「当たり判定のあるオブジェクトは、全てこのクラスを継承しておいて」と言う感じです。こうすれば、当たり判定が必要なオブジェクトをリストで管理できるので。
そして、当たり判定に必要な情報を get するための純粋仮想関数が用意されていて、必要なメンバ関数を実装するように促されます。
「犬は動物だから動物クラスを用意して…」のように現実世界を記述しようとする試みは、実務上は役に立たないので、現場では使われていない印象ですね。
それは継承というより実装: interface/trait/protocolなどと呼ばれるものになります。継承(拡張)ではなく属性を持たす概念です。
専用の機能がない言語(C++とか)では継承と純粋仮想関数で実現されます。
25:18
堀元氏渾身のダジャレ
「鳥がエサを取ります」
ChatGPTの話も、こんな感じで自然言語とプログラミング言語の観点から語ってほしいなぁ。
自然言語とプログラミング言語の境界線がどんどん曖昧になっていく近未来を、ChatGPTを使って実演しながら語ると面白くなりそう。
未来予想は参照できる文献の絶対数とか信頼性が確保しづらそうなので、中々難しそうですね…
動画タイトルを見て誤解する人がいそうなので言っておくと、ポリモーフィズムは別にオブジェクト指向が由来ではありません(※1)。
また、ポリモーフィズムはオブジェクト指向の専売特許ではなく、関数型言語(Haskell、OCaml、Clojureなど)にもあります。なので、「ポリモーフィズムで抽象概念を扱えるようになった」的な話は、関数型言語でも全く同じように説明できます。
※1: ポリモーフィックな型システムの研究は1960年代(すなわち、Smalltalkが出た1972年より前)から始まっています
33:44 世界の中で世界をシミュレートできるようになったとき、私達がいる世界が本物である確率は期待値としては限りなく0に等しくなる
という話(シミュレーション仮説)を思い出した
Java版MinecraftはJava Virtual Machine上で動作してるので、ここにも入れ子が隠れているという。
更にいうと、物理サーバーではなく仮想サーバー上で動作させた場合、さらにもう一つインデントが増える
オブジェクト指向は、天才が書いたコードを凡人にとって扱いやすくして、コードレベルを、平均化する事に一役担ってると思う。
それ以前は、アセンブリとC言語の職人とも言える ソフトウェア技術者にのみプログラミングの権利が与えられてたから。
オブジェクト言語の代表として根本的には手続き型言語にオブジェクトを追加したJAVAを持ってくるのはもにょる。
認知言語学との類似性はUXでよく出てくるメンタルモデルがまさに合致すると思います。
オブジェクト指向UIとかInformation Architectureはドンピシャ
戦士クラスと魔法使いクラスをつくると、魔法も剣も使える魔法剣士クラスは別なのか両方を継承するのか迷いだす。でも魔法を属性と考えれば良いのではと考えだす。魔法属性クラスを定義すると白魔法黒魔法赤魔法・・と種類が増えるとまた細分化された魔法クラスが発生し始める。延々細かくクラス化されてゆき管理が追い付かなくなりがち。世の中のほとんどすべてのオブジェクト指向言語を使ったプロジェクトでは大なり小なり陥っていると思う。
唐突なアクセルホッパーにホットドッグ吹いたww
オブジェクト指向にクラスは必須の要素ではないはず
プロトタイプベースなどもありますし
ただクラスだとカプセル化と継承がわかりやすくはある
Classの無いCでも、目的ファイル分けしてそれっぽくすれば、似たように書けますからね。
抽象概念をクラス分け出来ると、クラス分けすると緩さが少し失われる。綺麗にわかりやすく整理され素晴らしく見えるのだけど、それは抽象概念だから緩さに救われているだけ。使いやすいようにクラス化を細分化していくと厳密な分類概念が必要となってきて、使い勝手ではなく定義するのが目的の細分化が止まらなくなる。
後の棚がナナメになってるの気になりますね
27:45 世界とはメンバ変数とメソッドの集合の総称
日本語って、既に定義されている関数(動詞)がある状態で、ほぼ同じ処理(動作)のバリエーションを追加実装する時に、ユーザーの負荷を低減させるためにオーバーロードを使用してますよね!
「つとめる」とか「はかる」とか。
本編とはずれていますが感動しました!専門じゃないのであっているかわかりませんが、
外国語より微妙な定義の違いを明示可能でありながらも、日常的な使用での負荷は少ない。
この動画で得た知識のみでの考察ですが、日本語は特に動詞において、継承システムが機能しているように思います。
動詞に含めたい何らかのものはとりあえず「~る」と定義して、そのままオーバーライドすれば、そのまま実社会でエラーを起こさず機能します。
日本語の漠然とした便利さに納得がいきました!
この言語を使い慣れていると、名詞の型(冠詞)を正しく定義しないとエラー吐く言語とか、コーディングが面倒過ぎて受け入れ難いですね。
ある言語がオブジェクト指向か否かも曖昧な部分があると思います。いわゆる三原則の「カプセル化・継承・ポリモーフィズム」をすべて満たしていたらオブジェクト指向でしょうが、このうち2つだけを満たした言語なんかは意見が別れます。例えばRustは継承がないですが、オブジェクト指向だと言う人もいます(公式のドキュメントにも意見が割れているとある!!)。
Rustはいいぞ
乗っかって(rideして)上書きしちゃうからオーバーライド、引数によって道(road)が分かれるからオーバーロードと覚えました(本当はloadなんですが)。「シニフィ、アーン!とシニフィ絵」みたいな覚えやすい方法があればいいんですが。
24:27 ポリモーフィズムのメリットは、毎回分岐を書く必要がなくなる(むしろ分岐を書けない)ことによって、未知のクラスにも自動的に対応できることを強調したほうが良かったと思います。
「人間が戦う」という処理を書くことで、戦士が物理攻撃で殴る、魔法使いが魔力で攻撃する、の他に、後から吟遊詩人が歌の力でダメージを与える、という処理を追加しようと思ったときに、元の「人間が戦う」の処理に手を入れなくて済む、というのがメリットだと説明できれば良かったと思います。
オブジェクト指向の解説本なんかにある「動物←人間←戦士」みたいな継承の例え話は、害悪の何者でもないのよね。水野さんが指摘している通りの疑問がまず生まれるから、例え話がまず本質を捉えていない。分かり易くしているようで混乱させる例え話の典型。継承は抽象と具象であって、カテゴライズではない。そういった具体的な役割を表すクラスなんてまず作らないし、そんな具体的なクラスは継承なんてしない。人間クラスなんて全然抽象的じゃない。
実際のゲーム開発では人間←戦士ではなく、どういったクラスを作るのですか?
@@sei7970 ゲーム開発者ではないので、これが正解みたいな事は軽はずみに言えないです。ただ、自分がそういうものを作るのであれば、もっと抽象化して、ゲーム世界内の具体的な物を反映しないような形にします。キャラクターの職業(役割)は名前やHPと同じようにデータで表せますから、そのデータの参照先を持っていればいいだけです(いわゆるhas-aです)。キャラクターというクラスがあればいいわけで、人間という抽象クラスを継承する必要もないです。ゲームの処理的に人間も敵モンスター(人型や獣型など問わず)も同じ処理をした方のが楽ですよね。人間やモンスターのような物の分類的な形から設計するのは複雑になると予想できます。必要なデータを持つ器が最初にあり、その振る舞いもデータとして持つことの方のが楽だったりします。例えば、スキルなんてキャラクターによって保有している種類も数もまちまちですよね。
戦士だから「戦う」コマンドを持っているわけで、人間だからではないですよね。戦えない人間だっているんですから。それに、戦士は人間の役割であって、人間を継承するものではないですよね。そう考えると、これらの設計はヤバいぞ?って見えてくると思います。あまりにも具体的過ぎるし、「is-a」の関係ですらないんですよ。
「戦士 is a 人間」は成り立っているようで成り立っていません。オークにだって、トロルにだって、リザードマンにだって「戦士」はいますから。
そういうインターフェース的なことが次回にあるかもしれませんね。
@@Sola.No.17
うーん。戦士や人間クラスを作らずに、キャラクタークラスを作って、インスタンス化するときに職業データの参照をメンバに持たせるということですか?すいません理解が足りなくて。
なんとなく正解は16:54辺りで水野さんが言っていたことに近い?
>>「戦士 is a 人間」は成り立っているようで成り立っていません。
確かにそうですね、まずいですね。これは堀元さんが真っ先に嫌うことな気がしますがどうなんだろ。
水野さんってプログラミングやってました?
解答が鋭すぎてプラグラマー向いてそうな気がしました!
32:08 ゆる言語、ゆるコン、の面白さ!
21:51
ポリモーフィズムの利点の説明は以下の方が分かりやすいかもしれないです
・パーティには4人のメンバーがいてそれぞれのジョブはユーザが好きに選べる
・「全員でたたかう」の命令を考えたときに、手続き型だと、①メンバーのジョブを判定②ジョブごとの攻撃を実施③①と②を4回繰り返す というのを手続きを書く。ジョブの数だけ分岐して記述する必要がある
・オブジェクト指向であれば人間を継承してるキャラクターについて「たたかう」の指示を4回ループすれば良い(分岐が不要)
このシンプルなモデルの場合、コードの総量で言えば両者であまり変わらないですが、可読性の面で後者が優れています(本当は保守性/拡張性/関心の分離などの点でも優れているけど、まぁ、置いといて)
「オブジェクト指向」は人の数だけ定義があって、理解が大変ですよね。初学者の第一の関門だと思います。
ちな、僕はオブジェクト指向アンチ(過激派)です。対戦よろしくお願いします。
C言語の算術演算子も整数と実数を同じ記述にできるって意味で、そもそもポリモルフィズム的なんですよね。なのでこれを型とメソッドにまで応用できるようにしたのがOOPのポリモルフィズムなのかなと。
個人的にポリモーフィズムの恩恵で一番感動したのはイテレーターの導入でしょうか。これのお陰で繰り返し処理の記述がかなりすっきり書けるようになったので。
それは polymorphism というよりはどちらかというと operator overloading
次回予告からするにオブジェクト指向は有害であるということですね
導入部で吹き出し、迂闊発言気にし過ぎでやられた
(メンバ変数, メンバ関数)と(フィールド, メソッド)が対応の取れる呼び方だと思うんですが、対応が揃ってるかどうかを気にする堀本さんにしては珍しく混合して使われてますね。気になるー。
実行形式への変換(コンパイル)時にソースコードに対して何の処理しているかを掘れば、人間の認知のお話と繋がるような気もしますが、散らかるだけですね😅