Skip to content
2011/04/06 / highmt

オブジェクトパッセージ図 Ver.0.1.0

処理がどう進んでいくのかを分析するのに、コールグラフやコミュニケーション
図、シーケンス図、といったものをよく使うと思います。

しかし、これらの図は、基本的には呼び出しの関係を表すものであるため、特に
オブジェクトをつくってわたして、といったことを行うような処理では、オブジェ
クト間の関係を表すのにはがゆい思いをしたりします。

そこで、試験的にオブジェクトパッセージ図なるものを書いてみました。
以下のようなことがらを表すのを目標にしています:

  • オブジェクトaからオブジェクトbのm1を呼び出す
  • オブジェクトaからオブジェクトbのm1を呼び出してオブジェクトcを渡す
  • オブジェクトaからオブジェクトbのm1を呼び出してオブジェクトcを生成する

試みとして、Android の Service の使用方法をオブジェクトパッセージ図にし
てみました。
(この辺の内容のつもりですが間違ってるかもしれません。→http://developer.android.com/guide/developing/tools/aidl.html)
あまりよくできてないところもあるので、とりあえずVer.0.1.0として公開してみ
ます。

図の要素の説明等は今は雰囲気だけでいずれまた整理したいと思います。

オブジェクトパッセージ図

ソース(graphviz)

digraph sampleservice {
  graph [nodesep="1.2", ordering="in"];
  node [fontname="tahoma", fontsize="8"];
  edge [fontname="tahoma", fontsize="8", arrowsize="0.5"];

  AIDL [label="<<aidl>>\nIXxxService"];
  AIDL -> IXxxService_Stub [label="<<generate>>"];
  AIDL -> IXxxService [label="<<generate>>"];

  Binder;
  IXxxService_Stub [shape=Mrecord,label="<x>IXxxService.Stub|{<m1>doXxx|<m2>asInterface}"];
  Binder -> IXxxService_Stub [dir=back, arrowtail=empty, arrowsize="1.5"];

  XxxService_Stub [shape=Mrecord,label="<x>\<\<impl\>\>\nXxxService.Stub|{<m1>\<\<override\>\>\ndoXxx}"];
  IXxxService_Stub -> XxxService_Stub [dir=back, arrowtail=empty, arrowsize="1.5"];

  Service;
  XxxService [shape=Mrecord,label="<x>XxxService|{<m1>\<\<\override\>\>\nonBind}"];
  Service -> XxxService [dir=back, arrowtail=empty, arrowsize="1.5"];

  XxxServiceProxy [shape=Mrecord,label="<x>XxxServiceProxy(internal)|{<m1>\<\<\override\>\>\ndoXxx}"];
  IXxxService_Stub:m2 -> XxxServiceProxy [label="(8)\n<<lead to>>", style="dashed"];
  XxxService:m1 -> XxxService_Stub:x [label="(5)\n<<lead to>>", style="dashed"];

  Activity;
  XxxActivity [shape=Mrecord, label="<x>XxxActivity|{<c0>ctor()|<m1>\<\<\override\>\>\nonCreate|<m2>\<\<\override\>\>\nonDestroy|<m5>onKey|<m3>\<\<inherit\>\>\nbindService|<m4>\<\<inherit\>\>\nunbindService}"];
  Activity -> XxxActivity [dir=back, arrowtail=empty, arrowsize="1.5"];

  ServiceConnection;
  XxxServiceConnection [shape=Mrecord, label="<x>XxxServiceConnection|{<m1>\<\<override\>\>\nonServiceConnected|<m2>\<\<override\>\>\nonServiceDisconnected}"];
  ServiceConnection -> XxxServiceConnection [dir=back, arrowtail=empty, arrowsize="1.5"];
  
  XxxActivity:c0 -> XxxServiceConnection [label="(1)\n<<create>>"];
  
  Intent1 [label="Intent\n{ISampleService.class}"];
  XxxActivity:m1 -> Intent1 [label="(2)\n<<create>>"];
  XxxActivity:m1 -> XxxActivity:m3  [taillabel="(3)", labeldistance="6" labelangle="-20"];
  XxxActivity:m3 -> Android [label="(4)"];
  Intent1 -> XxxActivity:m3 [label="(3)\n<<passed to>>", style=dotted];
  XxxServiceConnection -> XxxActivity:m3 [label="(3)\n<<passed to>>", style=dotted];

  XxxActivity:m5 -> XxxServiceProxy:m1 [label="(10)"];
  
  XxxServiceConnection -> XxxActivity:m4 [label="(11)\n<<passed to>>", style=dotted];

  Android -> XxxService:m1 [label="(5)"];
  
  Android -> XxxServiceConnection:m1 [label="(7)"];
  XxxService_Stub -> XxxServiceConnection:m1 [label="(7)\n<<passed to>>", style=dotted];
  
  XxxServiceConnection:m1 -> IXxxService_Stub:m2 [label="(8)"];
  
  XxxActivity:m2 -> XxxActivity:m4 [taillabel="(11)", labeldistance="6", labelangle="-20"];
  XxxActivity:m4 -> Android [label="(12)"];
  Android -> XxxServiceConnection:m2 [label="(13)"];
}
広告
%d人のブロガーが「いいね」をつけました。