Skip to content.

Sections
Personal tools
You are here: Home » 技術文書 » UML » U言語

Document Actions
U言語

(株)永和システムマネジメント    平鍋 健児
作成日:2001,7/7

U言語は,UML(Unified Modeling Language)をテキストで記述するフォーマットです. アスキーアートのように,罫線や文字を使ってグラフィカルにUMLの図を表記します.

  U言語とは

U言語は,UML(Unified Modeling Language)をテキストで記述するフォーマットです. アスキーアートのように,罫線や文字を使ってグラフィカルにUMLの図を表記します.

以下に簡単なU言語のソースコード例を示します.

U言語のソースコード例
// クラス定義(Point). この行はコメントです.
=============
   Point
-------------
- x: double
- y: double
-------------
+ move(dx: double, dy: double): void
=============

// という風に,クラスを定義します.ビジュアルに UML っぽく見え
// るが,コンパイル可能なソースコードであるところが特徴.

// 継承
Shape <|--- Point <|--- Center

// <|--- で 継承を示します.

// 保有
Rectangle <>---(4) Point

// <>--- で保有を示します.(4) は多重度です.


  特徴

このフォーマットの特徴は, 「人間とプログラムの両方が理解できるテキスト形式」ということです. 生の U言語でも,ある程度 UML のビジュアルな認識が出来ます. また,厳密にシンタクスが規定されているので,U言語のパーシングプログラムを 容易に作成できます.


  用途

  1. テキストベースの人間同志のコミュニケーションに利用する. メールのように,テキストベースのコミュニケーションに簡易に利用することができます.
  2. プログラムで解釈することができます. シンタクスが規定されていますので,プログラムによるコンパイルが可能です. コンパイル結果は,UML モデルデータであったり,Java コードであったりすることが可能です. 逆に,JavaコードをコンパイルしてU言語にすることも可能でしょう.
  3. UML CASE ツールから出力できます. UML CASE ツールの出力フォーマットの1つにすることができます. これにより,ある程度 human readability を持った,テキスト形式が得られます.
  4. UML CASE ツールへ入力できます. このフォーマットを読み込めるUML CASE を作成することができます.

  文法概要

  • 関連,汎化,依存,洗練などの関係定義は,横方向の線に限ります. テキストで縦にビジュアルに定義はできません.(プログラムによるパースが辛いので)
  • 関係は,実線を - の3つ以上の連続で(関連,汎化), 点線を + の3つ以上の連続で(依存,洗練)書きます.
    関連   ---------------
    汎化   <|-------------
    依存   <++++++++++++++
    洗練   <|+++++++++++++
  • 方向性を持つ関係は,左右どちらでも定義できます.すなわち,
    Shape <|--------- Point
    Point ---------|> Shape

    は同じ意味です.

  • 関連端には以下の修飾が行えます.
    誘導可能性 -------------->
    集約 <>-------------
    コンポジット <C>------------
    多重度 -------------(4)
    -------------(*)
    -----------(1..3)
  • クラスの定義の終始端を = の連続で書きます.
  • 基本的には,クラス定義と関係定義を分ける必要があります. ただし,クラス定義の中にクラス名を書く際に関系を含めることはできます. 下記2つのソースコードは同じ意味です.
クラス定義と関係定義の連結 クラス定義と関係定義の分離
=============
   Point    ----|> Shape
-------------
- x: double
- y: double
-------------
+ move(dx: double, dy: double): void
=============
=============
   Point
-------------
- x: double
- y: double
-------------
+ move(dx: double, dy: double): void
=============

Shape <|----- Point
  • ステレオタイプは <<...>> で書き,要素の中に入れます.特に,関係線へのステレオタイプは,
    <|-----<<implementation>>-----

    などと書きます.上記は,実装継承を意味する汎化の例です. ステレオタイプの両側に連続する -, + が3つ以上必要です.

  • 制約は,{...} で書き,要素の中に入れます.{abstract}, {ordered} など
  検討中事項

  • コンポジット関連端は,<C> としたが,もっといいものないか? <*>など.
  • 関連名,関連端の役割(role)の記述方.
  • 関連クラスの表記
  • 関連端の文法を詳細に.誘導可能性,集約,多重度,役割名,制約などの順序

  デザインパターン表記例

Adapter パターン
//
// GoF の Adapter パターンの U 言語表記
//

// クラスの定義
===============
<<interface>>
   Target
--------------
--------------
/targetMethod1/
/targetMethod2/
===============

===============
  Adapter
---------------
--------------
targetMethod1
targetMethod2
===============

===============
  Adaptee
---------------
--------------
methodA
methodB
===============

// 関連の定義
Client -------> Target <|+++++ Adapter ----|> Adaptee

State パターンパターン
//
// GoF の State パターンの U 言語表記
//


// クラスの定義
===============
Context  <>-------->(1) State
----------------
state: State
----------------
request()
===============


===============
<<interface>>
/State/
----------------
----------------
/handle()/
===============

===============
ConcreteStateA  +++++|> State
----------------
----------------
handle()
===============

===============
ConcreteStateB  +++++|> State
----------------
----------------
handle()
===============


// 関係の定義のみ書き出すと,
// Context <>--->(1) State
// State <|++++++ ConcreteStateA
// State <|++++++ ConcreteStateB


  シンタクス

シンタクスは現在定義中.BNF か JavaCC 形式で定義する予定です. イメージとしては,

  • separator: '-' 文字の3つ以上の連続
  • generalizer: "<|" に続けて '-' の3つ以上の連続
  • aggregator: "<>" に続けて '-' の3つ以上の連続
  • multiplicer: (digit)
  • classifier-definition: separator "class" identifier separator attribute-list separator operation-list separator
  • generalization-definition: classifier-identifier generalizer classifier-identifier
  • .....

  謝辞

デザインパターン・メーリングリスト(DP/ML patterns@freeml.com)での議論を参考にさせて頂いています.結城さん,谷内上さん,高橋征義さんありがとうございました.


  予定

まだ,この言語を作成するかどうか未定です.アイディアとして公開しています. とりあえず,

  • Java コードを吐き出す U言語コンパイラを JavaCC を使って作成する
  • U言語を吐き出す javadoc 用の Doclet を作成する

ということを考えています.処理系を作ってくれる方を募集しています. ご意見,ご感想を以下にお待ちします.


Kenji Hiranabe <hiranabe@esm.co.jp>
Last modified: Tue Dec 3 09:24:22 2002



この記事への評価にご協力をお願いします。

良かった 普通 イマイチ