2013年03月16日

「オブジェクト指向プログラム入門(第2版)」第6章を読んだ。

「5章 事例研究 ビリヤードゲーム」これまた、事例研究と言う事で実際のコードを示しながらの解説となるのだが、欄外に「本来はこうするべきだが、勉強が進んでからそういうのは教えるね」みたいな事が書いてあるから、細かい部分を突っ込むのは無しと言う事だね。

問題はコードが Objective Pascal のみと言う事だが、細かい事は気にしないことにしよう。コードの意味が分れば問題無い(でも、一番説明が少なかった言語を使うというのは、気遣いなんだろうか、単にこの章を担当した人の都合なんだろうか)。

1節はビリヤードゲームの解説というか動きのルール解説。

2節はビリヤードゲームに登場するオブジェクトを分類して、それぞれのオブジェクトに必要な実装を行う。
 ここで、分けられたのは、壁と穴とボールとなる。それぞれカプセル化して、オブジェクトの状態と、ボール(ボール自身も含む)の移動と接触の判断、接触したときの動作の定義を行って居る(具体的なコードの解釈については省略)。

3節はメインプログラムについて。
 オブジェクト自体を定義して初期化をしても、その動作(と言うか時間)を進める必要があるわけで、これを進めるためのループを行い、それぞれのオブジェクトのコマを進めるのがメインプログラムの仕事である。
 ここでは単純にループを行って居るが、マシンの性能によって動作のスピードが異なるので、本来はタイマーを使って制御すべきである。

4節は次章で詳しく説明する継承の事について先触れとして解説している。
 ここでは、壁と穴とボールを一つの描画オブジェクトからの継承クラスとして定義する方法と利点を書いて居るが、この継承クラスにする利点はこの本自身が述べるように、一つのリンクリストで全てのオブジェクトをまとめる事が出来る点にある。
 要は、3節のメインプログラムを始めとして、種類の異なるオブジェクトに対する処理をより大きな括りで一括処理するように綺麗にまとめる事が出来ると言うことである。
 これって継承のメリットと言うよりは、多態性のメリットと呼ぶべきものである(その前提としての継承クラス化があるわけで、継承のメリットとも言えるわけではあるが)そのあたりを詳しく解説するのは、もう少し先と言う事で。

ここではエッセンスだけ書いて居るけれど、全コードは付録B(でも、やっぱりObjective Pascal のコードのみ)を参照。まあ、これを元に、C#なりJavaで書き直して、もう少し機能を付けたり見栄えを良くしたりするのは楽しそうだね。

何か久しぶりに読んだけれど、まだまだ先は長いな。章末の問題などを読むと判るが、これは教科書であって自習書ではないのだと思う。どっかの情報処理学科のゼミなり講義で使うのがよさそうだなと思った。
posted by ゆるきま at 22:00| Comment(0) | 勉強

2013年02月05日

「オブジェクト指向プログラム入門(第2版)」第5章を読んだ。

「5章 事例研究 エイトクイーンパズル」この参考書の売りである、実際の事例を挙げ説明すると言う最初の事例。

 チェスのパズルゲームで、角と飛車の両方の動きをするクイーンを、お互いの手筋から外して8個配置すると言うパズル。コンピューターでパズルを解くと言うと、最初の一歩として有名で、効率を考えなければ割に簡単に解ける。

1節は、解くための方針と言うか解き方の解説というか、そういうもの。個々のコマ(クイーン)をオブジェクトとして、オブジェクト自身に解かせると言う方針でいくそうな。


2節は、具体的に持つべき情報とメソッドについて、疑似言語を使って説明している。

 これは、解き方にも関係するのだが、同一の行、列にはコマを置く事が出来ないのであるから、列を固定すると、その列の中には1つしかコマを置く事が出来ない。

 列をコマの種類を表す物として、行を移動させる変数と考えれば、各列のコマの行位置と言う形でオブジェクトを表すことが出来る。したがって、Row, column これに、すぐ左のコマの列を表す neighbor も変数値として掲げられている、これはコマ自身のオブジェクトポインタで、nullの時は一番左端(1列目で隣が居ない)と判断する。

 メソッドとしては、初期化、攻撃可能判定、正解判定 の2つになる。

 正解判定(左側にある全てのコマから攻撃不能で有るかを判断)では、判定とともに自身の行位置を移動すると言う働きを持たせる(全行チェックしたら、左となりのコマに次の正解位置を探る様にして、自身は初期状態である行=1に戻る)。

 初期状態(全列とも1)から始めて、一番右端が正解判定(左側全部のコマから攻撃できない位置にある)なら、プリント。

 なんかオブジェクトの連携と言うよりは、見方を変えると再入処理の練習の様な気もする。まあ、個々のオブジェクトが連携している形式に作っているのでそうなんだろう。

3節からは各言語での実装例となる。

