vieweditattachhistoryswikistopchangessearchhelp

ロランとディアナ3

ここからの続き
本体である「あるムーンレイス('名無しのゴンベ')」はひとりしかいないことはよろしいでしょうか?--sumim - 2002-06-11, 21:55:24

理解できてると思います。<一進一退ですみませんm(_ _)m。--さ茂 - 2002-06-11, 21:58:11

一進一進です。大丈夫です。では、もうちょっと現実的な話に移りましょう。「よく使うオブジェクトは変数と関係づけしておかなければならない」というふうに申し上げましたが、これには例外があります。変数を使わずとも直接参照できるオブジェクトがあるのです。1、2、3 …などの数値や true、false、nil という本当によく使うオブジェクトはこのように記述すればそれ自身を指し示すことができるので、変数に関連づけする必要はありません。これはよろしいでしょうか? --sumim - 2002-06-11, 22:10:05

>それぞれ、True、False、UndefinedObject というクラスから生み出されたオブジェクトです。
うろ憶えですがこれは憶えていました。
数字も、一つ一つが変数だと大変ですものね(^-^;)。--さ茂 - 2002-06-11, 22:19:39

さらに今、引用していただいたクラスという特殊なオブジェクトもその名前をそのまま記述すれば参照できます。他に我々が知っているクラスは「ムーンレイス」というのがあります。厳密にはこれらはグローバル変数なのですが、数値や nil、true、false などと同様にそのまま記述できる「例外」として認識して差し支えないでしょう。--sumim - 2002-06-11, 22:23:24

これで、変数に関する説明は「ほぼ」終わりです。--sumim - 2002-06-11, 22:25:33

よろしければ、次の「クラスとインスタンス」に移らせていただきたいと思います。先の「ほぼ」の残りはこれが終わってから…になります。--sumim - 2002-06-11, 22:28:46

まだ不安が残りますが……進めてくださいm(_ _)m。--さ茂 - 2002-06-11, 22:34:40

いや、不安があれば言ってください。どんなところがしっくり来ませんか?--sumim - 2002-06-11, 22:36:47

>厳密にはこれらはグローバル変数なのですが、
これです(^-^;)。
確かにSmalltalkのインスペクタを覗くと、ターンAガンダムもムーンレイスも、ロランもディアナも……皆グローバル変数。
うーん。結局、クラスだろうがサブクラスだろうが(それらの名札であろうと)、これらはグローバル変数と憶えるしかないですね?
逆に、クラス名をそのまま使えるものにはあえて設定しない限り変数は無くていい。
(今後、グローバルでない名札を教えていただくと思います。現段階では、ということです↑)--さ茂 - 2002-06-11, 22:46:35

Smalltalk をお教えしたのは失敗でしたね。Smalltalk はグローバル変数を管理するための「仕組み」の一部なので、今のところ、忘れてください。余計なものを覗かさせてしまいました。ごめんなさい。--sumim - 2002-06-11, 22:52:09

どうしても #ロラン や #ディアナが見えない…と気持ち悪がっておられたので見えさえすれば、安心してグローバル変数へのこだわりを捨てて、オブジェクト本体へ注意を向けていただけるものと勘違いいたしました。当方の認識不足で、混乱に拍車をかけてしまったようで、申しわけありません。--sumim - 2002-06-11, 22:57:16

どうにも見えないと気になって(^-^;)。
ともかく忘れます。
今の段階では、(教材として)すべてグローバル変数で進められているということでしたよね。
ではこのまま進めていただけますか? と言いつつ続きは明日m(_ _)m。
おやすみなさい。<一方的でいつもすみませんm(_ _)m。朝6時起きがつらい年頃で……(^-^;) - 2002-06-11, 23:02:02

了解です。ひとつだけ。「すべてグローバル変数で進め」の“すべて”は今の仮想イメージの状態では「ロラン」「ディアナ」「テテス」「名札1」「名札2」「名札3」で“すべて”という認識でよろしいですね?(強いて言えば「ムーンレイス」もそうですが、これはクラス名なので「例外」扱い、ということで)--sumim

このお答えが「そうではない」ということでしたら、変数に対する誤解がまだとけていないようです。この先を読み進むのをお控えください。




