支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


UMLとは

UML(Unified Modeling Language)とは日本語では統一モデリング言語といい、オブジェクト指向を利用したソフトウェア開発の際に設計の記法の統一を図られたモデリング言語のことです。簡潔にまとめると人や言語によって変わる表現方法を一つに統一したものとなります。設計者の言語や地域、社風、プロジェクトが違ってもこの様なルールを決めておく事で皆が処理の内容を理解出来るようになるので非常に便利です。UMLが登場するまではモデリング手法が複数あり、現場によって表現方法が異なっていた為、非常に煩雑で一度書き方や読み方を覚えても他の現場では使えないとった汎用性の無さがありました。UML図が登場以降はその様な事が起きづらくなっていますので非常に効率的となっています。

UMLダイアグラムの種類

UMLダイアグラムには様々な種類があります。各クラスの構造やクラスの関係性を示すクラス図やソフトウェアを構成するコンポーネントや依存関係を示すコンポーネント図、システムの配置を示す配置図、クラスやモデルのグループ関係を示すパッケージ図などが挙げられます。これらはUML図の中で構造図というカテゴリに分類されます。UML図の中には構造図とは別に振る舞い図という種類もあります。例えば、システムが提供する機能や外部との関係をしましたユースケース図や時間軸に沿ったオブジェクトの相互作用を表すシーケンス図やコラボレーション図、オブジェクトの始まりから終わりまでの状態の変化を表したステートチャートやシステム動作全般の流れを示すアクテビティ図などが挙げられます。この様にUML図には沢山の種類がありますが、クラス図とシーケンス図を例に出して解説していきます。

クラス図とは

クラス図とはUMLの一種でシステムの構造を視覚的に分かりやすく表した図の事を言います。全てが文字ベースだとシステム開発に携わっている人以外には分かりにくいというデメリットがありますので、このUMLのクラス図は運用保守の場面でしばしば利用されます。クラス図を使う事のメリットとして概要を把握しやすいということがあります。システム開発者がシステムを見るときに必ずしも詳細を見たい場合ではない時があります。例えば、インターフェース銀行があり、クラスに窓口係、貸出係、営業係があるとします。開発者が見たいのはクラスの処理内容ではなく、クラス同士の相互関係を知りたい場合、UMLによってグラフィカルに表現していなければ開発者が見るたびにクラス図をイメージしてクラス同士の関係性をイメージする作業がはいってしまいます。そうなると非常に手間ですし、非効率です。クラス図を使用することでこのようなデメリットを解消することができます。また、開発者以外でもクライアントに対し説明を行う際に非常に便利です。クライアントは必ずしもITの知識が豊富というわけではないので、このような視覚的に分かりやすい図を用いて説明を行うことで意思疎通がスムーズに行う事が出来ます。

クラス図の定義方法

クラス図を書く際にクラスはクラス名、属性、操作、可視性の項目で定義されます。クラス名と一緒にパッケージ名を記載しても良いですが、省略していても問題ありません。属性とはクラスに保持している情報の事を言います。例えば1000円の本をプログラムで表したいときは、Bookクラスのint型のpriceというフィールドが1000という値を保持していると記載します。この情報を属性と言い、クラス図には「可視性 フィールド名:型=初期値」と記載します。
次に操作について解説します。操作はクラスに予め書かれている処理の事で、メソッドとほぼ同じ意味と捉えて良いでしょう。例を出して解説します。あなたはRPGを作成していて、勇者が攻撃をする行動をプログラムで定義したいとします。その場合は勇者クラスにattackメソッドを定義します。attackメソッドを呼び出すと相手のHPを減らすという動きを作りました。このattackメソッドが操作です。この様にオブジェクト指向ではクラスの中に属性と操作を定義して、必要があればメソッドを呼び出すという仕組みとなっています。この操作をクラス図で定義するには「可視性 メソッド名(引数の変数名:引数の型):戻り値の型」という表し方になります。
最後に可視性ですが、これはオブジェクト指向のカプセル化に当たります。クラスやメソッドの参照の権限を限定できるという機能です。これをクラス図に表すとpublicは「+」と表します。全クラスからアクセス可能であることを示しています。privateは「-」で表します。これは自クラスでのみアクセス可能であることを示しています。次にprotectedは「#」で表します。これは自クラス、または親子関係のクラスからのみアクセスが可能ということを表しています。親子関係のクラスとは継承を行っているクラスの事です。継承元のクラスを親クラス、継承先のクラスを子クラスと言います。この継承の長さによって孫クラスやひ孫クラスとも呼ばれています。最後にpackageですが、これは「~」で表されます。これは同パッケージ内のみアクセス可能であることを示しています。

