モバマス(デレマス)SSです。
初投稿なので至らぬ点があると思いますが、教えていただけるとありがたいです。
登場人物
大石泉
https://i.imgur.com/FAlnZLS.jpg
村松さくら
https://i.imgur.com/nSGp3yi.jpg
土屋亜子
https://i.imgur.com/B5B7shg.jpg
SSWiki : http://ss.vip2ch.com/jmp/1634409003
参考
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
~事務所~
泉「って……プログラミング用語の?ずいぶん難しい言葉知ってるね」
さくら「えへへぇ……。情報の授業で先生が『オブジェクトシコウはすごいぞ!』って言ってたんだけど、詳しいことは授業で教えてくれなかったから、イズミンなら教えてくれると思って♪」
泉「そうなんだ。私も詳しく理解しているってわけじゃないけど……頼ってくれたからには、頑張って教えるよ」
さくら「わぁい!」
さくら「というわけで、イズミン先生!よろしくお願いしまぁす!」
土屋亜子「よろしくお願いしまーす!……ってなんでアタシも?」
泉「なんでって……すぐそこの事務所のソファにいたから?
亜子「ついで扱い!?」
さくら「アコちゃんも会話に入れてほしそうな顔してましたぁ♪」
亜子「う~ん、バレてもうてたかぁ。な~んて♪まあアタシも、ちょっとは気になるかもな。
……泉先生の授業が」
泉「内容じゃなくて、そっち?もう、からかわないでよ。まあ、いいや。はい、じゃあ先生の授業を始めます」
亜子(今、いずみがちょっとノった?)
『オブジェクト指向とは』キュッ
泉「まず簡単に、オブジェクト指向とは何か。これは先に言っておきたいんだけど、実は『オブジェクト指向』って言葉は意味がふわふわしてて、人によっても解釈が違うこともあるよ」
亜子「そうなんかー。とりあえず、難しいんやな。さくらはだいじょぶそ?」
さくら「が、がんばりまぁす」
泉「うん。『オブジェクト指向』っていうのは、プログラミングの考え方の一つなんだけど、よく言われるのは、『全ての要素をモノとして扱う考え方』って感じかな」
さくら「すべてを?ものとして??」ポケ
泉「あとは……『現実世界をそのまま表現する』なんて言われることもあるけど……」
亜子「それだけ聞くとなんかすごそうやけど、どういうこっちゃ?」
泉「うん、難しいよね。だからここは私の言葉で説明すると、『操作したい対象を、一つの物として扱えるように、ひとまとめにしておく。実際のプログラムでは、かたまり同士を作用させる』って感じかな」
さくら「うーん、ちょっとわかりそうだけど……操作したい対象?」
亜子「もう一声!」
泉「では二人に質問。『オブジェクト』は日本語でいうと?」
さくら「ええっ!?えっと……えっと……美術館にある像みたいなやつ!」
亜子「それは……オブジェ?
オブジェクトは……『物体』とか?」
泉「そう。『物体』とか『物』って意味。だからオブジェクト指向っていうのは『物に着目した考え方』ってことになるね」
亜子「ああ、なるほど!そう考えると、とりあえず『物』って考え方が大事なんやなってわかるな」
泉「そうだね。そして、『物』っていうのは『操作したい対象』って考えてほしいな。以前読んだ本に出ていた説明のひとつにこういうのがあるよ。
オブジェクトの世界では、(中略)配偶者が猫を踏むコードをわざわざ書く必要はありません。必要なものは、歩き回る配偶者オブジェクトと、踏みつけられることを嫌う猫オブジェクトだけです。この2つのオブジェクトを1つの部屋に配置すれば、予期しない組み合わせの振る舞いはいずれ起こるでしょう。
」
相川千夏(ちなみに『オブジェ』はフランス語で、英語のオブジェクトと同じ意味よ)
亜子「う~ん、いまいちわかるようなわからへんような」
泉「たとえば、このマーカーペン。亜子はこのペンを使って線を引いてって言われたら、できる?
亜子「そりゃモチロン」
泉「じゃあ、このペンを一から作ってって言われたら、できる?」
亜子「へ?いやいや、そんなんムリやろ」
泉「そうだよね、私もできない。けど、中身はよくわからなくても、使うことはできる。そして、そもそも中身は知る必要がない」
さくら「中身はわからなくても、使えるようになってれば別にいいや♪ ってこと?」
泉「うん。そういうことだよ、さくら」
泉「じゃあこのペンをオブジェクト指向プログラミングではどう表現するのか。これは、まず要素としては『色は黒』だよね、そして動作として『線を引くことができる』とか、『別の色のインクを入れるとその色の線が引ける』なんてのもあるよね。まあこのペンは詰め替えできないけど。
じゃあここで、『指定したマーカーのインクを黒から赤に変更する』ってプログラムを作りたいとします。どうしたい?どう習った?」
さくら「ええええ!!?うんと、う~んと」
泉「まずはpenって構造体があって……」
さくら「あって……構造体はいくつかの変数を合体させたものだから……、
その中にinkって変数があって、その構造体を作った後に
pen.ink = ’赤’
って関数を実行すればいい!」
泉「そう。よく勉強しているね。じゃあ、もし後から、『pen』は『ink』だけじゃなくフタの色を表す『cap_colour』っていう変数も持っていて、inkを変更するときはcapも一緒に変更しないとならないとすると?」
亜子「そうなると、
pen.ink = ’赤’
の後に
pen.cap_colour = ‘赤’
って書き足す必要が出てくるな」
泉「そうだね。じゃあ、もし赤にする以外にも、青にする関数とか黒にする関数とか、色を変えている場所が他にもたくさんあったら?」
亜子「そしたら……たくさんの場所を全部変えなきゃいけなくなる?」
泉「そう。それに、一度色を変えたいだけなのにいちいちinkとかcapとか色々な場所を変えないとならないのは大変だし、なによりこの後さらに変更すべき変数が増えたら、また処理を追加しないとならないよね」
亜子「増やさなければええ話やけど、どうしてもっちゅうこともあるしなぁ」
泉「こういうとき、オブジェクト指向の考え方では、構造体『pen』のなかに『ink』、『cap_colour』とかの要素を作るのは同じなんだけど、そうしたらね、これらの要素は別の場所からアクセスできないように設定しちゃうの」
さくら「ええ?じゃあどうやってインクの色を変えるの?」
泉「構造体の中に、要素を直接アクセスできるようにする代わりに、色を変更するための『setColour( 入れたい色 )』っていう関数をあらかじめ作っておくの。そしてこの関数を別の場所からアクセスできるように設定して、インクの色を変えるときは要素を直接変更せず、この関数を実行するだけにしてもらうの。そして、
setColour( char a ){
ink = a;
cap_colour = a;
}
こうすれば、インクの色を変えたいときは
setColour( 赤 );
とだけすればいい。さっきみたいに後から別の処理をしないといけなくなったら、構造体にある『setColour( ) 関数』の中身だけ変更すれば、実際に何回呼び出されているとしても、変更は一箇所だけで済む」
亜子「さっきは
pen.ink = ’赤’
pen.cap_colour = ‘赤’
とか
pen.ink = ’青’
pen.cap_colour = ‘青’
みたいに、色を変える箇所全部にcap_colourを追加しないといけんかったよな」
さくら「ほぇ~」
泉「こういう風に『それぞれのオブジェクトが、内部処理は公開せずに、入力と出力だけ公開すればよい』という手法が、オブジェクト指向の方法のひとつ、『カプセル化』だね」キュッキュ
亜子「ちょいちょい!」
泉「?どうしたの」
亜子「今の、オブジェクト指向の説明やなかったんか!?前触れもなく知らん言葉出てきた!」
泉「最初に言ったように、オブジェクト指向っていうのはプログラミングするときの考え方なの。
だから、『オブジェクト指向で作られたプログラム』って言ったときは、『オブジェクト指向を実現できるような、いくつかの技術や手法が取り入れられています』ってことなんだ。
本当は考え方そのものがオブジェクト指向なんだけど、そのための技術や手法のことをオブジェクト指向って言うことが多いから、そのうちの一つを説明したの」
亜子「ほお……、そういうことやったんか」
さくら「『オブジェクト指向』って言葉自体は考え方のことなんだ!
あっ!そういえば『思考』って付いて……あれ?」
泉「勘違いしやすいけど、オブジェクト『指向』だね。『オブジェクトという概念に基づいた』って意味になるのかな。……まあ、『思考』でもそんなに意味は変わらないかもね」
亜子「カプセル化はオブジェクト指向の方法の一つって言うてたけど、他は?」
泉「『継承』、『ポリモーフィズム』、そして『カプセル化』。この三つがオブジェクト指向でまとめられる三つの技術だよ」
さくら「その二つはどういう意味なの?」
泉「うーん……。
『継承』は複数の親クラスからそれと同じ内部構造を持つ子クラスを複製するシステム、
『ポリモーフィズム』は操作の対象が何であれ、同じ関数を使えること、って感じなんだけど」
亜子「すまんいずみ、よくわからん」
泉「だよね」
泉「でもね、オブジェクト指向の基本は、プログラムをオブジェクト同士の関係というかたちで表現するってことだから、私はオブジェクト指向の本質は『カプセル化』の一つだけだと思ってる」
さくら「カプセル化はプログラムを物で表現しているってことなの?」
泉「オブジェクトはデータを受け取ってデータを返すんだけど、誰から受け取るかとかどこに渡すのかまで決めちゃうと、決められた場所でしか使えないし、どっちかに変更が加えられたときにもう片方も変えなきゃいけなくて大変だよね。
だから、『とにかく数字が来たらこう変換する、出力はこういう文字列』みたいな形だけ決めるの。その文字列を誰が受け取るのか、どうするかはまた別の受け取る方のオブジェクトが考えればいい。
この『入力と出力だけ決まっている』っていうのが現実の物っぽいんだよね」
さくら「そうなの?」
泉「現実世界で喩えると、テレビのこのボタンを押すと電源が点くけど、本当は内部で複雑な動作が行われているはず。でも、内部で何が起こっているかはわからないけれど、ボタンを押せばテレビが勝手に電源を点けてくれる。これって『ボタンを押す』という入力と『電源が点く』という出力だけ公開されたプログラムみたいだよね」
亜子「ふむふむ、ボタンを押すのはアタシでもさくらでも、テレビの中身は変わらんし、結果は同じになる。これってテレビというオブジェクトが中身を公開せずに『ボタンを押す』という入力だけ公開してくれてるからやな。さっき言ってたカプセル化やな」
泉「『内部処理をカプセルに入れて隠しちゃえ』ってことだね」
さくら「なるほどぉ」
さくら「でも……」
泉・亜子「?」
さくら「わたしはプロデューサーさんに頭を撫でられたらムズムズしちゃうけど、二人からだったら嫌じゃないけどなぁ」
泉「も、もう、なんか照れるよ」
亜子「……今から三人でなんか食べ行こか」
さくら「うん!」
終わりです
>>12の「複数の」は衍字です
あと途中で出てきたプログラミング言語っぽいのはC言語っぽい架空のプログラミング言語ということでお願いします
話の進行上さくらには構造体を知っててもらいましたが実際の中学のプログラミング教育は論理的な考え方を理解するといったものでコードを書いたりはしなかったはず
乱文にお付きあいいただきありがとうございました
このSSまとめへのコメント
今夜セックスしたいですか?ここに私を書いてください: https://ujeb.se/KehtPl