Smalltalk use: better; episode: #001c ”メタプログラミングへの道”

前の記事記事一覧次の記事
Smalltalk use: better;



episode: 001

メタプログラミングへの道



目標に向かって一段ずつ階段を上っていく上で
いちばん肝心なことは
必ず最初の一段を上るということである
そしてまた次に一段上るということである
Hideo Itokawa - Wikipedia

□ クラスを定義するメソッドの存在意義

ときに、子供が誕生したら、出生届を役所に提出します。それには、子供の姓名などを両親の情報とともに記載します。新たなクラスを定義するときも、これと同様です。というのも、次のように

役所
	defineClass: #子供
	superclass: #親
	indexedType: #none
	private: false
	instanceVariableNames: '子供の情報'
	classInstanceVariableNames: ''
	imports: ''
	category: ''

Smalltalk が出生届を提出する役所なら、defineClass: は子供の名前、superclass: は親の情報に相当するからです。

出生届が受諾されたら、その子供は一人前の存在として扱われます。同様に、クラス定義が受諾 accept されたら、そのクラスは一人前のオブジェクト first-class object として扱われます。真のオブジェクト指向プログラミングの世界では、クラスは「だだの型紙ではなく」その実体を伴うのです。

出生届だけが特別な扱いを受ける書類ではありません。たとえば、住民票の転出届・転入届など、他の書類との間に本質的な違いはありません。同様に、クラスやメソッドを定義するのも、たとえば、インスタンスを生成したり、メソッドを呼び出したり、他のコードとの間に本質的な違いはないのです。

真のオブジェクト指向プログラミングの世界では、オブジェクト指向の原則である「オブジェクトにメッセージを送る」に従うだけです。その原則は例外なく、クラスやメソッドを定義するときにも適用されます。

■ メソッドを定義する:メタプログラミング

メソッドを定義するために利用者(プログラマー)が行った操作を、プログラムで再現します。まず、インスタンス変数の値を獲得するための、メソッド name を定義します。

ワークスペースにページを追加する

次の作業に進む前に、ワークスペースに新たなページを追加します。

メニューから[ページ→新規]を選択します。すると、新たなページ[2 ページ]が追加されます。

インスタンスメソッドを定義する

新たなページ[2 ページ]に、次のコードの断片を入力します。

Person2 compile: '
name
	^name
' classified: #accessing

インスタンスメソッドを定義するには、メソッド ClassDescription>>compile:classified: を利用します。

  • compile: 定義したいメソッドのコードの断片を、文字列で指定します
  • classified: そのメソッドを定めるプロトコルの名前をシンボルで指定します

ここで、メッセージを受信するのは、クラス Person2 です。つまり、クラスオブジェクトに対して「あなたのインスタンスメソッドを定義したい」というメッセージを伝えます。

すると、ツールを利用したときと同様に、プロトコル accessing には、メソッド name が定義されます。そこには、compile: の引数に指定したのと同じコードの断片を確認できます。同様に、

Person2 compile: '
name: anObject
	name := anObject
' classified: #accessing

インスタンス変数に値を設定するための、メソッド name: を定義します。

 ↑ TOP

*Created: 1989/01/29|Last updated: 2013/03/27 19:57:30