閑話 −僕と契約して魔法少女に・・・ その1−

魔法少女インキュベーターと責任関係

始まりは@ryoasai74 氏の

ということで、魔法少女とインキュベータ―との契約関係、ちょっと考えてみました。

魔法少女クラスと魔女クラスと

「さて、君たちは僕たちインキュベーターとの契約によって魔法少女となり、そしてやがて魔女となりこの世界に厄災を振りまくことになるんだけれども、うん、君はこの運命をどうモデル化するつもりなんだい。」
「えぇっ?!えっと、魔法少女がいて、それから魔女もいるんだよね。こ、こうかな?」

「うん、悪くない。最初にしてはね。{incomplete}とあるのは君のように魔法少女でも魔女でもない、いわば普通の人もいるってことだね。」
「うん」
「じゃあ、オブジェクト図で書くと次のようになるね。」

「そうだけど。」
「うん、悪くない、悪くないよ。でもね、例えば美樹さやか、彼女は魔女になる前は魔法少女だったわけだし、さらにその前はただの人だったわけだよね。そういった、人から魔法少女、さらには魔女への変化、その経過をうまく表現できるかい?」
「う〜ん、それはちょっと難しいかも。魔法少女クラスだったさやかちゃんが魔女クラスにかわるんだよね。属してるクラスを変えればいいのかな?どうすればいいんだろう」
「属してるクラスを変化させる。それももちろんあり得るひとつの解答だね。僕もよく知らないけれども、そういう風に動的にクラスを変化させることをサポートしている言語もあるようだよ。」
「でも・・正解、じゃないんだね。」
「いや、正解、不正解でとらえられる問題ではないんだ。そもそもモデリングには正解や不正解はない、そこにあるのはより良いかより悪いかなんだ。」
「じゃあ、あまり良くない?」
「何に価値を置くのか、その価値観を決めないとモデルの善し悪しは言えないよ。それはさておき、こういった状況をモデルとしてあらわすには、Stateパターンを適応してみるというのが一つの手だね。」

魔法少女は状態か?

「Stateパターン?」
「そう、Stateパターン。GoFデザインパターンで示されているうちの一つさ。このパターンでは"状態"をクラスと表現する」
「どういうこと?」
魔法少女であること、魔女であることを"状態"としてとらえる。そして、ある少女がその状態を保持することで彼女が魔法少女であること、魔女であることを表現する。」
「それって、ソウルジェムのこと?」
「いいところに目を付けたね。もちろん満点というわけではないけれども。でもまず、ソウルジェムに注目してモデルを作ってみよう。」

「図2の様なオブジェクト図は描けるかい?」
「うん、やってみる。」

「いいじゃないか。これだと美樹さやかの魔女化は彼女が所持しているジェムをソウルジェムからグリーフシードへ持ち替えることによって表現できそうだ。」
「うん、そう、なんだけど・・・えっと、その、これはなんだかちょっとちがうかなって」
「そうかい。」
「例えばね、杏子ちゃんもそれからほむらちゃんもそれぞれ自分のソウルジェムを持ってるでしょ。二人の持ってるソウルジェムは違うものだよね。」
「もちろんそうさ」
「だけど魔法少女としての共通の使命、つまり魔女を倒すってことだけど、それはうまく表現できていないのかなって。もちろんソウルジェムを持ってるんだから二人とも魔法少女だってことはわかるんだけど」
「うん、実はね、図3と図4で示したモデル、これらは正確にはStateパターンとは言えないんだ。だけど、僕はここでその正確さを追求していくつもりはないよ。なぜなら、もっとしっくりとくる表現があると思うからさ。」
「それは、何、なの?」
「"契約"さ。」

つづく・・・かも

閑話 −僕と契約して魔法少女に・・・ その2−

僕と契約して魔法少女

「さて、君はソウルジェムの本質、それがなんだかわかるかい?」
ソウルジェムの本質・・・魔法の、魔力の源、かな。」
「確かにソウルジェム魔法少女に特別な力を、魔法を与えてくれる。でもね、それは本質とは言えない。その本質はね、"契約"なんだ。」
「契約・・・」
「僕はね、魔法少女、彼女たちの願いをかなえ、そして彼女たちは魔法少女となり魔女と戦うことを誓う。この契約が形として現れているのがソウルジェムなんだ。いわば契約書だね。重要なのはソウルジェムそのもの自体じゃない、契約なんだ。」
「そんな。」
「そしてね、魔女、これも契約として表現できる。さらに言わせてもらうと、今の僕と君の関係、これも契約としてとらえることができるんだ。」
「えっ?でも、私そんな契約した覚えなんか・・・」
「確かにね。でも、君はこうやって僕の姿を見て話をすることができるだろ。これもいわば、魔法少女見習いとしての契約にあると言えるんじゃないのかい。そう考えると、今の状況はこういう風にあらわすことができるね。」