クラス図の記号、多重度

これまでクラス図の定義方法について解説してきましたが、これからはクラス図を定義した上でそれらの関係性を表す記号や多重度について解説します。クラス図を作成する際にはクラス間の関連を示す必要があります。その際に使われるのが線形というもので、これにも関連、集約、コンポジション、依存、汎化、実現の線形があります。関連はassociationと呼ばれ、クラス間の関連を表しています。集約はaggregationと呼ばれ、関連の線形に白のひな形を付けたような形をしており、クラス間の全体と一部というような関係性を表しています。コンポジションは関連の線形に黒のひし形をつけた形をしており、compositionと呼ばれています。これは集約よりも強い集約を表しています。依存はdependencyと呼ばれており、点線の矢印の形をしています。これはクラス間の依存関係を表しています。汎化はgeneralizationと呼ばれ、関連の線形に白の三角形をつけた形状をしており、クラス間の継承を表現しています。実現はrealizationと呼ばれ、汎化の実践を点線に変えた形状をしています。これはクラス間のインターフェースを表現しています。
この様な記号によるクラスの関連を表す以外にもクラス図には多重度を示す必要もあります。多重度は「0..1」で0または1を示したり、「1..*」で1以上を示したり、「n..m」でn以上m以下であることをしめしたりと独自のルールがあるのでクラス図を作成する機会がある方は覚えておきましょう。クラス図は顧客への説明以外にも様々な使い道があります。例えば、自分でアプリケーションを作ってみるときに先にクラス図を作成し、頭の中を整理した上でアプリケーションを作成するという使い方があります。是非、本記事を機にクラス図について調べてみてはいかがでしょうか。

見やすいクラス図を書くコツ

これまでクラス図の書き方について解説してきましたので、大体のイメージがついたでしょうが、実際クラス図を作成してみると意外と分かりづらいクラス図になってしまう方も多いのではないでしょうか。そんな方の為にこれから見やすいクラス図を作成するためのちょっとしたコツについて解説します。コツの一つ目はクラスをグルーピングするという事です。グルーピングとはより近い機能や役割に関係があるクラスを近くに書くということです。グルーピングしたクラスは四角で囲み、グルーピング名を記載しておくと分かりやすいでしょう。もし、グルーピングをしなければクラス間の関係を示す矢印が長く複雑になってしまう為、論理的に間違っていなかったとしても読解するのが困難なクラス図となってしまいます。これでは専門知識のない顧客や初見の人でも理解しやすくしたいというクラス図の目的を達成できずに本末転倒となってしまいます。より分かりやすいクラス図を作成するためにグルーピングを行う事を心掛けましょう。
二つ目のコツは線は上から下または左から右方向に書くというものです。クラス図はあくまでシステムの繋がりを表した図ですが、この処理が起きた後にこの処理を行ってこういった結果になるという様な時系列まで読み取ることができる図の方がより理解をしやすいでしょう。このような理由から上から下または左から右に処理フローを記載するとより分かりやすいクラス図となります。

シーケンス図とは

