他の記事にコメントを書いたのですが、せっかくなので加筆・修正して記事にしておきます。
運動会のプログラム
私が生まれて初めて「プログラム」という言葉を知ったのは、小学校の運動会のときに配られた紙の「プログラム」でした。
何がどの順番で行われるかが書いてある紙です。
1. 開会のあいさつ・・・校長先生
2. 選手宣誓・・・・・・6年3組 山田太郎君
3. ムカデ競争・・・・・4年生
4. 徒競走・・・・・・・2年生
5. 騎馬戦・・・・・・・6年生
:
:
プログラム = program = pro-gram = pro(前に、先に、予め)-gram(書く) = 事前に書いたもの
(telegram=離れたところに書く=電報、diagram=点を結んで書く=図、grammar=書(文)を知る=文法)
テレビのプログラムも事前(放送前)に書かれたもので、いつどこで何がどの順番で放送(実行)されるかが書いてあります。
コンピュータのプログラムも同じで、必要になったときに実行できるように予め書いておくもので、何をどの順番で実行するかを書いておきます。
コンピュータの手続き型プログラム
コンピュータの「手続き型プログラム」では、運動会のプログラムに書いてあるように「何をどの順番で実行するのか」に重点を置いて処理手順を書きます。
コンピュータのCPUは命令を順番に処理するのが得意ですから、コンピュータにも適しています。
開会のあいさつをする(校長先生が, みなさんに);
選手宣誓をする(6年3組の山田太郎君が, みなさんに);
ムカデ競争をする(4年生が);
徒競走をする(2年生が);
騎馬戦をする(6年生が);
:
:
運動会のプログラムは、見た人が分かりやすいように書かれていて、ひとりの人が全体を把握できる分量です。
手続き型プログラムも、見る人(メンテナンスする人)のことを考えて、ひとりの人が全体の流れと内容を把握できる分量にするといいでしょう。
実際の運動会の進行(実行)
実際の運動会の現場には、運動会のプログラムを進行(実行)する実行委員がいて**、進行役・進行係を務めます。
実行委員は、放送係に場内アナウンスをお願いしたり、学校代表である校長先生、生徒代表である山田太郎君、学年担当者である各学年担当者に指示(命令)を出しながら、プログラムを進行(実行)していきます。
つまり、実行委員(進行役・進行係)という役目・役割・係を持った担当者が、他の役目・役割・係を持った担当者に行動するよう指示を出していたわけです。
どのように行動する・対応する・振る舞うかは各担当者にまかせて、進行係は進行具合に応じて指示を出すことに専念**します。
プログラムに書いてあることは簡単に見えても、実際の進行(実行)には多くの関係者の協力が必要です。
実生活の中のオブジェクト指向
運動会だけでなく、学校で部活や行事、会社で仕事やイベントをするときにも、小さな仕事は自分一人で処理して終わらせてしまいますが、大きな仕事をするときには他者の協力が必要だと思います。そんなとき、どんな仕事があって、誰ができるか、誰にしてもらうか、誰としてもらうかを考えて仕事を分担しますよね。分担をお願いしたらやり方は任せます。割り振られた担当者も一人で仕事するのが大変なら、サブ担当者や関係者に仕事を割り振って協力・協調しながら責任・責務を果たしてくれることでしょう。
コンピュータのオブジェクト指向プログラム
コンピュータの「オブジェクト指向プログラム」も実際の運動会を進行するときのように、「どんな役目・役割・係があるのか、誰がするのか、誰とするのか」に重点を置いて書いたプログラムといえます。
役目・役割・係を「クラス」または「インタフェース」として定義し、仕事に応じた振る舞い方を「メソッド」に定義します。個別に行動できる担当者を「インスタンス」として生成し、仕事依頼者の口から発した指示・命令(メッセージ)が担当者の耳に届いて適切な「メソッド」が選ばれ、仕事が振る舞われます。
プログラム内容は手続き型プログラムと同じですが、物事の捉え方、扱い方が人間行動的になっています。
学校代表者 は 校長先生; // 校長先生の都合が悪くなったら副校長先生が代役
生徒代表者 は 6年3組の山田太郎君; // 体調不良なら5年2組山田花子さんが代役
学校代表者さん.話してください(みなさんに, 開会の挨拶を);
生徒代表者さん.話してください(みなさんに, 選手宣誓を);
4年生のみなさん.競技してください(ムカデ競争を);
2年生のみなさん.競技してください(徒競走を);
6年生のみなさん.競技してください(騎馬戦を);
:
:
「誰か」は人に限らず、「学校代表者」のような役目・役割・係といった概念的な名称で扱うことができます。
漫画やアニメの世界で「あんぱん」や「うんち」に目鼻口耳手足がついて擬人化され、しゃべったり動いたりしますが、そんな風にいろいろなモノに役を演じて(仕事を振る舞って)もらうこともできます。
ただし、明確かつシンプルな責任・責務・係を与えるようにします。
オブジェクト指向プログラムの書き方、読み方
オブジェクト指向言語は英語圏で生まれて英文法的に書ける/読めるので、英語圏の人はすんなり理解できて、主語を省略するのに慣れている日本人は理解するのが苦手なのかもしれませんね。
文型 | 文型(日本語) | 意味 |
---|---|---|
S+V | 主語+動詞 | 誰かが、何かする |
S+V+C | 主語+動詞+主格補語 | 誰かが、なる、何かに |
S+V+O | 主語+動詞+目的語 | 誰かが、何かする、何かに/を |
S+V+O+O | 主語+動詞+間接目的語+直接目的語 | 誰かが、何かする、誰かに、何かを |
S+V+O+C | 主語+動詞+目的語+目的格補語 | 誰かが、何かする、誰かを、何かに |
C++言語、C#言語、Java言語などでは、主語を省略することができて、そのときは自分(this
)が仕事することになります。
英語で主語を省略すると命令形になって相手にさせることになるのですが、これらのプログラム言語では英文法とは異なっています。
python言語では主語を省略すると標準ライブラリやグローバル関数呼び出しになるので、英語と同じく他者への命令になります。
私は「こんなことしてくれる奴がいてくれたら便利なんだけどな~」と考えて、まだ存在してない奴をいるものとしてプログラムを書いたあと、その便利な奴になりきって責務を果たすようにクラス定義します。
そのときには「○○君」と擬人化して呼べる名称を付けるようにしています。
もちろん、ちゃんとしたプログラムは要件定義や設計してからプログラムを書きますけどね。
クラスとインスタンス
クラスとインスタンスの違いも、英単語と合わせて整理しておきましょう。
「猫」と言われて頭の中に何が思い浮かびますか? 自宅で飼っている実物の猫?
「猫とは何ですか?」と言われて他の人と共通する認識があると思います。それが概念、クラスです。
一匹一匹の実物・実体がインスタンスです。
英語 | 日本語 | 概念か実体か | クラスかインスタンスか |
---|---|---|---|
cat | (ペットの)猫(に関すること) | 概念 | クラス |
cats | (ペットの)猫全般 | 概念 | クラス |
a cat | (不特定の)とある猫 | 実体 | インスタンス |
the cat | (特定された)その猫 | 実体 | インスタンス |
the cats | (特定された)その猫たち | 実体 | インスタンス |
I like cat.
猫に関することが好き。猫哲学者?猫博士?食べるのが好き?
I like cats.
猫全般が好き。猫好き。
I like the cat.
その猫が好き。他の猫は眼中にない。
「猫」という言葉・概念は、実物を見たあとに作られたものです。
あそこに4本足の動物(インスタンス)がいる、ここにも4本足の動物(インスタンス)がいる、あっちにも(インスタンス)、こっちにも(インスタンス)。ひとつひとつに名前を付けて呼ぶのは大変だから、特徴が共通のこれらの動物をグループ化、クラス化、抽象化して「猫」と呼ぶことにしよう。
「猫」クラスには「性別」属性があるけれど、「オス」か「メス」かはインスタンスを特定しないと分からない。
コンピュータのプログラムでも、同じ形式のデータを抽出してクラス化します。
「氏名、電話番号、住所」のデータが沢山あるので、これを「連絡先」と呼ぶことにしよう。連絡先を複数管理できる「電話帳」も作ろう。
「電話帳」から電話をかけるには、どの電話帳のどの連絡先かを選んでインスタンスを特定すれば電話番号がわかるので、あとは電話をかけられる人にお願いすればいい。