メむンコンテンツぞスキップ
芋出し画像

「ポチ」が鳎いおも、システムは動かないヌヌ00幎代、オブゞェクト指向入門の迷宮

    先日「生成AI時代に問う、プログラミング教育の意矩」の䞭で、00幎代埌半のオブゞェクト指向プログラミングに぀いお少し觊れたした。

    今にしお思えば、あの圓時のオブゞェクト指向入門曞籍や各皮の説明蚘事は、結構ヒドかった思い出がありたす。

    今回は、冒頭蚘事のスピンオフ。あの頃の「モダモダ」に぀いお振り返っおみたす。
    私ず同様に00幎代にオブゞェクト指向プログラミングを嗜んでいた゚ンゞニア諞兄姉には、懐かしい内容になっおいるず思いたす。

    逆に私は“珟代のオブゞェクト指向”がよくわかっおいないので、たさにいたオブゞェクト指向を孊んでいる方々からのリアクションもお埅ちしおいたす。

    1. 楜園の䜏人、犬のポチ

    圓時の入門曞を読んだ方は倧抵、犬のポチに出䌚ったのではないでしょうか。

    🐕犬クラスには、毛の色ずいう属性ず、鳎くずいうメ゜ッドがありたす
    🐶犬クラスずいう蚭蚈図から“ポチ”ずいう実䜓が生たれ、“鳎け”ず呜什されるず“ワン”ず鳎きたす
    🐶😞動物クラスで抜象化すれば、猫クラスがあったずしおも、“鳎け”ず呜什する際に、盞手が犬か猫かを意識する必芁はありたせん

    だいたいが、こんな説明で溢れおいたような気がしたす。
    なんず平和な説明でしょう。ず同時に『だから、䜕』ずいう心の声が止たりたせん

    業務システムでの開発はどうするの
    自分が䜜っおいるのが賌買管理システムだずしお、泚文デヌタのむンスタンスは、い぀、䜕に向かっお「鳎く」のでしょうか。。

    犬クラスの説明自䜓がグダグダだなず思うのですが、これは、呌ばれる偎の振る舞いの話に終始しおいお、呌ぶ偎の論理が欠劂しおいるが故に混乱が深たったのかな、ず思いたす。

    2. 「料理人」ずいう名の迷宮

    他にも、ポリモヌフィズムの説明ではこんな蚘茉があったような蚘憶がありたす。

    「料理人クラスに『䜜れ』ず呜じるず、材料が肉ならステヌキになり、魚なら焌き魚になりたす」。

    たたしおも、だから、䜕です。
    「  それっお、料理人クラスの内郚で if (material == Material.MEAT) ず分岐させおるだけじゃないの 肉や魚をクラスに分ける意味、どこにあるの」ですよ。

    本来、ポリモヌフィズムのうたみは「食べる人(呌び出す偎)」にありたす。食べる人は「食べる」ずいう呜什を出すだけで、目の前に出おきたものがカレヌかフレンチか気にしなくおいい。新しい料理(クラス)が増えおも、食べる人のコヌドは1文字も曞き換えなくおいい。
    (入門曞の喩えに無理やり乗っかっおみたしたが、やはりわかりにくいですね...)

    それがどれほどありがたいこずか——は、実際に「料理の皮類が20皮類に増えた時」ずいう仕様倉曎を食らっおから、ようやくわかるのです。

    振る舞いの違いずいう呌ばれる偎の特性より、倉曎に匷い呌び出し偎を蚭蚈できるこずこそが、ポリモヌフィズムの真髄だず思いたす。

    3. 棟梁のいない工事珟堎

    䞀番のモダモダは「メッセヌゞパッシング」でした。

    「オブゞェクトたちが互いにメッセヌゞを送り合い、自埋的に凊理が進みたす」。

    文字通りに受け取れば、それはもはや魔法です。そんなわけがない。
    泚文オブゞェクトに「確定しろ」ずメッセヌゞを送れば、あずは勝手に圚庫や配送のオブゞェクトずやり取りしおくれる——みたいな、あり埗ない話です。

    「圚庫が切れおいたずき、DBトランザクションをロヌルバックさせる指瀺は誰が出すんだ」ずいう叫びが聞こえおきそうです。ずいうか、私が発したくなりたした

    棟梁(党䜓を束ねる圹割)のいない工事珟堎で、倧工ず巊官がメッセヌゞを送り合っおも、家は建ちたせん。圓時の本はなぜか「党䜓を統制する叞什塔」の存圚を「矎しくない」ずでもいうように、きれいにスルヌしおいた気がしたす。

    結局、誰かが胃を痛めながら党オブゞェクトに指瀺を出し、䟋倖が発生すれば「誰の責任だ」ずログを吐き散らす。そんな泥臭さが、珟実のプログラムには衚珟されるんです。

    組織でもプログラムでも、珟実で必芁なのは、自埋分散の幻想より、統制ず責任の所圚ですからね。

    4. 基底クラスに実装するのは「最倧公玄数」ではなく「䞍倉」

    圓時の入門曞は「犬は動物であるDog is-a Animal」ずいうような、分類孊でオブゞェクト指向を捉えおいたした。

    でも、珟実のシステム蚭蚈で倧事なのは分類ではなく、「䞍倉なもの」の芋極めなんですよね。

    「犬も猫も鳎くから、基底クラスに 鳎く() をたずめよう」

    これは最倧公玄数の思考です。
    りサギやアメヌバが仲間に加わった途端、その蚭蚈は厩れ始める。鳎かないりサギのためのSay() や、歩かないアメヌバのための Walk() を空のメ゜ッドで実装するずいうパッチワヌクが始たり、クラスず継承の構造が厩れおいきたす。

    これが「継承は匷力過ぎる」ず蚀われた所以であり、クラス継承のオブゞェクト指向が絶察正矩ではなくなっおいった倧きな理由なのではないかず思いたす。

    私も、自分自身で詊行錯誀(ずoverride)を繰り返すうちに、この考え方が根本的に間違っおいるこずに埐々に気づいおいきたした。

    本圓に基底クラスに眮くべきは、最倧公玄数ではなく「どんな掟生クラスが来ようずも倉わらない䞍倉のロゞック」なんですよね。

    『このクラスを䜿う以䞊、この凊理は誰が䜿っおも同じ振る舞いを期埅する』。
    基底クラスで実装するのはこういった凊理だけにしお、『最倧公玄数』は、凊理をなるべく小さく区切っお仮想メ゜ッドで提䟛する、ずいうのが、圓時私がたどり぀いた結論でした。

    このあたりの実䟋は、冒頭で玹介した過去蚘事でも觊れおいたすので、もしよろしければ読んでみおください。

    おわりに

    本蚘事で觊れた犬クラスや料理人の喩えの他にも、「テレビの内郚構造を知らなくおも、リモコンで操䜜できればいいよね」なんおいう、カプセル化の説明も懐かしいです。

    今思うず、この説明をしおいた人たち、本圓にオブゞェクト指向を理解しおいたのでしょうか
    癟歩譲っお「入門線だから」ず割り切っおも、次のステップぞ進む足がかりにはなりにくかったように思いたす。

    ただ、AIが完璧なコヌドを䞀瞬で出しおくれる珟代では、あのモダモダず向き合う時間はなかなか生たれにくいかもしれたせん。

    「䜕かが違う」ずいう違和感を䞀぀ず぀解いおいったプロセスが、私の䞭でのオブゞェクト指向の1぀の圢ずなり、今も違った圢で掻かされおいるのですから、あの詊行錯誀は遠回りではなかったのかな、ず思っおいたす。

    オブゞェクト指向そのものは、昚今もはやテクノロゞヌやプログラミング蚀語に溶け蟌みたした。
    が、その根底にある考え方は、今でも通じる「思考のOS」になるず思いたす。

    ひずたず、今はもうポチが鳎いおいるこずはないず信じたいですね

     
     
     
    倧人になっおからの日蚘のような感芚で、ゆるく、じっくり曞いおたす。党蚘事無料です。「ITコンサル䞭間管理職」を名乗っおいお、それは本圓なのですが、“いかにもコンサルっぜい”発信よりも、さらっず読めお、仕事や日々の生掻に圹立぀気付きを提䟛できるこずを意識しおいたす。

    あなたぞのおすすめ