ZTシステム構成図の作図方式を決定する

もう少しZTシステム構成図の入力を続けることにしよう.クラスとオブジェクトを婚姻させるという仕様に方式転換したので,修正が必要な箇所が残っている.これを点検するために,まず婚姻数をチェックしてあぶれが出ていないことを確認する.実装を持たない(抽象)クラス以外ではすべてのクラス(女性)は少なくとも結婚を1持たなくてはならない.実装を持たないクラスでは配偶者を持たない結婚枠を作り,その中に(必要なら)抽象メンバー(女性)を表示することにする.

いや,そういうことはできないと思う.クラスの単身婚の子どもはそのクラスの基本クラスでなくてはならない.従って,もしクラスの抽象メンバーを女性ノードとして表示するとすれば同じ箱の中に入れるしかない.これはやり過ぎだと思う.オブジェクト(男性)はすべていずれかのクラスに属するはずだから,本来なら必ずクラス配偶者を持つことになるが,図面が混み合ってしまう可能性があるので,別に実装がある場合にはとりあえず単身のまま残すことにする.

CARDLINKオブジェクトの場合,実装はCARDTABLE *PDBに格納されることになる.実際,CARDLINKがこれ以外の場所で生成されることはない.このカードリンクにPDBをポインタとしてアクセスするときの構文は

CARDLINK *CARD = (CARDLINK*)(*PDB)[k];

のようになっている.これはNODULEの基本機能に備わっているoperator[]によってアクセスしているものでnodule *&operator [](int x); のように定義されている.取り出される配列要素の型はnodule*なので使う側ではいちいちキャストする必要があるが,仮想的にはCARDTABLE PDBをCARDLINK*の配列とみなしてよい.

▲BASETABLE<CARDLINK, MAXPDB>の本人タブの氏名をダブルクリックして「検定続行不能エラー」が発生した.

image

処理は続行できるのでUNDOして反例サンプルを取ってみよう.いや,ダブルクリック自体はイベントとして保存されていないので現状のまま保存でよい.(ERR7)としておく.保存したあとの動作が悪い.CARDLINK::ScootParentPageで (PHASE <= INITIALSTATE) が発生して抜けられなくなってしまった.PHASE = INITIALSTATEになっている.⇒なんとか抜けてきた.多分このエラーは再現できるだろう.

▲TREEVIEW::GetViewSizeで(!_size->cx || !_size->cy) 描画領域空エラーで停止した.かなり不調だ.系図画面をクリックしても反応しない.ZTシステム構成図2.ZELを開いただけでまだ特に何もしていないと思われるのだが…ファイルを閉じるときにもTRIBEBOX:setTribeRealnodeで停止する.おかしい.どこか書き換えてしまったのだろうか?作業を中断して食事を終えて席に戻ったところなのだが…

▲ZTシステム構成図(ERR7).ZELを開こうとしてTRIBELIST::GoDownStreamで(marg && !marg->Invalid() && (!marg->margbox || !marg->margbox->ISSETTLED()))により停止,その後続行して以下を出してエラー終了.

image

「修復されました」を出した後もエラーが続き,新規カードを開いた.つまり,(ERR7).ZELは開けない.構成図2.zelは開ける.

どうも作図がかなり難しい.構成規則をもう少し厳密に定義する必要がある.

  1. +を婚姻関係,→を親子関係,【】を結婚枠とする
  2. 【クラス】→【下位クラス(基本クラス),クラス要素…】
    クラス要素とはクラス内で定義されたメンバー変数であり型名(クラス名)ではないが,女性形で表示する
  3. 【オブジェクト+オブジェクトのクラス】→【下位オブジェクト…】
  4. ただし,下位オブジェクトが描画されない場合は結婚関係を省略して【オブジェクト】を終端ノードする
  5. 下位オブジェクトがメンバーとして属するクラスがオブジェクトのクラスより下位にある場合:
    【下位オブジェクト】→【下位クラス要素】
  6. クラスにはクラス名は付けないが,クラス要素には所属:クラス名を付ける
  7. オブジェクトには所属:クラス名を付ける
  8. テンプレートクラスには肩書:テンプレート引数を付ける
  9. 要素構成木のルートcouplingはオブジェクトである
  10. オブジェクトとクラスの婚姻による子どもはオブジェクトである
  11. クラス継承木のルートはNODULEクラスである
  12. クラスないしクラス要素の親はクラスである
  13. クラスの子どもは基本クラス(長女)かないしクラス要素(次女以下)である
  14. 配列要素は配列の子どもである 配列要素と配列要素の型(クラス)の結婚によってその型の内部構成を展開できる

これで矛盾なく描画できるのではないだろうか?

▲配偶者のいない2つの結婚ページにそれぞれ子どもが1人づつ記入されているとき,登録では1ページに合併するはずだが,そのような動作になっていない.BASETABLEにARRAY<bnum>とlookupをそれぞれ登録されているが2ページのままだ.