「わかるかい。見習い、魔法少女、魔女とあるのは実際は契約の種類をあらわしている。それらを汎化させた契約クラスを導入してクラス図をかいてみよう。」

契約と契約種別

「図6のモデルでは、見習い、魔法少女それから魔女、それら契約の種類をクラスとしてあらわされているだろ。」
「うん。そうだね。」
「そういった契約の種類、これをクラスではなく、インスタンスとしてあらわすことの方が都合のいい場合もある。例えば、これまでにどういった契約をおこなってきたのか、その記録を取っておきたいような場合なんかには特にね。」
「えっ?」
「こういうとき僕たちは良く、パワータイプという概念を導入する。いいかい、見習い、魔法少女、魔女、これらは"契約"の種類だ。そこで、それら種類をインスタンスとするクラス"契約種別"を導入する。この"契約種別"が"契約"のパワータイプとなるんだ。」

「そして契約種別を導入したモデルは、こうなるね。」

「あなたの言っていること、ついていけない。」
例示は理解の試金石、だよ。ともかくオブジェクト図を描いてみるといい。まあ、ここは代わりに僕が示してあげよう。」

「ねえ。魔法少女が、その、魔女に変わってしまったりだとか、そんなのもあらわすことができるの?」
「もちろんだよ。でもその前に、契約の構造について少し詳しくモデルリングする必要がありそうだ。」

続く・・・かもしれない



追記

契約の構造について少し考えてみると、やっぱり魔法少女の契約は他とは違った構造を持ってそうです。かなえられるべき「少女の願い」が伴っていたりだとか。とすると、パワータイプを使った図8のモデルはちょっと先走りすぎで、図6のモデルにとどめるべきなのかもしれません。このあたり考えがまとまったら、続きかいてみたいと思います。

第3章 観測と測定 その6 −観測−

 病院などで受ける検査には、身長、体重、ピークフロー値など量で測れる定量的なもの(測定と呼ばれています)以外に、血液型などA,B,O,AB等のようにカテゴリに分けられるものがあります。そこで、図3.7では「カテゴリ観測」という型を新たに考え、さらに量で測れる「測定」と新たな「カテゴリ観測」とのスーパタイプとして「観測」を導入しています。


 医者の行う診療プロセス、例えば患者の過剰な喉の渇き、体重の減少、頻尿といった症状から糖尿病という診断を行うといったプロセスは、図3.8のように「観測」の間の根拠と診断というリンクで表すことができます。

 上記の糖尿病と診断を下した診療プロセスを記録したオブジェクト図を図3.8.aに示します。


 「カテゴリ観測」が実際にの取りうる「カテゴリ」は、その観測の「現象型」に依存して決まります。例えば血液型という現象型のカテゴリ観測はA,B,O,ABというカテゴリを持ちますし、体重変化という現象型のカテゴリ観測は増加、減少、変化無しというカテゴリを持ちます。この様な「現象型」とそのカテゴリ観測がとりうる「カテゴリ」との関係を知識レベルのルールとして記述したのが図3.9となります。ここでは「カテゴリ」を「現象」と名前を変えてありますね。


 では、例題とそのオブジェクト図を示しておきます。

例1 ある人の血液型がAであることは、血液型Aの減少を持ったカテゴリ観測によって示される。血液型Aの減少は血液型という現象型にリンクしている。

例2 車のオイルレベルが下がっていることを車のカテゴリ観測としてモデル化できる。このときの現象型はオイルレベルで、とりえる現象は、過剰、適正、不足である。観測は車を不足の現象にリンクする。


 図3.9は次回に回します。