さて、クラスとインスタンスです。平たく言うと、クラスは「設計図・仕様書」でインスタンスが設計図に従って創られた「物」、つまり“オブジェクト”ということになります。ここではオブジェクト=インスタンスと思っていただいて構いません。あと、いったん、ここではクラスがオブジェクトであるということを忘れてください。 インスタンスというのは「例」という意味の英単語です。オブジェクトは刺激を受けることができて、そのとき、自身の仕様書、つまりクラスに定義されたように振る舞います。

我々は「ムーンレイス」という設計図・仕様書を作りました。ここから生まれた“あるムーンレイス”とも言うべきあるオブジェクトは「ムーンレイス」に書かれた設計を持ち、「の名前は?」といった刺激に対しては仕様に従って反応します。「ムーンレイス」という設計図・仕様書に書かれていない刺激には(原則として)反応できません。

browser はオブジェクトの設計図・仕様書を見るためのツールです。「ムーンレイス」を browse-it したときは、その中身(設計・仕様)を表示しますが、“あるムーンレイス”を browse-it した場合にも、その設計・仕様が書かれた同じ「ムーンレイス」を呼び出すようになっています。これが 「ロラン」(もしくは、このグローバル変数が参照する“あるムーンレイス”)が browser に現れなかった、二つ目の理由です。--sumim


「ロラン」「ディアナ」「テテス」「名札1」(もちろん「名札2」「名札3」も含めて)のいずれを browse-it しても、これら(グローバル変数、あるいは“札”)の指し示すオブジェクトのクラスである「ムーンレイス」を browse-it したときと同じ表示の browser が現れるということでご確認いただけるはずです。--sumim - 2002-06-11, 23:42:17



おはようございます。
>「ロラン」「ディアナ」「テテス」「名札1」「名札2」「名札3」で“すべて”という認識でよろしいですね?
はい。これらが冒険であること、ローカル変数らしく「ムーンレイス」内のみで生きるロランたちを作るのは今後の課題だということは理解しているつもりです。--さ茂(出勤準備いたします。また今夜m(_ _)m) - 2002-06-12, 07:00:15

>ローカル変数らしく「ムーンレイス」内のみで生きるロランたちを作る
むぅ…。まだちょっと(かなり…(^_^;))変数にこだわっておられるようですね。変数というのはあくまで“名札”でオブジェクトを“壁”の外から扱うためにシステムに用意された“仕組み”に過ぎません。例えて言えば、本体ファイルを不可視化してある場合のエイリアスの役割りのように、です。我々は本体ファイルに触れることはできませんが、エイリアスを通じて命令を出すことができます(もちろんこの例えには厳密には嘘があります)。

別の例では、電話で人と話しているとき、受話器も声を入れれば反応が返りますが、大切なのは電話線(リンク情報や情報を伝えるための仕組み)のその先にいる人(ファイル本体、オブジェクト)であって、受話器(エイリアス、変数)ではないということです。受話器や電話線はあくまで、今は直接話すことができない人と相対するためのひとつのツール・手段にすぎません。公衆電話からでも携帯からでも、家の電話からでも、同じその“人”と話すことはできて、公衆電話や携帯や家の電話は必要とするときに手元にありさえすればよい。それぞれの電話はその“人”と直接話しているかのような錯覚を与える演出はしてくれますが、中に人が入っていると勘違いしたり、その仕組みにこだわれば、本来の目的である人とのコミュニケーションがおろそかになる危険性がある…というのが私の危惧するところです。

あと、前にもちらと申し上げましたが、オブジェクトはそれぞれ独立した情報の一形態なので、その中に別のオブジェクトが入れ子になったり、ましてや生活したりということはありません(あえてそうした性質のオブジェクトを設計しないかぎり…という但し書きが付きますが)。オブジェクトの生息する場所(私はよく海に例えます)には、オブジェクトが分け隔て無く詰め込まれている(浮遊している)イメージを持っていただけるととりあえずは無難かと。 上にも赤字で書き添えましたが、現時点ではクラスはオブジェクトではないと思っていてください。単なる設計図・仕様書、つまりただの紙切れです。--sumim
- 2002-06-12, 08:55:19

