前の関連記事:linuxBean14.04(52)Eclipse Modeling ToolsでJavaコードからUMLを生成:その1
Javaコードからumlファイルを生成できたので、今度はPapyrusプラグインを使ってUMLのクラス図を作成します。Papyrusパースペクティブに切り替えて操作しています。UML図の用語についてはLibreOffice(8)統一モデリング言語UML(Unified Modeling Language)の学習をみながら書いています。
クラスをクラス図に描く
Modelエクスプローラでroot modelかプロジェクト名を選択して(選択した下層にdiagramが入ります)右クリック→New Diagram→Class Diagram。
このClassDiagramがクラス図になります。
ModelエクスプローラにDiagram ClassDiagramの項目が出現し、diファイルのタブの下にClassDiagramタブが入れ子として出現しました。
新たにクラス図を作成するときは右にでてきたパレットにあるツールをドラッグアンドドロップして作ります。
今回はすでに作成したumlファイルからクラス図を作るのでModelエクスプローラからドラッグアンドドロップします。
これはispaceでみたFirstStepsプロジェクトの静的コールグラフなのですが、今回取り上げた例のFirstStepsプロジェクトはJavaソースコード内では各クラス間の依存はなく、HelloTextTableShapeクラス以外はフィールドもメソッドありません。
ModelエクスプローラでみるとDpendencyが下に続いていますがこれはライブラリへの依存になります。
とりあえずModelエクスプローラからHelloTextTableShapeクラスをClassDiagram内へドラッグアンドドロップします。
HelloTextTableShapeクラスがクラス図に描画されました。
フィールドやメソッドを表示させるには、表示させたいクラスをClassDiagram内で選択して右クリック→Filters→Show/Hide Contents。
表示させることが可能な属性(attributes)と操作(operations)一覧がでます。
表示させたいものにチェックをいれて「OK」。
属性がJavaのフィールドが属性、メソッドが操作に対応しています。
mainとHelloTextTableShape()を除いてチェックをつけました。
これでHelloTextTableShapeクラスをクラス図に描画できました。
各アイコンに右下についている+や#はJavaでいうアクセス修飾子(UMLではVisibility)を表します。(Visibility in UML, which could be public, package, protected and private, allows to constrain the usage of an element in namespaces.)
+ public どこからでも利用可能。
# protected 同じパッケージ内からのみ利用可能。ただし、継承はパッケージ外からも可能。
- private 同じオブジェクト内からのみ利用可能。
~package 同じパッケージ内からのみ利用可能。
依存<Dependency>をクラス図に描く
Modelエクスプローラから、root model→FirstSteps→default package、と展開して下までみるとこのようになっています。
<Dependency>と書いてあるのは依存を表します。
Xから始まる名前のものはLibreOffice APIであるUNOの(実装済)インターフェイスになります。
(LibreOffice(11)LibreOfficeのオブジェクトとUNOのインターフェイス参照。)
依存にあるXDrawPageをClassDiagramにドロップしてみました。
右クリック→Filters→Show/Hide ContentsにしてXDrawPageのoperationsをすべて表示し、さらになにも選択しない状態で右クリック→Arrange All、して整列させています。
Dependencyを表すエッジや<<Interface>>というステレオタイプは自動的に描画されました。
XDrawPageのメソッド(LibreOffice: XDrawPage Interface Reference)は今回元にしたJavaソースコードに書いてあるもののみ表示されました。
xDrawPage.add(xCalcShape);XDrawPage.add()はHelloTextTableShape.javaの238行目で使用されています。
しかしXDrawPage.getByIndex()やXDrawPage.getElementType()はでてきません。
これら他の二つのメソッドは次でみるようにXDrawPageを汎化したUNOインターフェイスで使われているものになります。
汎化<Generalization>をクラス図に描く
XDrawPageの汎化先をたどるにはModelエクスプローラで<Dependency>XDrawPageのプロパティをみてもわからず、Javaソースコードをみます。
import com.sun.star.drawing.XDrawPage;HelloTextTableShape.javaの59行目をみるとXDrawPageのパッケージ名がcom.sun.star.drawing.XDrawPageであることがわかります。
このパッケージはライブラリ(unoidl.jar)から読み込んでいるものなので、Modelエクスポローラでroot model→external→com→sun→star→drawing→XDrawPageとたどります。
XDrawPageにある<Generalization>XShapesをClassDiagramにドロップして内容を表示させます。
XDrawPageクラスとGeneralizationのエッジで結ばれたXShapesクラスが描画されました。
同様にしてどんどん先をたどっていきます。
LibreOffice APIリファレンスのクラス図が再現されています。
Javaソースコードで使用されている操作のみ表示されています。
XIndexAccess xIndexedDrawPages = UnoRuntime.queryInterface( XIndexAccess.class, drawPages); Object drawPage = xIndexedDrawPages.getByIndex(0);HelloTextTableShape.javaの268行目でUnoRuntime.queryInterface()でdrawPagesオブジェクト(com.sun.star.drawing.XDrawPagesサービスのインスタンス)にXIndexAccessインターフェイスがあることをJavaコンパイラに教えています。(Using Interfaces、LibreOffice UNOの機能になります。)
その次の270行目でXIndexAccessインターフェイスのgetByIndex()を使っています。
getElementType()はFirstLoadComponent.javaの82行目で使われています。
com.sun.star.sheet.XSpreadsheetsインターフェイスでXElementAccessを継承したgetElementType()を使っています。
「This element is imported」はどういう意味かよくわからず
クラスの項目の右端には小さい矢印がついているところがあります。
add()メソッド以外の右端についてついている矢印アイコンにマウスを乗せると「This element is imported」と表示されます。
これの意味するところがよくわかりませんでした。
LibreOffice APIリファレンスを追っていくと、Inherited Membersになっているメソッドがひとつ下の階層までは表示されないのかと思いましたがXindexAccessで定義されている
getByIndex()がその下の階層のXShapesではすでに「This element is imported」になっているのでそれもあてはまりませんでした。
そもそもHelloTextTableShapeクラス自体が「This element is imported」になっているので、どこを基準にインポートと判断しているのかわかりませんでした。
ちなみに、ClassDiagram画面上で右クリック→File→Save As Image File、で出力した画像には「This element is imported」の矢印は表示されませんでした。
参考にしたサイト
LibreOffice: Namespace List
今回例のJavaソースコードに出てくるLibreOfficeのAPIリファレンス。
Unified Modeling Language (UML) description, UML diagram examples, tutorials and reference for all types of UML diagrams - use case diagrams, class, package, component, composite structure diagrams, deployments, activities, interactions, profiles, etc.
UMLのわかりやすい解説。Kirill Fakhroutdinov - Google+この人が個人で書いているようです。
0 件のコメント:
コメントを投稿