このセッションでは Pharo のオブジェクトモデルを見ましょう。
外観から、そのエレガントさとシンプルさを 見てみます。
今はまだ全てを理解する必要はありません。
続く数週でこれらの概念を見ていきます。
Pharo にはオブジェクトとメッセージ しかありません。
オブジェクトがたくさんあり
マウスポインタや真偽値や配列や
数値や文字列やウィンドウやスクロールバー 等々を表現します。
コンパイラーでさえ
ソケットやフォントやコレクションのような システムのオブジェクトであっても
これらは皆、オブジェクトで
それらにメッセージを送ることができます。
沢山の異なるメッセージがあります。
コレクションに size を送って その大きさを得ることができます。
+ や at:put: や do: などの メッセージがあります。
オブジェクトとメッセージ。
メッセージはプログラマーの意図を示します。
オブジェクトにメッセージを送るというのは そのオブジェクトに何かをするように頼むことです。
オブジェクトへの依頼なのです。
そしてオブジェクトがどのメソッドを使うかを 決定します。
こうして どんな方法を用いるかを決めることで
プログラマの意図を達成します。
次の概念はクロージャです。
レキシカルクロージャやブロックという
Pharo でのある種の匿名メソッドです。
我々はブロックと呼びます。 これは重要な用語です。
ここにある通り ブロックは角括弧で区切られています。
これ全体が1つのブロックです。
これを匿名メソッドとして見てください。
Pharo での とてもシンプルで統一的なモデルです。
全てのものはオブジェクトであり クラスのインスタンスであり
クラスやメッセージさえもオブジェクトで
そしてオブジェクト間の全ての計算は メッセージ送信を介して行われます。
メッセージを送るという言い方が
正しい用語です。 メソッドの実行ではありません。
なぜなら メッセージをオブジェクトに送ると
メソッド探索と呼ばれるアルゴリズムがあり
そのアルゴリズムが
使うべき正しいメソッドを選択します。
メソッドは仮想的に束縛されています。
それらは遅延束縛をします。
私がオブジェクトにメッセージを送り
メソッド探索が正しいメソッドを選択する。
あとでこの話題のためのセッションがあるので その時にまたお話します。
Pharo のオブジェクトモデルは次の通りです。
インスタンス変数は protected です。
全てのオブジェクトはインスタンス変数を持ち インスタンス変数は protected です。
インスタンス変数はオブジェクト単位でprivateで
サブクラスからアクセス可能です。
メソッドは public で virtual です。
Pharo では全てのメソッドは public です。
そして Pharo はクラス間に単一継承があります。
1 つのクラスは 1 つのスーパークラスを持っています。
ここにコード例があります。 2 点間の外積(cross product)です。
point1 と point2 があり
point1 の x と point2 の y を掛けます。
そしてそこから
point1 の y と point2 の x の積 を引きます。
Pharo でできる計算の例です。
オブジェクトを生成するには 特別なメッセージがあります。
ここに例があります。
「@」メッセージを 整数 10 に
引数 20 をつけて送ると
点を生成します。 Point クラスのインスタンスです。
メッセージの名前は @ です。
そのメッセージを受け取る整数は 10 です。
メッセージ名の前にあるものです。
そして引数はメッセージ名の後にあります。 20 です。
ここにもう 1 つ例があります。
ここにあるような文字列を 作りたいとします。
この文字列はどうやって得られるのでしょう？
最初の部分「Pharo」があり
それに「,」メッセージを送ります。
引数として文字列「is Cool」を
ここで与えます。いいですか？
「,」メッセージの意味は文字列の連結です。
2 つの文字列が繋げられて 1 つの文字列を生成します。
new メッセージで直接
オブジェクトを作ることができます。
Monster クラスに new を送ると そのクラスのインスタンスが得られます。
「aMonster」と表記します。
Array（配列）クラスのインスタンスを
new: メッセージで作ることができます。
引数がくることを「:」が表しています。
そしてここに整数 6 がきます。
すると大きさ 6 の配列が得られます。
オブジェクトを生成する専用のメッセージがあり
クラスに自分のメッセージを定義することができます。
Tomagoshi クラスに
withHunger: メソッドを定義できます。
そしてこのメソッドに整数 10 を与えます。
これで Tomagoshi クラスのインスタンスを
属性値付きで生成できます。
オブジェクト生成に特化したメッセージです。
この講義では、Pharo のオブジェクトモデルの 外観を見てきました。
全てを理解する必要はありません。 これらの概念はまた後でやります。
しかし Pharo にはコンストラクターや
静的（static）メソッドや 型宣言やインターフェイスや
パッケージ、private、protected修飾子がない ということを覚えておくことは重要です。
他のオブジェクト指向言語でよくある こういった古典的な修飾子はないのです。
パラメトリックな型やボクシングや アンボクシングなどもありません。
そして、Pharo が本当に強力な言語だと いうことがわかるでしょう。
つまり、Pharo では 全てのものがオブジェクトなのです。
計算はオブジェクトに送られた メッセージによって実行されます。
メソッドは遅延束縛されます。
メソッド探索というアルゴリズムがあり
オブジェクトがメッセージを受け取った時に 正しいメソッドを選択します。
ブロックという概念があります。 匿名メソッドです。
Pharo ではとても重要なものです。
そして、クラスに特定のメッセージを 送ることによって
オブジェクトを生成します。