まず今までの説明や例をなぞらえると「変数らしく」というのは「名札らしく」と、「クラス内のみで生きる」というのは「設計図・仕様書内のみで生きる」というのとほぼ同義です。単なる名札にどんな“らしさ”があるのか、設計図・仕様書の中で“生きる”とはどんなイメージだろう…という違和感が私のそれに近いのですが、さ茂さんは、こうした受け取り方をどうお感じになられますか? この違和感をヒントになにか是正するためのとっかかりをつかんでいただけるとよいのですが…。(誤解なさらないようにしていただきたいのは、こうした食い違いが生じているのは私の説明不足からですので、私の責任です。問題点を浮き彫りにするために、現状でのご認識を否定したり揚げ足をとるような書きかたで恐縮ですが、どうかご気分を害されませんように…)--sumim - 2002-06-12, 09:19:04

お昼休みにAirH"で来てます。
「名札らしく」「設計図・仕様書内のみで生きる」
は、その設計図・仕様書の範疇のみで動作する名札、というニュアンスです。
どこからでも好き勝手に参照したり刺激をあたえたり『できない』、たとえるならば『ターンAガンダム人間関係ゲーム」という世界でしか存在しえないロランたち、という意味です。
ゲームを終了したら無くなる名札たちです。
今はそうではない、そういう意味だったのですが、どうでしょう?
>中に人が入っていると勘違いしたり、その仕組みにこだわれば、本来の目的である人とのコミュニケーションがおろそかになる危険性がある…
これは理解できます(^-^;)。
一番大切なのは刺激を与える相手を知ることですよね。--さ茂 - 2002-06-12, 12:35:20

AirH"、うらやましい…(^_^;)。

>ゲームを終了したら無くなる名札たち
そういうことならまったく問題ありません。失礼いたしました。オブジェクトの生息可能条件もしくはその寿命についてはおいおい説明するつもりではおります。--sumim - 2002-06-12, 12:45:54

では、クラスとインスタンス(オブジェクト)の関係について進めましょう。我々は「ムーンレイス」というクラスを定義しました(繰り返しになりますが、今はクラスをオブジェクトと思わないでください。ただの設計図・仕様書です)。ムーンレイスはどうあるべきか、をそこに記載しました。各人が「名前」「瞳の色」「好意対象」「憎悪対象」といった名札を持つこと、「の好きな人は?」という刺激に対して「好意対象」という名札の先につながっているオブジェクトを返すこと、などをです。以上は違和感なくご納得いただけるでしょうか? --sumim - 2002-06-12, 12:54:03

こんばんわ。
大丈夫、理解できていると思います。--さ茂 - 2002-06-12, 20:26:16

では、「すべてはオブジェクトに刺激を与えることで進行」「よく使うオブジェクトは変数で捕まえておく」「オブジェクトはクラスから生まれ、クラスにはそのあるべき姿が記載される」のうち、あとの2つについての説明はおしまいです。browser に“ロラン”が現れなかった理由については合点がいっていただけましたでしょうか? 残りは最初の「すべてはオブジェクトに刺激を与えることで進行」ですが、これを貫いたお陰で Squeak/Smalltalk は、あらゆる物事を同じ方法で制御・実行できるシンプルさ・普遍性を提供すると同時に、その代償として、オブジェクトの海における人間関係ならぬ“オブジェクト関係”が複雑になってしまっている…というデメリットを併せ持ちました。--sumim - 2002-06-12, 22:06:53

"ロラン"たちが見えない件は合点行きました。<と思います
ロランたち名札は、それの繋がったあるムーンレイス、そしてムーンレイスにはあずかりしらぬものだということ。
そしてブラウザはムーンレイスという設計図・仕様書を読むためのものなのでムーンレイスの知らない名札たちは最初から表示されない。
どうですか? <表現力の無さを痛感しつつm(_ _)m--さ茂 - 2002-06-12, 22:28:14

よいと思います。若干、補足させていただくならば、

>そしてブラウザはムーンレイスという設計図・仕様書を読むためのものなのでムーンレイスの知らない名札たちは最初から表示されない。
は、「そしてブラウザはムーンレイスという設計図・仕様書を読むためのものなのでムーンレイスの知らない名札たちはもちろん、その先につながっているオブジェクトについても表示されることはなく、自動的にその設計図・仕様書であるムーンレイスを表示する仕組みが働く」となります。

