Translate

2020/06/04

クラスのプロパティ表示から関連表示への変換

Tipsです。

クラスをモデル化する際、ユーザ定義クラスを型とするプロパティを属性区画に追加した後で、関連(Association)として表示したい事があります。

例えば
というクラスがあった場合に、この parts メンバ要素をXクラスとの関連として表示させたい場合です。クラス図上で、ClassXクラスの各種要素と共にXクラスの詳細も表示することで、両者が関係するある特徴を明示したクラス図として表記したい時などです。

この時のModel Explorerの表示は


となっています。
通常、各種関連も Model Explorer 上で表記されているのですが、ClassAクラスに直接 parts プロパティを追加したため、関連を示すモデルが存在しません。

では関連としてのモデル要素をEdgeパネルから作らないといけないかというと、そういう訳ではありません。その関連を自動生成するやり方があります。

まず、クラス図上で対象のプロパティ(parts)を選択し、マウス右クリックから

Utils > Create Association From Property

を選択します。


これを実行すると、何の変化も起こらない様に見えますが、Model Explorer を見ると、ClassAクラスとXクラスの間のpartsに関する関連が生成されています。


一番下の「A_parts_classA」です。

これをクラス図上で Drag&Drop することで、関連が表示されます。


後はXクラスの表示内容を変更したり、関連(A_parts_classA)の見せ方を変更することで、所望の意図を持つクラス図に修正することが可能です。

モデルファイルの分割作成と使用

UMLでモデル化を行う場合の最上位の要素は「Model」なのですが、どの粒度で1つのモデルパッケージとなる最上位モデルを規定するかの問題があります。

対象とする開発プロジェクト全体を扱うモデルを1ファイルで作成するか、より細かな粒度でモデルファイルを扱うかの話しとなります。

上記の「Model」のリンクから辿れる記事で説明した通り PapyrusでのModelのファイル構成は非常にシンプルでファイルの独立性が高いです。また作成しているUMLモデルから別ファイルのモデルのImportも簡単に行えます。

そのため自分としては「1つの関心事で1つのモデルファイルを作成する」というやり方を行っています。

実はそうしている理由がもう一つあって、昔、ツール上での自分の操作ミスとツール不具合により、作成中のモデルが完全に消えたことがあります。それなりにボリュームのあるモデルを作成していたため、かなりショックで、またそのリカバリ(といっても再度のモデル化ですが)に多くの時間を有しました。その時の経験も踏まえ、出来るだけファイル分割したモデルを作成しています。

またファイル分割したモデルとすることで、複数人での並列作業も可能となります。

そのような運用を行う場合のやり方について以下で紹介したいと思います。

プロジェクトの作成

上で説明した様な運用をする場合、分割する粒度を「プロジェクト」とするか「モデルファイル」とするかが、まずはの分岐点となります。
どちらでも大きな問題は発生しませんが、それよりも自身がPapyrus/Eclipseの「プロジェクト」という単位で何を扱っているかに大きく依存しそうな気がします。
自分は RCP版の Papyrus でも通常の Eclipse と同様に扱っており、より大きな括りで扱っている「Workspace」下に関係する C/C++ プロジェクトや Java プロジェクト、XMLプロジェクトやLaTeXプロジェクト等が混在しています。その一つとして「(ある特定の対象向けの)モデルプロジェクト」として「プロジェクト」を位置づけています。
そのため、作成するモデルが最初から小さいことが明確になっている場合を除き、

「Papyrus プロジェクトではなく 素のプロジェクトを作成し、その下に複数のモデルファイルを作成する」

というやり方をとっています。

素のプロジェクトの作り方ですが、Papyrusのメニュー上の File > New から、「Papyrus Project ではなく」、「Other」を選択します。


これにより使用中の Papyrus (Eclipse) で作成可能なプロジェクトやファイルの一覧が表示されるので、その中の

General > Project

を選択します。


これにより素のプロジェクトファイルが作成可能です。

モデルファイルの作成

その後は、作成したプロジェクトを Project Explorer 上で選択して、同じく File > New から、「Papyrus Project ではなく、Papyrus Modelを選択」します。


