導入
「二度測って、一度切る」という言葉は、誰もが子供の頃に聞いたことがあると思います。それはプログラミングでも同じです。実行に時間を費やす前に、実装について検討することをお勧めします。多くの場合、実装中にクラスを作成し、それらの相互作用を考案する必要があります。そして多くの場合、これを視覚的に表現することは、最も正しい方法で問題を解決するのに役立ちます。ここでUML が役に立ちます。UMLとは何ですか?
検索エンジンで画像を見てみると、 UMLが図、矢印、四角形に関するものであることが明らかになるでしょう。重要なのは、UML が統一モデリング言語に翻訳されることです。ここで「統一」という言葉が重要です。つまり、私たちの写真は私たちだけでなく、UML を知っている他の人にも理解されることになります。これは図を描くための国際言語であることがわかりました。
ウィキペディアにあるように
UML は、ソフトウェア開発、ビジネス プロセス モデリング、システム設計、および組織構造の表示におけるオブジェクト モデリングのためのグラフィカル記述言語です。誰もが考えたり認識したりしていない最も興味深いことは、UML には仕様があるということです。さらに、UML2 仕様もあります。仕様の詳細については、Object Management Group のWeb サイトを参照してください。実際、このグループは UML 仕様の開発を行っています。UML がクラスの構造を記述することに限定されていないことも興味深いです。UML 図には多くの種類があります。UML 図の種類の簡単な説明は、同じ Wikipedia: UML 図、または Timur Batyrshinov によるビデオ「UML 図のレビュー」で参照できます。UML は、さまざまなプロセスを記述するためにも広く使用されています (例: JWT を使用したシングル サインオン)。UML クラス図の使用に戻ると、同じ UML 図でパターンが説明されている書籍『Head First: Design Patterns』に注目する価値があります。実際にUMLが使われていることが分かりました。そして、その応用に関する知識と理解は非常に役立つスキルであることがわかりました。
応用
IDE からこれと同じ UML を操作する方法を見てみましょう。IntelliJ Idea をIDE として考えてみましょう。IntelliJ Idea Ultimateを使用する場合は、「UML Support」プラグインがそのままインストールされます。美しいクラス図を自動生成できます。たとえば、Ctrl+N またはメニュー項目「ナビゲート」->「クラス」を使用して、ArrayListクラスに移動します。次に、クラス名のコンテキスト メニューから、[図] -> [図のポップアップを表示] を選択します。その結果、美しい図が得られます。
@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Idea で結果を確認するには、[表示] -> [ツール ウィンドウ] -> [PlantUML] を選択します。クラスを表す 2 つの正方形を取得するだけです。ご存知のとおり、これらのクラスはどちらも List インターフェイスを実装しています。このクラス関係を実装と呼びます。このような接続を示すには、点線の矢印を使用します。それを描いてみましょう:
interface List
List <|.. ArrayList
List <|.. LinkedList
List
- 子クラスの 1 つCollection
。つまり、Collection から継承されます。この関係は一般化と呼ばれます。規則的な連続線を持つ矢印のように見えます。それを描いてみましょう:
interface Collection
Collection <|-- List
次のタイプの接続の場合、クラスの説明にパッケージの要素のプライベートArrayList
配列に関するエントリを追加します。
~Object[] elementData
ここで、いくつかのオブジェクトが含まれているものを示したいと思いますArrayList
。この場合、接続タイプはアグリゲーションになります。この場合の単位は ですArrayList
。他のオブジェクトが含まれています。リスト内のオブジェクトはリストなしでも存続できるため、集計を選択します。リストの不可欠な部分ではありません。それらの存続期間はリストの存続期間とは関係ありません。集合体はラテン語から「組み立てられた」、つまり何かで構成されたものと翻訳されます。たとえば、生活の中にはポンプとモーターで構成されるポンプユニットがあります。ユニット自体は、一部のコンポーネントを残したまま分解できます。たとえば、売却したり、別のユニットに入れたりする場合です。リストも同様です。そして、これはユニットの近くの空のひし形と連続した線の形で表現されます。それを次のように図示してみましょう。
class Object{
}
ArrayList o- Object
ArrayList
ここで、 とは異なり、クラスには格納されたデータを参照するコンテナがLinkedList
含まれていること を示します。Node
この場合、Node
彼らは自分自身の一部でありLinkedList
、別々に生きることはできません。Node
コンテンツは直接保存されていませんが、コンテンツへのリンクのみが含まれています。たとえば、LinkedList
行に追加するときは、Node
その行へのリンクと、前と次の へのリンクを含む新しい を追加しますNode
。このタイプのコミュニケーションはコンポジションと呼ばれます。複合物 (複数のパーツで構成されたもの) を表示するには、色付きのひし形が描かれ、それに続く連続線が付けられます。これを接続のテキスト表示として書いてみましょう。
class Node{
}
LinkedList *-- Node
そして今、別の重要なタイプの関係である依存関係 を表示する方法を学ぶ必要があります。これは、あるクラスが別のクラスを使用し、そのクラスが使用されているクラスを含まず、その子孫でもない場合に使用されます。たとえば、LinkedList
彼らはArrayList
を作成する方法を知っていますListIterator
。これを点線の矢印として表示してみましょう。
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
これをすべて終えると、次のようになります。
オートメーション
PlantUML 図を自動生成するにはさまざまな方法があります。たとえば、Idea にはSketchITプラグインがありますが、完全に正しく描画されません。たとえば、インターフェイスの実装が正しく描画されません (継承として表示されます)。これをプロジェクトのビルド ライフ サイクルに組み込む方法の例もインターネット上にあります。uml-java-docklet を使用するMavenの例があるとします。これがどのように行われるかを示すために、Maven Archetype を使用してMaven プロジェクトを迅速に作成します。コマンドを実行しましょう: フィルタを選択するように求められたら (数値を選択するか、フィルタを適用します)、Enter キーを押してデフォルトのままにします。これは常に「 maven-archetype-quickstart 」になります。最新バージョンを選択します。次に、質問に答えてプロジェクトの作成を完了します。mvn archetype:generate
mvn clean install
。mvn javadoc:javadoc
ここで、生成されたドキュメント (explorer target\site\apidocs\index.html) を開くと、UML 図が表示されます。ちなみに、実装はすでにここで正しく表示されています)
GO TO FULL VERSION