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

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



episode: 001

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



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

Scala の隘路

Scala でプログラムを作成していると、オブジェクト指向の原則から外れる場面に遭遇します。その問題点を示すために、名前だけを持つ単純なクラス Person について考えます。

scala> // クラスを定義する

scala> case class Person(var name: String = "John Doe")
defined class Person

scala> // インスタンスを生成する

scala> val p = new Person
p: Person = Person(John Doe)

scala> // インスタンス変数にアクセスする

scala> p.name = "Albert Einstein"

scala> println(p.name)
Albert Einstein
コンストラクターインスタンスを生成する

クラスそのものは「オブジェクト」として扱えません。そのため、インスタンスを生成するときには、オブジェクト指向の原則から外れる、new に先導(扇動?)される特別な構文規則が必要です。クラスが一人前のオブジェクト(first-class object)なら、たとえば

stalk> val p = Person new  // in a courteous manner

としたいところです。これなら「Person にメッセージ new を送る」という、オブジェクト指向の原則に適います。

□ setter メソッド:属性に値を設定する

setter メソッドについて、前述したコードの断片は、

scala> p.name_=("Albert Einstein")  // setName("...")

の代用表現と見なされるので、オブジェクト指向の原則に適います。これを Smalltalk 擬で表現すると、

stalk> p name: 'Albert Einstein'

これなら「p にメッセージ name: を送る」という、オブジェクト指向の原則に適います。

□ getter メソッド:属性の値を獲得する

getter メソッドについて、前述したコードの断片は、たとえば

stalk> p name println

としたいところです。これなら「p にメッセージ name を送るとオブジェクトが得られるので、そのオブジェクトにメッセージ println を送る」という、オブジェクト指向の原則に適います。

オブジェクト指向の原則」から外れる、Scala の構文規則に纏わる煩わしさから解放され、Smalltalk では、単一の概念モデルに沿ってコードを記述できます。

 ↑ TOP

*Created: 1989/01/29|Last updated: 2013/03/25 19:21:26