閑話 −責任関係の統合モデル−

 ちょっと第2章の責任関係にもどって、そこで構築されたモデルを統合してみました。統合したからといって何かいいことがあるのかって言われると、とくにはないのですが、各図を機械的に(Odel記法の図から)置き換えるのよりは少しは頭を使うこともあり、何か気付くこともあるかなと。1つ気づいたのは「責任関係」に関連づけられている「業務範囲」が図2.9中の「作業」を拡張したものになっているってところですね。

 クラスが多く複雑そうに見えますが、操作レベル(ピンクで示されたクラス群)の「パーティ」と「責任関係」、知識レベル(水色で示されたクラス群)の「パーティ型」と「責任関係型」からなる"四角形"が全体的なモデルの構造を決定してますのでそこに注目するとよいです。なお、知識レベルにおける、「責任関係型」およびそのサブクラスに対する制約の記述は省略しています。

第3章 観測と測定 その5 − 測定 −

 入院などをすると様々な検査を受けることになります。身長、体重、血糖値、血圧値、などなど。そういった測定の量を人クラスの属性として持たせると、人クラスは非常に大きく複雑なものとなりかねません。そこで、測定する項目をオブジェクトとしてみなし、人クラスから外部に取り出してやります。測定オブジェクトには、それがどのような種類の測定なのかを示す現象型のオブジェクトと、測定結果を占める量とをリンクさせます。(図3.6)

 破線下側の操作レベルには日々変化する概念を置く、ということで、データベースなどに記録されるデータとなる部分に相当するのでしょう。破線上側の知識レベルはそれらのデータに意味を与える役割をもちます。次節以降、特に知識レベルにおいて、このモデルを次第に育てて行きます。

では、例とそのオブジェクト図をば。

例1 John Smithは身長6フィートである。このことはJohn Smithという人と、身長という現象型と、6フィートという量からなる測定で表現される。

例2 John Smithのピークフロー値(どれだけの空気をどれだけ早く肺から吐き出せるか)は180リッター/分である。このことはJohn Smithという人と、ピークフロー値という現象型と、180リッター/分という量からなる測定で表現される。

例3 あるコンクリートの試材がインチ四方当たり4000ポンドで示される郷土をもっている。ここでは人の代わりにコンクリート試材が、強度という現象型と、インチ四方当たり4000ポンドという量からなる測定で表現される。

第3章 観測と測定 その4 − 複合単位 −

 単位には基本となる原子単位とそれらを組み合わせた(掛け合わせた)複合単位があります。例えばSI単位系であれば長さの単位 m、質量の単位 kg、時間の単位 s、電流の単位 Aなどが原子単位(基本単位っていいます)に相当し、加速度の単位 m/s^2や電荷量の単位C(=As)は複合単位(組立単位っていいます)に相当します。

図3.4では、原子単位とそのベキを組み合わせた単位参照を定義し、それをいくつか持たせることによって複合単位を表現しています。

例1 150平方ヤードは150という数と2乗というベキを持ったフィートへの単位参照を持つ複合単位の量として表現される。

この例だけだと分かりにくいかと思いますので、加速度の単位m/s^2がどのように表現されるかを示しておきます。


図3.5では、単位参照オブジェクトを無くし、複合単位に必要なだけ原子単位を持たせることにより、複合単位を表現しています。

原子単位側についている関連端名の正、逆というのは、正のベキの単位(正単位)なのか逆ベキノ単位(逆単位)なのかを示しています。また、関連端の制約 not uniqueというのは、原子単位のコレクションが重複を許す集合(Bag)になっていることを示しています。たぶん、例を見たほうが早い。

例2 重力による加速度は、9.81という数と、正単位のメートルと、逆単位の秒からなる複合単位として表現される。


秒は-2乗となるので、逆単位として2つの秒オブジェクト(s)が複合単位の加速度m/s^2オブジェクトに関連付けられています。

第3章 観測と測定 その3 − 換算率 −

 1フィート = 304.8 ミリメートル(googleで出ました)のように同じ次元をもつ単位同士であれば、適切な換算率をかけてやることで(大概の場合は)単位の変換を行うことができます。図3.3では、そのような単位換算を行うために、単位間を換算率オブジェクトで結んでやります。この換算率オブジェクトには単位変換用の操作が与えられます。

フィートからインチ、インチからフィートへの単位の変換の様子をオブジェクト図に示します。

例1 フィートからインチへ12という換算率を定義することで、インチとフィートの間の変換が可能になる。

例2 インチからミリメートルへ25.4という換算率を定義することで、インチとミリメートルの変換が可能になる。さらにフィートからインチへの換算率と組み合わせて、フィートからミリメートルへの変換が可能になる。