このまま続けても大丈夫そうですね…。次はお風呂に入る前の さ茂さんをくらくらさせてしまったところです(^_^;)。

「すべてはオブジェクトに刺激を与えることで進行」させるために、すべてをオブジェクトにする必要がありました。この場合、オブジェクトというのはインスタンスと同義ですから、オブジェクトのあるところには必ずその設計図・仕様書であるクラスの存在を意味します。例えばクラス「ムーンレイス」がオブジェクトであるためには、その設計図・仕様書であるクラス、つまり、クラスのクラスが存在しなければなりません。これをメタクラスと言います。一般に、そのオブジェクトのクラスは class とうい刺激を与えることで知ることができます。

名札1 class

なので、同様にクラス「ムーンレイス」のクラスも知ることができます。

ムーンレイス class

「ムーンレイス」もオブジェクトなら「ムーンレイス new」としたときの new もやはり刺激で、これは「ムーンレイス」の設計図・仕様書である「ムーンレイス class」に原則として定義されるべきものであることをご想像いただけると思います(実際は「ムーンレイス class」には new は定義されていません、これがなぜだかは次のテーマにゆずります)。--sumim
- 2002-06-12, 22:48:34

>(実際は「ムーンレイス class」には new はありません、これがなぜだかは次のテーマにゆずります)
こういうのに弱いのです(^-^;)。
newというのは……「+」と同じくどこでも使える刺激? --さ茂(気が早すぎてSqueak執筆環境用に念願の日立版チャンドラ(美品)をたった二万台で入手したりしました……が、どうにも重いです。やはり200MHz以上ないと快適じゃないんですね(T-T)) - 2002-06-12, 22:57:30

いや。まあ、とりあえずムーンレイスが対応すべき刺激は、ムーンレイス class に定義されるべきだということだけ認識しておいてください。new の例はまずかったかもしれませんね。

>たった二万で入手
二万は安いですね。200Mhz だと多少重いのは仕方がないですね(^_^;)。

では、browser で、ムーンレイス class にムーンレイスが対応することができる新しい刺激を定義するにはどうしたらよいでしょうか。このためのスイッチが、上の段、左から2番目の枠内にある instace と class のスイッチです。class のスイッチに切り換えると、ムーンレイス class への書き込み、instance に戻すと今まで通りムーンレイスへの書き込みになります。--sumim - 2002-06-12, 23:06:59

たち
self allInstances inspect


をムーンレイス class に定義してみてください。これで「ムーンレイス たち」を do-it することで、今、生きている“あるムーンレイス”たちの人数を知ることができます。--sumim
- 2002-06-12, 23:11:01

self #(a ムーンレイス a ムーンレイス a ムーンレイス a ムーンレイス)
all inst vars #(a ムーンレイス a ムーンレイス a ムーンレイス a ムーンレイス)
1 a ムーンレイス
2 a ムーンレイス
3 a ムーンレイス
4 a ムーンレイス
となりました。
selfはムーンレイス総体の意味で総名簿('名前'じゃなく)。
all……はわかりません。
以下の数字は個別の名札表示?
ロラン、ディアナ、テテス、あと名札1ですね?
ここで名札2、3は名札1の名札だから出てこないわけですね。--さ茂(正確には\24500で、120MHzです(T-T)。こりゃ遅い。でも最新機は買えないし中途半端なのは長く使えない。<チャンドラはバッテリーが汎用なんでこの先も安心) - 2002-06-12, 23:38:33

>とりあえずムーンレイスが対応すべき刺激は、ムーンレイス class に定義されるべきだということだけ認識しておいてください。
今気づきました(^-^;)。
「たち」という刺激は、あるムーンレイス全体への刺激ですよね?
他のインスタンス刺激はムーンレイス・あるムーンレイスの名札毎への刺激ですよね? インスタンスで設定された刺激は全て名札に繋がる名札(瞳の色等)をクラスの設計図に書いた上で個別に処理される。
「女は何人」という刺激もclassでありえるということですよね? --さ茂(明日は仙台出張なのでここらへんでおやすみなさいm(_ _)m) - 2002-06-12, 23:54:24