その先は通常の Papyrus Project での作成作業と同じダイアグラムが表示されます。


これを繰り返すことにより、一つのプロジェクト下に複数の Papyrus Model (ファイル)を作成することが可能です。

以下は SimpleProject という素のプロジェクト下に Papyrus Model として A、B、C という3つのモデルファイルを作成したプロジェクトの例です(Project Explorer 表示)。


各々のモデルファイルをダブルクリックすると、そのモデルが Papyrus 上で開かれます。

モデルパッケージのImport

今、Papyrus Model の A には ClassA クラスが、Papyrus Model の B には ClassB クラスが定義されているとします。

そしてPapyrus Model の C において、A の ClassA クラス、および B の ClassB を用いて新たなClassC を定義したいとします。

そのためには Model C において Model A パッケージと Model B パッケージを Import するとが必要となります。

まずは  C を開いて、その Model Explorer 上でトップの Model (ここでは C )を選択します。


その後、マウス右クリックで

Import > Import Package from User Model

を選択します。



するとワークスペース内のプロジェクトからUMLモデルとしてImport可能なモデルファイルが選択可能となります。


ここで、「A.uml」および「B.uml」をマウスで選択し、ダイアログ中央にある [⇒] ボタンで、右側に表示させ [OK] ボタンを押します。


その後、どのパッケージ要素を Import するかの選択用ダイアログが表示されます。


ここで A と B を選択することになるのですが、注意点が「Action」です。
ダイアログ中央ぐらいにある 4 つのボタンのうちの3つが対応しているのですが、Actionとしては昔の記事「Papyrus における登録済パッケージのインポート」に示した通り、以下の3種類:

  • Load
  • Import
  • Copy

があり、どれを選択するかで対応する [Load All] [Import All] [Copy All] ボタンをクリックします。

今回は Import で進めるとして、[Import All] ボタンをクリックするとダイアログの表示が以下となります。


これで [OK] を押すと、Model Explorer 上で Model A と Model B が現れます。


あとは Model C 上で ClassA や ClassB をダイアグラム上に Drag & Drop しながら、モデル作成を進めていけます。

モデル作成

試しに Model C 上でClassAとClassBをCompositeする「Cクラス」を定義してみると、このようになります。ClassA と ClassB は Model Explorer 上から Drag & Drop しました。


なお、ClassA や ClassB が別パッケージ由来というのが少し分かりにくいので、明示したい場合には、ClassA (やClassB)をダイアグラム上で選択し、Properties の Appearance の一番下にある

「Qualified name de」

を適切に切り替えることで表示が変更されます (de って何でしょうかね? なにかしら単語が途中で切れているのでしょうか? それともフランス語の前置詞 de なのでしょうかね??)





関係(Relationship)に関わるメタクラスの関係

クラス間の関係をモデル化している際、その間に使用可能な「関係」(Relationship)にどういうものがあるかや、そこで使用することが適切か等を悩むことがあります。

UMLのメタクラス定義において、関係に関するメタクラスは継承関係を用いて定義されており、その基本理解をしておくと、関係のモデル化の見通しが立ちやすいです。

Papyrusは、その内部で使用している「UML Metamodel」をクラス図の作図要素として用いることが可能で、その汎化の関係も表示されます。

クラス図で使用可能な関係(Relationship)要素を抽出して、そのメタモデルレベルでの継承関係を示したものが以下となります。


改めて見ると気づきも多いです。

なおこのモデルは、SysMLのようなUMLプロファイル定義中の関係に関するモデル要素が、どのUMLメタモデルを拡張しているのかを見ることで、その意味理解を助けることも可能です。

継承先クラスでの継承元クラス要素の表示

Tipsです。

「区間の名前表示と区間で表示するモデル要素」という記事で、クラス図において、クラスの区画上で表示する要素の選択や、表示する区画自体やそのタイトルの選択方法について説明しました。

関連して、「継承先クラスで継承元クラスの要素の選択表示は行えるか?」の話しです。

答えは「行えます」

