« 連載: Smalltalk use: better《7》プロッククロージャー★ | トップページ | 連載: Smalltalk use: better《9》基本要素の意義:変数とは★ »

2006年5月17日 (水)

連載: Smalltalk use: better《8》基本要素の意義:リテラルとは★

キーワード ◆ BlockContext・Character・Float・LargePositiveInteger・SmallInteger・static メソッド・String・Symbol・コンストラクター・シンボル・ブロック・リテラル・空白文字・実数・整数・配列・不定長整数・文字・文字列

※ PDF でご覧になるなら ⇒ 「piyo60517.pdf」をダウンロード

------------ 序 ------------

大工と話すときは
大工の言葉を使わなければならない

Socrates (469?-399 B.C.)

◆ オブジェクト指向のルーツをたどると、キリスト生誕のはるか以前まで遡ることができます。オブジェクト指向の概念をソフトウェア開発に適用する試みは、まだ30年余りの歴史でしかありません。「旧(ふる)きを温(たず)ねて新しきを知る」。オブジェクト指向のルーツをたどると、オブジェクト指向の未来が見えてきます。

◆ ところで、オブジェクトのルーツをたどると、そこにリテラルの存在意義を知ることができます。クラスと話すときにはクラスが理解できるメッセージを使って、インスタンスと話すときにはインスタンスが理解できるメッセージを使って、それぞれ対話を図る必要があります。

------------ 本文 ------------

リテラルとは ◆ いくつかのリテラルを紹介しました。復習を兼ねて列挙すると、次のようになります。

3 class                    "SmallInteger"
3 sqrt class                    "Float"
13 factorial class                    "LargePositiveInteger"
3 printString class                    "String"
$C class                    "Character"
#factorial class                    "Symbol"
[3 factorial] class                    "BlockContext"

  1. 整数 … SmallInteger
  2. 実数 … Float
  3. 不定長整数 … LargePositiveInteger
  4. 文字列 … String
  5. 文字 … Character
  6. シンボル … Symbol
  7. ブロック … BlockContext

これ以外にも、まだ紹介していないリテラルが存在します。リテラルについて再考する前に、次の問題を考えてみてください。

◆「オブジェクトにメッセージを送ると、オブジェクトが得られる」というのが、オブジェクト指向の原則のひとつでした。では、そのメッセージを送るべき最初のオブジェクトは、どのようにして得られるのでしょう。

60517a_2◆ この例では、オブジェクト 3 にメッセージ factorial を送ると、オブジェクト 6 が得られます。では、そのもとになるオブジェクト 3 を得るには、どうしたらいいのでしょう。オブジェクト 3 も、何かオブジェクトにメッセージを送って得られたはずです。さらに、そのもとになるオブジェクトを得るには。どうやら、何か根本となるメカニズムが必要になりそうです。

◆ そこで必須となるのが、リテラルの存在です。なぜなら、メッセージを送らなくても得られるオブジェクトが存在しないなら、何事も始まらないからです。`3 ` と表記すると、文字どおり 3 という値を持つ整数オブジェクトの実体を表します。`$C` と表記すると、文字どおりの表記を持つ文字オブジェクトの実体を表します。さらに、ブロック [3 factorial] というのは、文字どおりの表記を持つメソッドオブジェクトの実体を表します。そのため、ブロックは、アルゴリズム定数とも呼ばれます。

◆ 空白を含む文字列およびシンボルは、次のように記述します。

| s t |
s := #'hello world'.                    "#'hello world'"
s at: 6.                    "$ "
t := 'hello world'.                    "'hello world'"
(s at: 6) == (t at: 6).                    "true"

◆ # に続けて ' で囲まれた文字列の中に空白を記述すると、空白を含むシンボルが得られます。すると、6番目の文字は空白 `$ ` となることが分ります。しかし、これを記述したコードで目視するのは困難です。

$  asciiValue          "32"
Character value: 32          "$ "

60517b ◆ 空白文字を表すリテラル `$ ` に、メッセージ asciiValue を送ると、そのアスキーコードを表す数値 32 が得られます。クラス Character に、メッセージ value: 32 を送ると、そのコードが表す空白文字 `$ ` が得られます。クラスもオブジェクトなので、これにメッセージを送ることは、自然な対話です。

 Java/C# におけるコンストラクターや static メソッドなど、モデルを複雑にするだけの構文要素は不要です。そこには「オブジェクトにメッセージを送ると、オブジェクトが得られる」という、統一されたモデルが存在するだけです。

Character space asciiValue          "32"
(#'A C' at: 2) == Character space          "true"

60517c◆ クラス Character に、メッセージ space を送ると、空白文字が得られます。シンボル #'A C' の2番目の文字が、この空白文字であることが分ります。

| s |
s := #'A C' asArray.          "#($A $  $C)"
s collect: [:c | c asciiValue].          "#(65 32 67)"

60517d 配列 ◆ まだ紹介していないリテラルのひとつが配列です。空白を含むシンボル #'A C' に、メッセージ asArray を送ると、文字を要素とする配列 #($A $  $C) が得られます。# に続けて () で囲まれた中に任意のリテラル(ただし、ブロックを除く)を記述すると、これらを要素とする配列オブジェクトが得られます。

Refactoring: Improving the Design of Existing Code (Addison-Wesley Object Technology Series) Book Refactoring: Improving the Design of Existing Code (Addison-Wesley Object Technology Series)

著者:Martin Fowler,Kent Beck,John Brant,William Opdyke,Don Roberts
販売元:Addison-Wesley Pub (Sd)
Amazon.co.jpで詳細を確認する


リファクタリング―プログラムの体質改善テクニック Book リファクタリング―プログラムの体質改善テクニック

著者:マーチン ファウラー
販売元:ピアソンエデュケーション
Amazon.co.jpで詳細を確認する


【参考文献】Martin Fowler, 1999
Refactoring: Improving the Design of Existing Code  ISBN0201485672

Refactoring の功労者でもある、Martin Fowler さんのルーツは、Smalltalk にあった。イディオムの宝庫です。

==================================
真樹育未 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

|

« 連載: Smalltalk use: better《7》プロッククロージャー★ | トップページ | 連載: Smalltalk use: better《9》基本要素の意義:変数とは★ »

Squeak/Smalltalk」カテゴリの記事

.連載: Smalltalk use: better」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《8》基本要素の意義:リテラルとは★:

« 連載: Smalltalk use: better《7》プロッククロージャー★ | トップページ | 連載: Smalltalk use: better《9》基本要素の意義:変数とは★ »