このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

基本的な処理パターンの絵

Catyのコマンド/アクション、クライアント状態(≒画面、UI)、型チェックと分岐、ファシリティ/エンティティなどを使って、基本的な処理パターンを表現してみる。


以下に描画用のソース。

// -*- coding: utf-8 -*-

/** ロバストネス風の図 */
module g;

command output-all :: void -> void {
 req-c  | gv:draw --out=/req-c.gif;
 res-c  | gv:draw --out=/res-c.gif;
 vali-c | gv:draw --out=/vali-c.gif;
 load-c | gv:draw --out=/load-c.gif;
 save-c | gv:draw --out=/save-c.gif;
 func-c | gv:draw --out=/func-c.gif;
 send-c | gv:draw --out=/send-c.gif
};

command show-all :: void -> void {
 file:read /req-c.gif  | ct:show-image;
 file:read /res-c.gif  | ct:show-image;
 file:read /vali-c.gif | ct:show-image;
 file:read /load-c.gif | ct:show-image;
 file:read /save-c.gif | ct:show-image;
 file:read /func-c.gif | ct:show-image;
 file:read /send-c.gif | ct:show-image
};

/** Request */
command req-c :: void -> gv:Digraph {
 [ 
   state-node input,
   action-node command,
   req-edge input command
 ] | gv:graph --rankdir=LR Request
};

/** Response */
command res-c :: void -> gv:Digraph {
 [ 
   state-node output,
   action-node command,
   res-edge command output
 ] | gv:graph --rankdir=RL Response
};

/** Validation */
command vali-c :: void -> gv:Digraph {
 [
   gv:node --shape=point --style=invis vin,
   gv:node --shape=point --style=invis vout1,
   gv:node --shape=point --style=invis vout2,

   case-node type-check,

   gv:edge --label="" vin type-check,
   gv:edge --label=OK type-check vout1,
   gv:edge --label=NG type-check vout2,
 ] | gv:graph --rankdir=LR Validation
};

/** Load */
command load-c :: void -> gv:Digraph {
 [
   action-node command,
   entity-node store,
   reads-edge command store
 ] | gv:graph Load
};

/** Save */
command save-c :: void -> gv:Digraph {
 [
   action-node command,
   entity-node store,
   updates-edge command store
 ] | gv:graph Save
};

/** Function */
command func-c :: void -> gv:Digraph {
 [
   action-node command,
 ] | gv:graph Function
};

/** Send */
command send-c :: void -> gv:Digraph {
 [
   state-node input,
   action-node command,
   port-node port,
   req-edge input port,
   req-edge command port
 ] | gv:graph Send
};

/* 基本図形 */

command case-node [string name] :: void -> gv:Node {
  gv:node 
    --fontsize=14.0
    --shape=diamond 
    --style=filled
    --color=black
    --fillcolor=darkseagreen2
  %1
};

command state-node [string name] :: void -> gv:Node {
  gv:node
    --fontsize=14.0
    --shape=note
    --style=filled
    --color=black
    --fillcolor=gold
  %1
};

command port-node [string name] :: void -> gv:Node {
  gv:node 
     --fontsize=14.0
     --shape=ellipse
     --style="filled,dotted"
     --color=black
     --fillcolor=darkseagreen2
  %1
};

command action-node [string name] :: void -> gv:Node {
  gv:node 
    --fontsize=14.0
    --shape=ellipse
    --style=filled
    --color=black
    --fillcolor=darkseagreen2
  %1
};

command entity-node [string name] :: void -> gv:Node {
  gv:node 
    --fontsize=14.0
    --shape=Mcircle
    --style=filled
    --color=black
    --fillcolor=darkorange3
  %1
};

command req-edge [string st, string ac] :: void -> gv:Edge {
  gv:edge
    --fontsize=14.0
    --color=darkorchid3
  %1 %2
};

command res-edge [string ac, string st] :: void -> gv:Edge {
  gv:edge
     --fontsize=14.0
     --color=crimson
  %1 %2
};

/* 以下、エッジの指定順序は、常に アクション エンティティ の順 */

command reads-edge [string act, string ent] :: void -> gv:Edge {
  gv:edge
    --dir=back
    --label=reads
  %1 %2
};

command updates-edge [string act, string ent] :: void -> gv:Edge {
  gv:edge
    --label=updates
  %1 %2
};

command uses-edge [string act, string ent] :: void -> gv:Edge {
  gv:edge
    --dir=both
    --label=updates
  %1 %2
};


/* サンプル */

command sample :: void -> gv:Digraph {
 [
   action-node act1,
   action-node act2,
   action-node act3,
   entity-node ent1,
   entity-node ent2,
   
   uses-edge act1 ent1,
   reads-edge act2 ent1,
   updates-edge act2 ent2,
   reads-edge act3 ent2,
 ] | gv:graph sample
};

command sample2 :: void -> gv:Digraph {
 [
   action-node Data.get,
   action-node Data.put,
   action-node Data.index,

   entity-node "mafs\npub",
   entity-node "kvs\nindex",
   
   reads-edge Data.get "mafs\npub",
   updates-edge Data.put "mafs\npub",
   updates-edge Data.put "kvs\nindex",
   reads-edge Data.index "kvs\nindex",
 ] | gv:graph sample2
};

// End of Module