上記の元記事にあるBaseクラスを継承してDerivedクラスを規定したとします。


DerivedクラスにBaseクラスの要素を表示するかどうかの操作は元記事と同様に Derived クラスをマウスで選択した後、

Filters → Show/Hide Contents

から行います。

上記操作により以下のダイアログが表示されます。


見ての通り、「(from <Class> Base)」として Base クラスの要素の表示が可能です。

全てをチェックしてOKとすると、クラス表記は、


となります。

なお「Show/Hide Contents」として表示されるダイアログ上で y や b が選択肢として出てきませんが、これはそれらが「private」として定義されているためであり、正しい動作となります。

区間の名前表示と区間で表示するモデル要素

Tipsです。

Model Explorer 上で以下の様に示されている 3つのProperty 「x, y, z」と 3つのOperation 「a, b, c」を持つクラス Base を考えます。


クラス図上で Base クラスは以下の様に表示されると思います。

クラス名「Base」の下にある attributes を表示する「区画」(Compartment)に「x, y, z」が表示され、operations を表示する区画に「a, b, c」が表示されています。

この表示に対し
  • 各区画が何を表示する所かを明示したい
  • 各区画で表示する内容を選択したい
という様な時のツール操作方法です。

まずクラス図上で対象のクラス(ここではBaseクラス)をマウス左クリックで選択し、その後、マウス右クリックで表示されるドロップダウンリスト上で「Filters」を選択します。


すると幾つかのメニューが表示されます。

ここで
  • Show/Hide Contents を選択すると表示する要素の選択
  • Show/Hide Compartments を選択すると表示する区画や区画の名前の選択

が行えます。

まず「Show/Hide Contents」ですが、以下のダイアログが表示されます。


このチェックボックスを選択もしくは選択解除することで表示する要素を選べます。

例えば、attributes としては「xのみ」、operations としては「a, bのみ」を表示したい場合は、そのようにチェックボックの選択を行い、

[OK]ボタンを押すとクラス図での表記が以下の様に変更されます。


また「Show/Hide Compartments」ですが、以下のダイアログが表示されます。


ここで
  • 左側の「Compartments To Display」が区画自体を表示するかどうか
  • 右側の「Display Compartment Title」が区画の名前を表示するかどうか

の選択となります。

まず右側の「Display Compartment Title」を試してみます。現在表示されている3つの区画全てにタイトル表示のチェックを行うと、


クラス表記は以下の様に変わります。
無事に区画のタイトルが表示されています。

次に「Compartments To Display」を試してみます。

まず attributes 区画だけの表示を試してみます。


この時、チェックを外した区画の「Display Compartment Title」のチェックはあってもなくても構いません。これでOKを押すと、

とBaseクラス上で attributes 区画のみが表示されます。

今度は operations 区画だけを表示させてみます。ダイアログ上の選択で、


としてみます。こうするとクラス表記は、
と変わります。

これらをうまく組み合わせて、同じクラスモデルでも表示する内容を選択して、各図で何を示そうとしているのかを明確にすることが可能です。

2020/06/03

モデル名の英語表示と日本語表示

Tipsです。

モデル化を行っている時に、モデル要素の Properties 表示で「Name」と「Label」があります。


普通にモデルの名前をつけた場合、この「Name」の所に名前がついていると思います。

それが正規の「モデル名」だとして、この「Label」は表示名を表します。

特に日本語圏でモデル化を行っている場合、

  • モデル化を検討している時や人に見せる時には「日本語」で表示したいけど、モデル作成後にコード生成を行う場合には「英字名」を使いたい

というケースもあるかと思います。

その場合、この「Label」が役に立ちます。

上記の例で「NameをCar」とし「Labelを自動車」として与えると、モデル表記(例えばクラス図)上では「自動車」と表示されます。内部的な正規の名前は「Car」のままです。



「別に Name の所に日本語名を入れれば良いのでは」と思われるかもしれませんし、たしかにそれで問題なく名付けも表示も行われますが、例えばJava/C++のコード生成などをした際に日本語名がトラブルになることがあります。

