Scratchにおける機能の抽象化
オブジェクトを変数に代入できない(第一級オブジェクトではない)
これは事実だが、オブジェクトに一意なIDを振ることはできる。
そのIDは変数に入れることができる。
メッセージを送る際に宛先変数にIDを入れることで「個別のオブジェクトに対するメッセージ送信」に相当する処理をできる。
Scratchはテキスト言語です(たとえば、言語設定をアラビア語に変えると読めなくなる)。ブロックを組み立てるのはパーズを飛ばして構文木を作っているのと同じです。パラダイムは並行分散イベント駆動インスタンスベースオブジェクト指向型言語なので、同系統であれば論理型や関数型よりも近いです。 Scratchにおける抽象化はオブジェクト(スプライト)にまとめることですが、継承も移譲もないのでちょっと特殊です。目に付くのは機能抽象で「もし端に着いたら、跳ね返る」が最たる例です。つまり、高機能のライブラリを最初から組み込んでいるので、問題領域に対して抽象的な記述ができるわけです。
自分で機能の抽象化を行う方法としては、ブロック定義とメッセージがあり、前者はプロシージャを書くのと同じです(関数ではない)。後者は、ブロードキャストを使って、GoFのオブザーバーパターン(送信者と受信者の関係が1:n)と同じことを実現できます。これでポリモフィズムを活かして書くとScratchらしいコードになります。
Scratchが他のオブジェクト指向型言語と異なるのは、オブジェクト間の結合が極端に疎なことです。オブジェクトを変数に代入できない(第一級オブジェクトではない)ので、オブジェクト間の関係を静的に記述できません。これがScratchの最大のチャレンジです。このアイデアはStarLogoからきています。