シーケンス図とはObject Management Groupという団体が管理しているUMLの一種で、インタラクションを表す図となります。インタラクションとは相互作用、交流、やり取りという意味があり、ITの世界では人間がアクションを起こした際にシステムや機器がどの様にレスポンスをするかという意味で使われています。シーケンス図を使うことでプログラムの処理概要が整理できるますので、それを使用して仕様のレビューや顧客へのエビデンスとしても利用できます。もしクラス図やシーケンス図の様なUMLを使わずにルールを統一しないエビデンスを作成したならば書き方が統一されないので、本当に正しいのか判断する人が書き方を理解するコストが掛かります。実はクラス図やシーケンス図などのようなUMLを利用してルール統一をした上で仕様を決定したりエビデンスを作成すると、開発後期での仕様変更リスクの低減にもつながるのです。実際に働くプログラマーやエンジニアは良くご存じでしょうが、開発後期でそもそも仕様が間違っていたという状況は非常に手間が掛かりますし、なるべく避けたいものです。なぜなら仕様を変更することで別のシステムに影響が無いかを調べなければいけないからです。うまくかみ合っていたシステムがちょっとしたこで歯車が狂い、動かなくなることもあります。この様な事態を避けるためにもシーケンス図の様なUMLは非常に大切な物なのです。

シーケンス図の書き方

シーケンス図はまずライフラインというものを書きます。ライフラインは四角形のボックス形状をしており、中に役割と分類子名を記載します。その様なライフラインを記載したらライフライン同士の繋がりを記載します。この繋がりをメッセージと呼び、「属性=メッセージ名(引数):戻り値」という書き方をします。属性、引数、戻り値は省略が可能という点に注意しましょう。そしてライフラインが消滅した場合は破棄イベントというものを書きます。ライフラインのメッセージの先にバツマークを付けることでこの先はこのライフラインは使用しないという事を示します。他にも細やかなルールはありますが基本的にはこのライフラインとメッセージをつなげていくことでシーケンス図の大枠は出来上がります。

シーケンス図の結合フラグメント

シーケンス図は四角形の制御処理を表す囲みの左上に結合フラグメントを記載するという書き方をします。このフラグメントには様々な種類があるので1つずつ解説していきます。まず、altですがこれは条件分岐の事で、条件によって処理の内容を変更するというプログラムを表しています。次にoptですが、これは条件指定の事である一定の条件が満たされた場合作動するシステムを表しています。次にrefですが、これは外部参照、リファレンスのことです。さらに詳細があることを示すための図です。次にparですが、これは並列処理を表すものです。並列処理とはAの処理が終わった後にBの処理を行う処理の仕方ではなく、Aの処理とBの処理を並列して行うプログラムの事を指しています。次にloopですが、これはループ処理のことを表しています。JavaやPHPで使うforやwhileのことです。次にbreakですがこれは中断処理のことを指しています。ある特定の条件を満たした場合処理を中断するようなシステムが当てはまります。次にnegですが、これは不正を表しています。例えばログインをしていないのに商品を購入をしようとしているといったエラーを返すシステムにマーカーをする為のものです。次にcriticalですが、これは排他処理のことを言います。排他処理とは特定の処理の実行中に他の処理を受け付けないという様なシステムです。例えば予約されている商品は他の人が購入出来ないようにするといったシステムです。次にassertですがこれはアサーションを表しています。アサーションとは処理の妥当性をチェックする為のシステムです。次にignoreですがこれは無効を表す処理です。重要でない処理をマークする際にこのフラグメントを使用します。この様にシーケンス図には沢山の種類の結合フラグメントがありますので、是非少しずつ覚えていきましょう。

まとめ

いかがだったでしょうか。これまでUMLとは何かということからクラス図とシーケンス図の書き方や特徴について解説してきました。UMLは内部の専門家やプログラマー以外にもお客様やユーザーなどの専門家で無い人も理解しやすくする為に作られたという側面があります。システムを開発する際に大切なのは依頼主の作りたいものをシステムに実現するということなので、システムの内容がお客様に理解できない複雑であると本末転倒となってしまいます。プログラミングの行程は近年技術の発達で自動で出来るものも出てきており、今後その傾向は強くなっていくでしょうが、お客様とコミュニケーションを取りながら、具体的にどの様なシステムを作るのか決める設計業務に関しては機械に代替されにくいものであるでしょう。その様なことがしっかりとできる人材が重宝される時代になる可能性が高いので、是非複雑なものをシンプルに変換し、専門知識が無い人にも理解出来るようにするUMLについて学んでみてはいかがでしょうか。最後までお読みいただき有難う御座いました。