では、こんなのではどうでしょう。

たちの数は?
^ self allInstances size


これを定義して「ムーンレイス たちの数は?」を print-it してみてください。


>「たち」という刺激は、あるムーンレイス全体への刺激
いえ、「たち」も「たちの数は?」もあくまでオブジェクトとしての「ムーンレイス」への刺激です。反応の結果として“あるムーンレイス”たちが登場することもありますが、登場したとしても、彼らは「ムーンレイス」に与えれた「たち」や「たちの数は?」という刺激とは無関係です。

>ここで名札2、3は名札1の名札だから出てこない
たぶん、「名札3 _ 名札2 _ 名札1」からそういう風に想像されたのだと思います。が「変数 _ オブジェクト」という式は、評価の後、オブジェクトを返します。また、 _ の左辺にない限り、変数はそれが指し示すオブジェクトそのものを表わすので、「名札3 _ 名札2 _ 名札1」は「名札3にも名札2にも、名札1につながっているオブジェクトを繋げなさい…」という意味になります。(http:/myImged/3#2) ここがエイリアスとちょっと違うところで、エイリアスは自身のエイリアスを作ることはできますが(余談ですが、これは推奨されません)、名札の先に名札を繋げることはできないようになっています。名札の先は常にオブジェクトです。--sumim - 2002-06-13, 00:50:53

>selfはムーンレイス総体の意味で総名簿('名前'じゃなく)。
突然ですが、ここで新しいオブジェクトに登場していただきました。混乱させてしまったら、ごめんなさい。彼は「ムーンレイス」や“あるムーンレイス”たち、ましてや「ムーンレイス class」とは全く関係ないオブジェクトで、「ムーンレイス allInstances」を inspect-it しても同じものが得られます(というか「たち」という刺激は、これと同じことを「ムーンレイス」にさせます)。inspector のウインドウタイトルにその設計図・仕様書の名前が書いてありますので参照してください。複雑な人間関係を管理するときに彼か、彼に似た性質を持つオブジェクトに再登場願うつもりでおりますので、以後、お見知りおきを。--sumim

inspector の説明は以前したと思いますからいりませんよね? inspector はオブジェクトの状態を眺めたり、その状態に手を加えるためのツールで、ウインドウタイトルにはそのオブジェクトの設計図・仕様書の名前が、self はそれ自身、all inst vars には名札とそれにつながっているオブジェクトの一覧、それ以降は名札のリストが表示されます(名札がないときは self と all inst vars だけが表示されます)。名札をクリックすると右側の枠内に、その名札につながっているオブジェクトが表示されます(が、数値や文字列、true、false、nil のような例外を除いてたいていは「a なんとか」とだけ出ます。その詳細を知りたいときは、名札の部分をダブルクリックすることで、名札につながっているオブジェクトを改めて inspect-it できます)。念のため。--sumim - 2002-06-13, 01:21:34

おはようございます。

>あくまでオブジェクトとしての「ムーンレイス」への刺激
うーむ。
>名札の先は常にオブジェクトです。
うーむ。
>複雑な人間関係を管理するとき
うーむ。
朝からうーむの連発。

『ロラン たち』ではどうなるか?
たしかにバグりますね(^-^;)。ムーンレイスclassに作ったこの刺激はあくまでも『ムーンレイス』に対するものだということが実感できました(^-^;)。

名札の先は必ずオブジェクト、これは意外にもイメージがありませんでした。(というか、「全てがオブジェクト」という言葉が強い)やばいです。名札のイメージは、必ずオブジェクトに一本線で繋がっていて、その名札に別の名札は付かないのですね。オブジェクトはたくさんの名札をぶらさげられますが。

selfが新しいオブジェクトであることはわかりました。
でも疑問がふつふつと。
前段で、オブジェクトは名札を知らないということでまとめてきましたが、これは矛盾してませんか?
『あるムーンレイス』は知らないけれど、ムーンレイスclassは知っていると考えて良いのでしょうか?

あと、話が戻りますが、all inst varsの下段の1、2、3、4は明細でよろしいですね。クリックして確認しましたらロランたちでした。かわいそうに番号で管理されてました(^-^;)--さ茂 - 2002-06-13, 06:47:47

>ムーンレイスclassに作ったこの刺激はあくまでも『ムーンレイス』に対するもの
案ずるより産むが易し、じゃなくて、習うより慣れろ、これも違う…、百聞は一見に如かず、ですね(^_^;)。設計図・仕様書に記述された設計・仕様はあくまでそれに従って創られた物、つまりインスタンスのためのものだということです。それ以外のオブジェクトは例え、その(「ムーンレイス」)子(“あるムーンレイス”)であっても無関係です。

>selfが新しいオブジェクトであることはわかりました。
(「self という名札の先につながっているオブジェクト「ムーンレイス」や“あるムーンレイス”たちではなく新しいオブジェクトであることはわかりました」という意味でおっしゃっておられるのでしたら読み飛ばしてください→) いえ、self はあくまで偽変数です。つまり偽の名札です。なぜ偽かというと、つながっている先のオブジェクトを、名札のように適宜、我々の都合でそれを変更することができないからです。真の名札なら「名札 _ オブジェクト」でつながりを自由に作る(変更する)ことができますからね。余談ですが、true、false、nil も使い方としては(偽の)名札っぽいですが、いつも同じオブジェクトを指し示しているので名札ではなく、事実上、それ自身と考えて差し支えないわけです。これらとは異なり、self はつながっている先のオブジェクトはその局面で変わります。ここで指し示されているのは、今、inspect しているオブジェクト自身、つまり、inspector のウインドウタイトルに表示されているクラス「Array」のインスタンス(すなわち「ムーンレイス」に allInstances という刺激を与えたときに飛び出してくるオブジェクト)です。--sumim - 2002-06-13, 09:30:08

>かわいそうに番号で管理されてました(^-^;)
クラス「Array」のインスタンスは、別のオブジェクトたちを 通し番号で管理する(つなぎ止めておく)ためのオブジェクトです。図らずも“ある Array (an Array)”の本質を言い当てておられる(笑)。Array のインスタンスは、次のようにして我々も作ることができます。

Array with: 'あ' with: 'い' with: 'う'

Array with: ロラン with: ディアナ with: テテス

Array with: 123 with: ロラン with: nil


それそれを選択して inspect-it して観察してみてください。また、Array のインスタンスは size という刺激を受けて、その要素の数(自分が繋げることのできるオブジェクト(重複可)の最大数)を返す反応を示すことができます。

(Array with: 'いち' with: #two with: 3 with: ロラン) size

を print-it すると 4 が返るはずです。また、念のため括弧の中身を選択(「(」の右側か「)」の左側をダブルクリック)してから inspect-it することで、本当に4つのオブジェクトがつながっているか観察するのもよいでしょう。--sumim
- 2002-06-13, 09:39:52

>オブジェクトは名札を知らないということでまとめてきましたが、これは矛盾してませんか?
はて? ここまでどこにも名札(ロラン、ディアナ、テテス、名札1、名札2、名札3)はでてきていないようですが…(出てくるはずもありませんが…(^_^;))。出てきたのはその先につながっているオブジェクトたちです。まだちょっと“変数偏重傾向”を打破できておられないようですね…。繰り返しになりますが、大事なのはオブジェクトで名札ではありません。名札は、壁の向こう側にあるため、直接手にすることができないオブジェクトを呼び出したりつなぎ止めておくために、壁のこっち側の私たちが便宜的にこしらえた“おまけ”にすぎません。オブジェクトから見れば、壁の向こう(我々から見てこっち)に自分用のどんな名札が下げられているかは相変わらず知らずにいます。--sumim - 2002-06-13, 09:44:05

>(というか、「全てがオブジェクト」という言葉が強い)やばいです。名札のイメージ
名札も突き詰めれば(何事も心の準備無しに突き詰めるのはよくありませんが…(^_^;))オブジェクトです。安心してください。しかし、特別扱いされているので、それがオブジェクトであることを意識するのは難しいでしょう。あくまで名札、つまり他のオブジェクトを参照するためのツールという「オブジェクトとは別のもの」という認識でいるのが吉です。--sumim - 2002-06-13, 10:46:31

>self はあくまで偽変数です。
あ、前に出てきたselfと同じですね(^-^;)。またそれとも別のものだと思ってました。
>self はつながっている先のオブジェクトはその局面で変わります。
これは後々、人間や地球人を作ってから再度確認してみます。
>Array のインスタンスは size という刺激を受けて、その要素の数(自分が繋げることのできるオブジェクト(重複可)の最大数)を返す反応を示すことができます。

(Array with: 'いち' with: #two with: 3 with: '四' with:'ゴ') size 5

おぉ、出ます。ちなみに、

『#'ムーンレイス' size 6』

というイタズラをしました。6個の謎の数字が(^-^;)。これって……(^-^;)。↓a ムーンレイスじゃないんです。
>ここまでどこにも名札(ロラン、ディアナ、テテス、名札1、名札2、名札3)はでてきていないようですが
あ、そうでした。a ムーンレイスが6つでした。そういう意味で名札がなんなのかあずかりしらないということなのですね。納得。
>つまり他のオブジェクトを参照するためのツールという「オブジェクトとは別のもの」という認識でいるのが吉です。
了解しました。--さ茂 - 2002-06-13, 20:29:35

これで「すべてはオブジェクトに刺激を与えることで進行」「よく使うオブジェクトは変数で捕まえておく」「オブジェクトはクラスから生まれ、クラスにはそのあるべき姿が記載される」についてはおしまいです。次に、スーパークラス、サブクラスに行きます。 --sumim - 2002-06-13, 20:47:02

さて、ここで新しいクラス「地球人」を定義するわけですが、「ムーンレイス」と「地球人」というのは本質的にはなにも変わらないので「ムーンレイス」のときと同じ手順を踏めば、作業は終了します。これは確かにそうなのですが、いちいち同じ刺激を登録するのは面倒ですし、間違いが起こるかもしれませんよね? また「ムーンレイス」や「地球人」の仕様を変更しようとしたときにそれぞれに同じ編集を加えなければいけないのも非効率的です。--sumim - 2002-06-13, 20:54:21

そこで、両者に共通の仕様をまとめて別のクラスを作っておき、その仕様をそっくり借りるかたちで「ムーンレイス」と「地球人」というクラスを作ることができれば、上の悩みを一気に解消することができます。仮に、両者の仕様をまとめたクラスを「人間」とするならば、「人間」の仕様を変えるだけで、「ムーンレイス」も「地球人」も一気にその変更を反映させることができる…というメリットがありそうです。--sumim - 2002-06-13, 20:57:50

このように仕様や設計図を共有するクラスの間の上下関係をスーパークラス、サブクラスと呼びます。「人間」は「ムーンレイス」「地球人」のスーパークラス、「ムーンレイス」「地球人」はそれぞれ「人間」のサブクラスということになります。--sumim - 2002-06-13, 21:00:30

ではまず「人間」を定義しましょう。と…、申しましても、想定する「人間」の設計・仕様は、今の「ムーンレイス」のそれと全く同じです。なので「ムーンレイス」を「人間」に改名し、そのサブクラスとして「ムーンレイス」を改めて、そして「地球人」を新しく作ることにします。--sumim - 2002-06-13, 21:03:11

クラスの名称変更は browser の上の段の左から2番目の枠(これを browser のクラス枠と呼ぶことにします)の黄ボタンメニューから rename class ... を選択し「人間」と入力して accept します。--sumim - 2002-06-13, 21:05:13

「人間」としてはこれで十分なのですが、プログラムとしては刺激の引数に“あるムーンレイス”などとあるのはちょっとかっこわるいですね。これを修正したいのですが、いちいちチェックして直してゆくのは面倒なので、これらを一気に修正する方法はないか考えましょう。--sumim - 2002-06-13, 21:09:08

いじってみましたが……よくわかりません(^-^;)。--さ茂 - 2002-06-13, 22:23:46

class内の刺激を一括置換する機能を探してみましたがわかりません。
変数を噛ませることも考えましたが、それは無理というか無意味ですよね。
『あるムーンレイス』は刺激の中に記述されている文字列(?)にしかすぎないから……。<間違いですか?
ともかく降参ですm(_ _)m。--さ茂 - 2002-06-13, 22:26:36

いえ、具体的な方法を探していただけるとは思っていませんでした。恐縮です。「すべてがオブジェクトなんだから、クラスに刺激を与えて定義された刺激の定義内容をはき出させて、そこに'あるムーンレイス'を含む物があれば列挙する…」みたいなイメージを「すべてはオブジェクト」「すべてはオブジェクトに刺激を与えることで進行」から推測いただければ、ここまでの復習としてはいいかなぁ…程度に思っておりました。この方向で考えを進めた具体例として、次のコードをこしらえてみました。 do-it するとウインドウが開きます。修正は手動でしなければいけませんが、'あるムーンレイス'を含む刺激をピックアップしてリスト化してくれるので、効率はアップします。また、修正後、改めて do-it すると置換し忘れがないかも確認できるというおまけつきです。ひとつめの(日本語変数版)でエラーがでるときは下の方を試してみてください。修正はまだしないでください。

| 探す文字列 刺激たち | 探す文字列 _ 'あるムーンレイス'. 刺激たち _ OrderedCollection new. 人間 selectorsDo: [ :刺激名 | ((人間 sourceCodeAt: 刺激名) asString findString: 探す文字列) > 0 ifTrue: [刺激たち add: (MethodReference new setStandardClass: 人間 methodSymbol: 刺激名)]]. Smalltalk browseMessageList: 刺激たち name: 'ソースに「', 探す文字列, '」を含む刺激たち' autoSelect: 探す文字列

| str sels | str _ 'あるムーンレイス'. sels _ OrderedCollection new. 人間 selectorsDo: [ :sel | ((人間 sourceCodeAt: sel) asString findString: str) > 0 ifTrue: [sels add: (MethodReference new setStandardClass: 人間 methodSymbol: sel)]]. Smalltalk browseMessageList: sels name: 'ソースに「', str, '」を含む刺激たち' autoSelect: str

まあこんな“いかにも”な方法もあるわけですが…、ここではオブジェクトの世界から敢えて離れて、ちょっとレガシー(^_^;)な方法でちゃっちゃと片付けてしまいましょう(笑)。browser のクラス枠の黄ボタンメニューに fileOut というのがあって、これで file-in の逆、つまり、クラスの定義をファイルに書き出すことができます。人間.st というファイル名になるので File List では文字化けしてしまいますが、一番最初にある .st ファイルがそうです。これを開いて、'あるムーンレイス' を選択して 'ある人間' と一気にタイプして置き換え、あとはコマンド + J (コマンド + shift + j ) で一括置換します(心配でしたらコマンド + j でひとつひとつチェックしながら進みます)。終わったら、これを accept し、改めて file-in することで作業が完了します。--sumim
- 2002-06-13, 22:58:34

おはようございます。
>| 探す文字列 刺激たち |
これはまさにローカル変数?
こういう使い方(do-itするその時だけ使う)もありということですね。
*おさらいと言うにはちょっと高度過ぎです(^-^;)。
>一番最初にある .st ファイルがそうです。
file-in、file-outという機能も奥が深そうですが(^-^;)、昼休みにやってみます。--さ茂 - 2002-06-14, 06:45:18

>*おさらいと言うにはちょっと高度過ぎです(^-^;)。
いえ。もちろんこれを書け!理解せよ!というわけではなくて、オブジェクトに刺激を与えることで全てが行なわれ、全てを行なえる…というイメージをもっていただけるか、というあたりが「おさらい」です。 また、記述をつらつらと目で追っていただいたとき、ロランとディアナたちに出会う前よりいくぶんでも、なんとなくでよいので、オブジェクト(その素性はわからなくとも)に刺激を与える様子を感じ取っていただけているようでしたら嬉しいです。--sumim - 2002-06-14, 09:49:02

>これはまさにローカル変数?
ビンゴです。テンポラル変数とも言います。使い捨ての名札はこうして最初の行で、 | | で括って、使うことを宣言します。指定したすべての刺激を与え終えたときこの名札は自動的に破棄されます。--sumim - 2002-06-14, 09:51:50

移動しましょう。

このページを編集 (29669 bytes)


Congratulations! 以下の 2 ページから参照されています。

This page has been visited 3736 times.