・Object Pascal (Delphi) コマのオブジェクトを8個生成して、判定起動させると言う処理を行う部分が具体的に書かれて居る。オブジェクト自身が前のオブジェクトのポインタを持つと言う構造なので、このメイン処理自身は、最後に作ったオブジェクトのポインタだけを持っており、このオブジェクトに対してのみメッセージを送ると、解が判るという仕組み。
 2章では省略していたが、コマのオブジェクト内の print メソッドの実装も行う(各オブジェクトの行の値を出力して、neighbor のprintメソッドを起動するだけだが)。

・C++ 基本的にObject Pascal の時と同じ様な内容。const の説明って必要かな?

・Java 同じ様な話を書くのが気が引けたのか、printメソッドを図形表示させる様に変更しているけど、蛇足だと思う。

・Objective-C コマのオブジェクト内の neighbor の型を id で定義して、一番左側のコマの neighbor に 見張り番としての別オブジェクトポインタを設定すると言う手法を紹介している。
 Objective-C 独自の手法の様に書かれて居るが、全てのクラスを Object から継承するようにすれば、同様の手法が採れると思うが、もう少し何かあるのかな。

・SmallTalk Objective-C と同様の手法を採っているが、何せ独特な言語のためプログラムコードの解説にページを取っているという感じ。


 色々と書いたけれど、具体的にオブジェクトを使っての解法例としては判りやすかった。
 しかし、各種の言語にわたって書いてあるのは親切だけれど、全ての言語で同等のやり方と説明をして、各言語での比較をしやすい様にした方が良いのではなかろうか。言語を絞って不要な部分を読み飛ばそうと思っても、前の言語での解説が前提になっている部分が多すぎるので読む方としては効率が悪い。
posted by ゆるきま at 23:10| Comment(0) | 勉強

2013年01月29日

「オブジェクト指向プログラム入門(第2版)」第4章を読んだ。

「第4章 メッセージとインスタンスの初期化」と言う事で、まんまのタイトルなのだが、要らんことを書きすぎているような気がする。教科書的な本として読んでいるのだが、予備知識が必要なのかな。

1節は、オブジェクトに対するメッセージの受け渡しについて、様は関数(手続きも)の呼び出し方だと思うのだが、オブジェクト指向の説明的にはメッセージのやりとりと言う事になるから、こういう言い方になるのかな。

C++ の this変数を説明した後、Javaとの違いはポインタではなくオブジェクトを表だけですで済ませるのはちょっと乱暴なような。

ちょこっとだけ調べたところ、次の様な事らしい。
C++ は アロー演算子を使って、this->suit() となるところを 
Javaだとドット演算子を使って this.suit() となる。

C++ はオブジェクト変数もオブジェクトポインタ変数も使えるので、ちょっとややこしくなるが、
オブジェクト変数として定義する場合と、ポインタ変数として定義する場合の違いはこんな感じ。

クラス名を classA 、メソッドを methodA() として、
classA x = new classA ; x.methodA() ;
classA *x = new classA ; x->methodA() ;

2節は基本的にメモリの話しで、変数名として実行時に自動的に変数領域が割り当て・解放がされる領域と、その時に応じて動的に割り当て・解放が行われる領域があると言う話。どっちかって言うと、言語仕様的な話しだとは思う。

C/C++みたいな言語の場合は、オブジェクト指向とは関係なく必須な知識ではあるし、Java に代表されるガベージコレクションを持つ言語の場合、動的な割り当てか自動的な割り当てかは、動作効率的な視点を除いて必要無い知識ではあると思う。


3節は生成と初期化(コンストラクタ)の話し。各言語について説明しているが、唐突に複素数クラス(complex クラス) を引っ張り出されるのはなんだかなと思ったり。
C++の Trace クラスについては、あまり見たことのない様なインスタンス生成構文なので、かえって混乱しないかな(少なくとも俺は、こんなん出来たっけかと思った)。

Javaのクラス名文字列を使ってクラスのインスタンス生成する方法みたいな、ネタ的知識はコラム欄を作ってやって欲しいような。

Objective-Cの場合は訳が悪いのかな、工場メソッドと生産メソッドとインスタンスメソッドって、全部同列で説明文章が書かれて居るのが間違いのような、だいたい生産メソッドって、どっから来たんだよ。ネットで調べたらクラスメソッドの事らしい。

Object Pascalの場合(と言いつつ、Delphi の説明が半分だったりするし)に関しては、もう Object Pascalは要らない子なんじゃないかみたいな気分になってくる。

SmallTalkの場合は、クラスオブジェクトとクラスメソッドの事については18章で説明すると書かれて居るが、先に18章を軽く眺めても該当箇所が見つからなかったりする。ちなみに、用語解説だと、クラスメソッドはC++で言うところのスタティック宣言されたメソッドと書かれて居るし、クラスオブジェクトは工場オブジェクトと同義と書かれて居るし、何が何やら。

posted by ゆるきま at 23:59| Comment(0) | 勉強