« 連載: Smalltalk use: better《21》文字列と数列は何が違うの(3)★★ | トップページ | 連載: Smalltalk use: better《23》何を制御するのかな★ »

2006年8月15日 (火)

連載: Smalltalk use: better《22》誰が制御するのかな★★

キーワード ◆ timesRepeat:・to:do:・ブロック式・カウンター・隠蔽・受信者・総和・送信者

※ PDF でご覧になるなら ⇒ 公開日まで、お待ちください。

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

◆ クリーンエネルギーとして着目されるもののひとつに、燃料電池があります。水の電気分解と対極にある(1)2H2 + 02 → 2H20 は、水素と酸素とが結合して水ができるという「酸化還元反応」と見なせます。(2)HCl + NaOH → NaCl + H20 は、酸化還元反応でしょうか。(3)H2 + Cl2 → 2HCl は、どうでしょう。まだ(2)などは、酸素原子が現れるので、腑に落ちない思いを残しつつも、これが(3)になると、酸素原子が現れないのに「酸化というのは納得がいかない」という人がいるかもしれません。狭義の「酸化」の定義では、酸素と化合(化学結合)するからこそ「酸化」なのですが、広義の「酸化」の定義ではその限りではありません。つまり、より広範な概念モデルへと拡張されたのです。

◆ Java/C# などで、条件分岐による制御構造を表す if 文さえも、純粋なオブジェクト指向の世界では`メッセージ`として表現できることを、すでに学びました。今回は、for 文に象徴されるような、反復を表す制御構造さえも`メッセージ`として表現できることを学びます。つまり、制御構造について、より広範な概念モデルへと拡張します。

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

sum := 0.
e := 1.
5 timesRepeat: [
    sum := sum + e.
    e := e + 1].
Transcript show: sum
-------------------------------- Transcript --
15

60815atimesRepeat: を使って、総和を求めます。変数 sum は、総和を保持します。変数 e に、初期値 1 を与えます。指定された 5 回だけ、処理を繰り返します。5 に対してメッセージを送ると、ブロック式を`特定の`回数だけ評価します。処理を繰り返すたびに、変数 e の値が1つずつ増加します。

60815c ◆ timesRepeat: は、指定した回数だけ、ブロック式を評価します。このとき、処理を何回繰り返すかは、メッセージの受信者が決定します。一方、具体的な処理は、メッセージの送信者が提供します。受信者は、どのような処理が必要かは知りませんが、それを何回繰り返せばいいかを知っています。送信者は、どのような処理が必要かを知っていますが、それを何回繰り返せばいいかは知りません。これは、繰り返し処理をしたい内容と、何回繰り返すかという情報を、それぞれが役割分担をして管理することを意味します。

◆ 1 から 5 までの総和を求めるという処理を実現するには、総和を保持する変数 sum と、カウンターを管理する変数 e とが必要になります。

◆ 変数 sum に、初期値 0 を与え、これに変数 e の値を加えていきます。変数 e に、初期値 1 を与え、処理を繰り返すたびに、値が1つずつ増加します。これらの処理を何回繰り返すかは、受信者である 5 が決定します。すると、sum の値は (1,3,6,10,15) と変化して、e の値は (1,2,3,4,5) と変化します。そして、1 から 5 までの総和として、15 が求まります。

◆ ここで問題となるのは、2つの変数 sum と e とを用意して、これらを管理するという作業が必要になることです。何かうまい方法はないものでしょうか。◆

sum := 0.
1 to: 5 do: [:e |
    sum := sum + e].
Transcript show: sum
-------------------------------- Transcript --
15

60815bto:do: を使って、総和を求めます。変数 sum は、総和を保持します。ブロック引数 e に、1 から 5 までの整数を順に与え、処理を繰り返します。1 に対してメッセージを送ると、ブロック式を`特定の`回数だけ評価します。

60815d ◆ to:do: は、指定した範囲の数に対して、ブロック式を評価します。このとき、処理を何回繰り返すかは、メッセージの受信者と送信者とが協議して決定します。受信者は開始時の条件を、送信者は終了時の条件を提供します。送信者は、どのような処理が必要かを知っていますが、それを何回繰り返せばいいかは知りません。これは、繰り返し処理をしたい内容と、何回繰り返すかという情報を、それぞれが役割分担をして管理することを意味します。

◆ 1 から 5 までの総和を求めるという処理を実現するには、総和を保持する変数 sum だけが必要になります。カウンターを管理する変数は必要ありません。

◆ 変数 sum に、初期値 0 を与え、これにブロック引数 e の値を加えていきます。処理を繰り返すたびに、e には、1 から 5 までの値が順に与えられます。すると、sum の値は (1,3,6,10,15) と変化して、e の値は (1,2,3,4,5) と変化します。そして、1 から 5 までの総和として、15 が求まります。

◆ こうして、問題解決に不要な変数 e を排除することに成功しました。Smap を見ると、外部の変数 e が、内部のブロック引数 e となり、不必要な情報が内部に隠蔽されたのが分かります。

◆ まだ問題となるのは、変数 sum を用意して、これを管理するという作業が必要になることです。何かうまい方法はないものでしょうか。

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

|

« 連載: Smalltalk use: better《21》文字列と数列は何が違うの(3)★★ | トップページ | 連載: Smalltalk use: better《23》何を制御するのかな★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《22》誰が制御するのかな★★:

« 連載: Smalltalk use: better《21》文字列と数列は何が違うの(3)★★ | トップページ | 連載: Smalltalk use: better《23》何を制御するのかな★ »