[SML 7549] Re: 第7回Smalltalk勉強会@京都
AOKI Atsushi
atsushi @ cc.kyoto-su.ac.jp
2009年 5月 16日 (土) 16:36:09 JST
青木@上賀茂です。
Smalltalk勉強会@京都はレベルが高いですね!喜ばしいことです。
市田さんからの質問への応答には、レガシィソフトウェア問題を話
さなければなりません。
Smalltalkに名前空間が導入された際、古いSmalltalkerたちによっ
て記されたプログラムコードを無駄にしないように配慮した経緯が
あるのです。(この私も古くからのSmalltalkerの1人ですから。)
たとえば、OrderedCollectionという名に束縛されたクラスを得よう
としたとき、昔は次の一言で済みました。(1)
OrderedCollection
今はSmalltalkという名前空間の下階層をきちんと列挙して書くこと
が推奨されています。(2)
Core.OrderedCollection
もしくは、もっと正式に書くのも良いでしょう。(3)
Root.Smalltalk.Core.OrderedCollection
上記を誤解を恐れずにまとめますと、次のようになります。
(1) オラが村のOrderedCollectionさん
(2) Core市のOrderedCollectionさん(←推奨形式;Smalltalk府以上を省略)
(3) Root国Smalltalk府Core市のOrderedCollectionさん
ここで、古いSmalltalkerたちによって記されたプログラムコードに
は、オラが村の…さん、オラさ村の…さん、ばかりが出現している
わけです。
で、このオラが村の…さんを許容するために、名前空間移入の必要
に迫られたわけです。いわゆるレガシィソフトウェア問題。
それまで、リリースされていたクラスたちは、以下の名前空間へと
再配置されました。Core、Kernel、OS、External、Graphics、UI、
Toolsなどは、昔のカテゴリ名をご存知の方々には、どんなクラスた
ちが囲い込まれてのかが想像できると思います。
Root.Smalltalk.Core.*
Root.Smalltalk.Kernel.*
Root.Smalltalk.OS.*
Root.Smalltalk.External.*
Root.Smalltalk.Graphics.*
Root.Smalltalk.UI.*
Root.Smalltalk.Tools.*
Root.Smalltalk.CraftedSmalltalk.*
Root.Smalltalk.Database.*
Root.Smalltalk.Lens.*
Root.Smalltalk.XProgramming.SUnit.*
上記の名前空間に限って、オラが村の…さんを許そうじゃないか、
ということですね。そうすれば、レガシィプログラムコードの中の
OrderedCollectionをすべてCore.OrderedCollectionに書き改める
必要がなくなりますので。
実はこれに「じゅん for Smalltalk」も乗っかっちゃったわけです。
(Jun.JunOpenGL3dObjectの推奨形式に書き換えるのが面倒で…。)
(Jun.Jun…となるのも格好悪いし…。)
どうやって乗っかるのか、これから禁じ手のプログラムを開示しま
す。このメーリングリストに開示することではないのかもしれませ
んが、禁じ手を勉強することはためになります。やってはいけない
ことをやるからこそ、やってはいけないことがわかりますもん。:-)
GeneralNameSpaceImportというクラスのインスタンスを作って、
Smalltalkという名前空間にインポートしているのです。
たとえば、GeneralNameSpaceImportのインスタンスは、次のように
して作成します。
GeneralNameSpaceImport path: #('Jun' '*')
これは、Junという名前空間の下の階層のすべてを運び入れること
を表現したオブジェクトとなります。
そして、次に示すように、Smalltalkという名前空間へ一気に移入
を行います。
Smalltalk addImport: (GeneralNameSpaceImport path: #('Jun' '*'))
これにより「じゅん for Smalltalk」はレガシィプログラムコード
の仲間入りを果たします。次のメッセージ式の応答の末尾をご覧く
ださい。
Smalltalk importString
==> '
Core.*
Kernel.*
OS.*
External.*
Graphics.*
UI.*
Tools.*
CraftedSmalltalk.*
XProgramming.SUnit.*
Database.*
Lens.*
Jun.*
'
上述したGeneralNameSpaceImportはBindingReferenceのサブクラス
でして、クラス名でクラスを動的束縛する仕掛けの一種でもあるの
です。
Object
| GeneralBindingReference
| | BindingReference ←こいつの
| | | ChangeSupportClassProxy
| | | NameSpaceImport
| | | | GeneralNameSpaceImport ←ここ
| | | | SpecificNameSpaceImport
| | | QualifiedName
| | LiteralBindingReference
| | StrictBindingReference
以上になります。明解となりましたでしょうか?市田さん。ある意
味で最内スコープ束縛方式をやぶる禁じ手ですので、通常はやって
はいけませんよ。:-)
------------------------------------------------------------
AOKI Atsushi http://www.cc.kyoto-su.ac.jp/~atsushi/
SML メーリングリストの案内