« 連載: Smalltalk use: better《22》誰が制御するのかな★★ | トップページ | 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★ »

2006年8月16日 (水)

連載: Smalltalk use: better《23》何を制御するのかな★

キーワード ◆ do:・inject:into:・カプセル化・隠蔽・属性値

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

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

◆ 以前に紹介した、因数分解のメタファーを使って、新たな展開を示します。たとえば、次の有理式を因数分解してください。
 a2+b2
この問題を実数の範囲で解決しようとすると、これ以上の因数分解はできないという結論になります。
 a2+b2 = (a+bi)(a-bi)
しかし、これを虚数の範囲までモデルの適用範囲を拡げると、その問題解決の可能性が広がります。◆

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

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

60816a ◆ do: を使って、総和を求めます。変数 s には、総和を求めたい数列を与えます。変数 sum は、総和を保持します。ブロック引数 e に、数列の各要素(1 から 5 までの整数)を順に与えます。数列に対してメッセージを送ると、ブロック式を`必要な`回数だけ評価します。

60816cdo: は、各要素に対して、ブロック式を評価します。メッセージの受信者は処理すべき対象を提供します。メッセージの送信者は、どのような処理が必要かを知っていますが、何を処理すればいいのかを知りません。これは、何を処理したいか(what)と、どのように処理したいか(how)という情報を、それぞれが役割分担をして管理することを意味します。

◆ 1 から 5 までの総和を求めるという処理を実現するには、総和を保持する変数 sum だけが必要になります。変数 s は、処理の対象を束縛しますが、変数そのものは必須ではありません。この変数は`便宜的に`導入したもので、それがなくても支障はありません。

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

◆ こうして、問題解決に必要な実引数 5 を統合することに成功しました。Smap を見ると、外部の実引数 5 が、内部の属性値 5 となり、必要な情報がオブジェクト内部にカプセル化されたのが分かります。

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

s := 1 to: 5.
sum := s inject: 0 into: [:acc :e |
    acc + e].
Transcript show: sum
------------------------------ Transcript --
15

60816b ◆ inject:into: を使って、総和を求めます。変数 s には、総和を求めたい数列を与えます。変数 sum は、総和を保持します。ブロック引数 acc は、ブロック式を評価した結果を保持します。ブロック引数 e に、数列の各要素(1 から 5 までの整数)を順に与えます。数列に対してメッセージを送ると、ブロック式を`必要な`回数だけ評価します。

60816dinject:into: は、各要素に対して、ブロック式を評価します。メッセージの受信者は処理すべき対象と初期値を提供します。メッセージの送信者は、どのような処理が必要かを知っていますが、何を処理すればいいのかを知りません。これは、何を処理したいか(what)と、どのように処理したいか(how)という情報を、それぞれが役割分担をして管理することを意味します。

◆ 1 から 5 までの総和を求めるという処理を実現するのに、変数は必要ありません。変数 s は、処理の対象を束縛しますが、変数そのものは必須ではありません。同様に、変数 sum は、総和を保持しますが、これも必須ではありません。これらの変数は`便宜的に`導入したもので、それがなくても支障はありません。

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

◆ こうして、問題解決に不要な変数を排除することに成功しました。Smap を見ると、外部の変数 sum および e が、内部のブロック引数 acc および e となり、不必要な情報が内部に隠蔽されたのが分かります。総和を求めるには、acc + e という本質的な処理だけを記述すればいいことになります。

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

|

« 連載: Smalltalk use: better《22》誰が制御するのかな★★ | トップページ | 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


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

« 連載: Smalltalk use: better《22》誰が制御するのかな★★ | トップページ | 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★ »