この記事の目標
ライブラリのプログラムを読んでみたい。そこでUMLのクラス図を自動生成して、プログラムの構造を視覚的に理解してみる。
手順
ライブラリUMLDocletをダウンロード
クラス図を自動生成してくれるライブラリUMLDocletを下記URLのjarリンクからダウンロードする。初版執筆時点で使用したバージョンは2.0.12である。
UMLDocletでクラス図を出力
UMLDocletの使い方の概要
UMLDocletは、Javadocコマンドと組み合わせて利用する。
Javadocとは、サン・マイクロシステムズが開発したコンピュータソフトで、JavaのソースコードからHTML形式のAPI仕様書を生成するものである。
出典: ja.wikipedia.org
サンプルバッチファイルを実行
下記のバッチファイルを実行してクラス図を生成する。4~6行目がライブラリUMLDocletを使う設定である。
"C:\Program Files\Amazon Corretto\jdk11.0.10_9\bin\javadoc.exe" ^ -sourcepath [ソースコード格納フォルダパス]\commons-csv\src\main\java ^ -d [Javadoc出力フォルダ] ^ -docletpath [UMLDocletのjarファイルのファイルパス] ^ -doclet nl.talsmasoftware.umldoclet.UMLDoclet ^ -umlImageDirectory [クラス図出力フォルダ] ^ -package ^ -quiet ^ -subpackages org.apache.commons.csv
実行すると下記の結果となった。JavadocのHTML生成でエラーが発生しているが、クラス図の生成が目的なので気にしない。
[バッチファイルのフォルダ] > (中略) javadoc: エラー - Unanticipated error generating UML: java.lang.IllegalStateException: I/O exception postprocessing CommonsCsvDocs\index.html エラー2個 警告5個
実行結果
下記のファイルを開くと生成したクラス図が表示される。
[Javadoc出力フォルダ]\[クラス図出力フォルダ]\org.apache.commons.csv.package.svg
Apache Commons CSVの各クラスが、クラス間の関係を表す矢印とともに描画されている。しかしLexerクラスなどApache Commons CSV内の他のクラスから孤立しているクラスがいくつかあり、不十分である。
改造版UMLDocletでクラス図を出力
下記のプログラム修正を行い、クラス内のメンバ変数(フィールド)は常にクラス図に表示させるようにした。
void showMembers(String value) { Set<Visibility> visibility = parseVisibility(value); fieldConfig.visibilities = parseVisibility("private"); // 元々は fieldConfig.visibilities = visibility; methodConfig.visibilities = visibility; }
改造版のUMLDocletで生成したクラス図が下記である。孤立したクラスが格段に減り、クラス間の関係が分かりやすくなった。
改造版UMLDoclet 2.1.3-SNAPSHOTのGitHubリポジトリは下記。
上記ブランチからjarをビルドする方法については、下記の記事をご覧ください。
まとめ
CSVParserクラスが依存しているLexerクラス(日本語で字句解析器クラス)が、CSVファイルの構造を理解する助けになるクラスで重要そうである。時間を見つけてこのクラスのプログラムを読んでみたい。
コメント