オブジェクト指向ってこういうこと?(1) 基本

オブジェクト指向の勉強始めてから半年、本格的にJava漬けされて2週間。

下記の通り、特にJava漬けされてから本格的に煮詰まってましたが、

なんとなく把握できた・・・気がするので、脳内整理。
実際に、文章に整理してみます。

まだ間違ってるかもしれませんが。

長文になりつつあるので、分割します。


(1) オブジェクト指向の超基本

具象例の設定

実際世界の「オブジェクト」を例としてみます *1

オブジェクトは「テレビ」と「リモコン」の2つ。 *2

オブジェクトの中身概要

例えばテレビオブジェクトは、「電源ON/OFF」「チャンネル設定」「現在のチャンネル」「音量」などなどのプロパティ、「変数」を持っている。

class Television
{
    private $power = false;
(略)

Javaだったら型が要る(笑)

class Television
{
    private boolen power = false;
(略)


変数は、基本privateにしておいて必ずsetter/getterを作る。
理屈は、とりあえず「なんとなくわかったような*3
───”作法だ””コーディング規約だ”とでも、思っておく(ぉ)
 そのうち腑に落ちるかもしれない。


そして、「リモコンの赤外線通信を受信して処理する」「チャンネルを変える」などの関数がある(詳細略)

リモコンでテレビのチャンネルを変更するプログラム(仮名TVChangeChannel.php)概要

TVChangeChannel.phpでは、作成したTelevisionとRemote_Controllerのクラスファイルをinclude_onceしておく。
適宜、requireでもinclude_onceでもrequre_onceでもOK。*4

そしてテレビのオブジェクトを生成(インスタンス化)する。リモコンのインスタンス作らない理由は後述。

    $television = new Television;

そして、リモコンの「チャンネル」ボタンを押す
この場合は、固定で「チャンネル1」を押すことにします。

    $command = Remote_Controller::channel1();

Remote_Controller::channel1();は、static関数。
リモコンは、ボタンを押されたら赤外線を発しますが、発信してお終い、リモコンの状況は変わらないので。

だから、インスタンス作成も不要。
(厳密に言えば、電池がちょっとw減るでしょうが、
電池を減らすのは$remote_controllerの内部処理。この「電池消費」関数は・・・たぶん非static)


返り値の$commandは、テレビに送信するべき赤外線化情報。
これをテレビに送信(テレビオブジェクトの関数コール)

    $television->remoteControle($command);

$television->remoteControle()は、非static。
内部で「電源は供給されているか」「電源はONか」など判断して、$televisionオブジェクトの「現在のチャンネル」プロパティ変更、受信電波変更・表示などの処理を行なう。

*1:「テレビとリモコン」なのは、PHP5学習で、一番まとまっててお世話になってるほでなすPHPさん http://www.shigeweb.jp/php/project_p/?section=php5oop の影響受けてます

*2:一瞬、「リモコンを押す人」とか考えそうになりましたが、リモコンは誰(何)が操作しても変わらないもの。認証不要(笑)なので「操作者」というオブジェクトは使いません。

*3:この言葉がでるのは”実はわかってない”場合の方が多い。

*4:ただ、負荷的に、__autoload対応する時にワザがあるようです。詳細後述。 参考URL http://blog.apecell.com/2007/10/22/id/19 http://www.ecoop.net/memo/2007-03-16-1.html