そのため、日本語を使用したい場合には、
  • 正規名(Name)は英字名で
  • 表示名(Label)は日本語で
として運用されることをおすすめします。

なお、幾つか「バグ?」と思われる挙動があり、最初に Name に日本語名を付けてモデル化作業を進め、その後、「NameからLabelに日本語名をコピペして、その後、Nameに英字名をつける」とした場合、正しく名前が表示されないとか、Labelにコピペした日本語名が消失するという問題に出会うことがあります。
最初に Name に日本語名をつけることは自分もすることが多いですが、そのような名前変更の作業を行う場合には、

  1. 最初に Name に書かれている名前を「切り取り(Cut)」
  2. その後、Nameに英字名を入力し Enter キーを押して確定
  3. その後、Label に切り取っておいた(日本語の)名前を「貼り付け(Paste)」
  4. その後、Labelの所で Enter キーを押して確定

という手順を取る方がトラブルに合わなくて済むかと思います。

なお手順2および手順4で Enter キーで確定した場合、セルの色とダイアグラム上のモデル名が変わるので、変更されたことの確認を明確に行うことが可能です。

関連における表示要素の選択

Tipsです。

2つのクラス間で関連 (Association。Composite や Shared など)をモデル化した後、関連端などの表示内容を表示する・しないを変更したい時があります。

例えば



というモデルにおいて、「A_engine_car」と名付けている関連が持つ関連端の多重度「1」や名前「car」や「engine」を非表示にしたい等です。

上記モデルでは

  • Carクラス側の「+car」を非表示にしたい
  • Carクラス側の「1」を非表示にしたい

というケースが多いのではないでしょうか。

また上の図の例では関連に陽に名前をつけて「A_engine_car」としてますが、作成したモデルにより、関連の名前を表示したり非表示にしたりを調整したい時です。

その場合は、関連のエッジをマウス左クリックで選択した後、マウス右クリックで表示されるドロップダウンリストから

Filters → Show/Hide Labels

を選択します。



すると、表示する内容を選択するダイアログが表示されます。



このチェックボックスのチェックを切り替えることで、表示内容を選択可能です。

例えば Engine クラス側の関連端内容の表示のみを行いたい場合には、



を選びます。

すると以下のように所望のモデル表示となります。


例えば関連の名前をモデルにはちゃんと規定したいが表示はさせたくないから付けないという人もおられるかもしれませんが、上記の設定を使用すると、モデル化とその表示とを分離して作業を進めることが出来ます。

なお上記の Filters からのドロップダウンリストに

  • Show All Labels
  • Hide All Labels

というメニューも見えますが、まさに名前の通りの挙動となります。

関連端の可視性の変更

Tipsです。

Papyrusのクラス図を用いたモデル化の際、Association(CompositeやShared)で2つのクラス間を関連付けた後に「可視性」(Visibility)を変更したい時に、どうすれば良いか悩む時があります。

例えば

とモデル化した後で、Engineクラス側の関連端「engine」の可視性を、今の + (+engine。ようは public)から ー (-engine。ようは private) に変更したい時などです。

Association のエッジを選択して Properties タブを見てみると、関連端に対する「名前」や「多重度」など幾つかの属性は変更出来ますが、可視性(Visibility)を変更できる所はメニューにはありません。

以下の図のような感じです。


このような時に可視性を変更するには、上記図のような Association に対する Properties タブから行うのではなく、Model Explorer 上に見える Car クラスのプロパティとしての「engine」を選択することで行います。

Model Explorer の Car クラスを見ると、


のように Carクラス に engine が見えると思います。

これをマウスで選択し、Properties タブを開くと、


のように Carクラスの Property としての engine の編集が行えるので、ここで「Visibility」を public から private に変更します。


これにより、クラス図上で 「- engine」と変更されます。


このような Tips が Papyrus には色々と存在しているので、また紹介してゆけたらと思います。

ちなみに上記の Propertiesタブ で、可視性を public から private に変更した際、図の左上にあるアイコンが変わっていることにも気づけるかと思います。Model Explorer 上でも



のように変動して private メンバを示すアイコンに変更されています。