オブジェクトPDBはオブジェクトanod[]とlookupを構成要素として持っている.これとCARDLINKをどのように結びつければよいか?BASETABLEはテンプレートクラスで引数として<CARDLINK, bnum>を渡されている.これとCARDLINKを結婚させた子どもをCARDLINKのインスタンスとすればよいのではないか?あるいは,anodとCARDLINKを結婚させてCARDLINKのインスタンスとするか?

【配列】+【クラス】→【クラス型の配列要素】

でもよいのではないか?⇒便宜的にそうしておくことにしよう.いずれにしても,CARDLINK型のオブジェクトはCARDLINKと結婚しなくてはならないのだから,配列の下位オブジェクトとして配列要素を産出し,それとCARDLINKを結婚させるというのが順当だろう.

▲おかしい.子ども並び替えパネルが出てこない.⇒別モニターに出ていた.

おそらく一番厄介なPDBとMDBのところが一応終わった.まず,クラス部分図を出してみよう.

image

孤立ノードが6つある.うち2つはBASETABLEのテンプレートのインスタンスで不用になっているので削除できるが,それら以外が孤立してしまった理由が分からない.かなり荒っぽい修正をやっているので多少の補修が生じるのはやむを得ない…残り4つはいずれもクラス木的には終端ノードなので接続は容易だが,特にCARDLINKが孤立しているのが解せない.TREEVIEWのところは接続が間違っているので後から直すことにする.TRIBEBOXも配偶者がBobjectというのは間違いだ.クラス同士の婚姻はここでは定義されていない.Bobjectと言っても男性形だ.

▲部分図から親族図に切り替えようとしてPAIRBOX::CalcPairBoxでASSERT_NEVER (nocommon) エラーになった.⇒再現できる.この状態で保存しておこう.(ERR8)とする.このファイルを開いた場合にも同じエラーが出る.

BASETABLEにならって,NLISTのテンプレートも整理しておこう.NLISTは2つの引数を持ったテンプレートクラスだが,たとえば,NLIST<SIMPLEEDGE, ‘E’> のようなクラスは独立には存在しない.

▲NLISTの母をEDGELISTに付け替えて,CARDLINK::ScootParentPageで停止した. (!OnImportEnd && !APPENDFILE && !PrimaryMergeCard && !OnDeleteCard) 同一親ページの重複を検出.

クラス木は一応図式的には整った.

image

一応すべてのノードの接続関係をチェックしておこう.クラスノードは全部で43個ある.クラスノードは基本クラスとは単身婚で接続するという規則になっている.これに反しているのは結構ありそうだ.ただし,付け替えてもクラス木のトポロジーには変化はない.⇒失敗した.途中で並び替えしてしまったのでどこまでチェックしたか分からなくなってしまった.あと少しだったのに…

▲先祖並び替えで先祖ノードを複数選択して移動できると便利なのだが…ないし,ドラッグ移動して並び替えが実行できるとさらによい.

Bobjectの主要派生クラスであるNAMEBOXが落ちている.これなら木に見えるだろう.

image

さて,要素木の方はどうなっているだろう?現状はこんな風になっている.

image

孤立カードが7点出ている.完全に孤立しているカード5点はおそらくゴミと思われる.

▲カードが削除されたとき,別のカードにジャンプする動作はあまりうれしくない.むしろ単純にその場所で再描画してもらった方がよいのだが…⇒カードが操作されたときにはトポロジーが変化するのでどうしても系統並び替えを実施する必要がある.また,再描画のときの基準点を選択されたカードに置いているため,カード操作のたびに選択カードの位置に戻ってしまう.この動作でよい場合もあるとしても,予期していない動作になる場合が多い.むしろ,基準点(不動点)をたとえば現在の画面中心位置などに置くことが考えられる.かなり大きな方式変更になる可能性があるが,編集ストレス軽減のためには必要な修正だ.

仕掛りの部分に関しては接続関係はおおむねできているようだ.いや,まだおかしな点がある.PDBが3つも親を持っている.PDBの本籍はTOPOLOGYのはずだが,linktableとnamesort+NAMESORTの子どもになっている.確かにどちらからも参照されている.参照の場合はクラス配偶者を持たないとしておこう.

▲pagesetup→treeviewとcoupling→treeviewの2つのtreeviewを合併するとtreeviewがcouplingからpagesetupに移動してしまう.couplingは基準ノードなのに消去されてしまうというのは望ましくない.この図面は一系列なので系列優先ノードには関わりはないが,基準ノードの子ども枠内のノードは保護されるべきだろう.いや,treeviewはtribelistの子ども枠の中にいる.⇒treeviewの血統軸線図にすればcouplingの直下に配置される.とりあえず現状ではそれ以上の対応策はない.

まだBobjectの実装が入っていない.また,TREEVIEWの内部コンポーネントのリンクも途切れている.TREEVIW自身がBobjectなのでtreeviewの位置で実装したはずなのだが…TREEVIEWのBobjctの部分が配偶者なしになっていた.

▲所属グループの親ページからtreeview+TREEVIEWを除去して,PAIRBOX::repairCommonEndPointでDEBUG_NEVER (CheckSamePoint())が起きる.

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA