2021-11-29に更新

実践UML記述法:スクリプト言語(Python, Perl, PHPなどなど)における可視性をUMLで記述する1考察

本記事は、 Qrunch からの移転記事です。

移転元: 実践UML記述法:スクリプト言語(Python, Perl, PHPなどなど)における可視性をUMLで記述する1考察 - 雑木林

TL; DR

スクリプト言語における可視性をUMLで記述する場合、リバースエンジニアリングによる結果論的可視性を書くといいかもしれない

本題:スクリプト言語における可視性をUMLで記述する

UMLには可視性という概念があります。

Javaにおけるアクセス修飾子とほぼ同等のもの、と考えておけば間違いではありません。
publicprivateprotected、およびpackageです。

スクリプト言語(ここではPython、Perl、PHPといったいわゆるP言語を対象としておきます)には、絶対的な可視性はありません。
例えばPythonであれば、変数の前にアンダースコアを付けることで「疑似的に」プライベート変数を設定できますが、実際に外部から参照できないわけではありません。

問題点

スクリプト言語で開発する場合、UMLにおける可視性の情報は無意味です。
それどころか、余計な情報として「ノイズ」と言われても仕方ありません。

UMLには可視性を書かなくても構文的に問題ないため、可視性の情報無しでも大丈夫です。
しかし、それでは次のような問題が起こりえます。

UserクラスがInformationクラスと関連しているクラス図

UserクラスがInformationクラスと関連しているクラス図

@startuml
class User {
    printText()
}

class Information {
    text
    message
}

User --> "1\ninfo" Information
@enduml

さて、上記のクラス図から「UserクラスはInformationクラスのtext変数を参照しているが、message変数は参照していない」という情報を読み取れるでしょうか。

UserクラスがInformationクラスを持っているPythonコード

class User:
    info = Information()
    # クラス図におけるprintText()メソッドと対応
    def print_text(self):
        print ("{}".format(info.text))

class Information:
    text = "This is printed"
    message = "Oh no!"

お分かりの通り、クラス図からでは理解できません。
しかし、クラス図から変数の利用状況が理解できなければ、結局コードを読まなければならず、UMLの浸透には貢献できません。

余談ですが、クラス図ではprintTextとキャメルケースにしているところ、Pythonコードではprint_textとスネークケースにしています。
これは、UMLがキャメルケース、Pythonがスネークケースを推奨しているためです。

解決策

発想を逆転します。
設計時に可視性を決めるのではなく、コード上で利用しているか否かを判断し、それをUMLに反映してはどうでしょうか?

UserクラスがInformationクラスと関連しておりmessage変数は利用していないクラス図

UserクラスがInformationクラスと関連しておりmessage変数は利用していないクラス図

@startuml
class User {
    - printText()
}

class Information {
    + text
    - message
}

User --> "1\n- info" Information
@enduml

上記のクラス図から、「少なくとも」Informationクラスのmessage変数を外部クラスは参照していないことがわかります。
また、他の変数(info)やメソッド(printText())についても、外部からの参照はないことがわかります。

上記のクラス図を見ただけで、Informationクラスはtext変数にのみ注意すればよく、message変数はInformationクラス内部を見れば把握できることがわかります。

結論

どうでしょう。
あくまで視点を変えただけですから、「言われなくてもその通りじゃん」と言われればごもっともです。
UMLを設計ツールとして可視性を考えるのではなく、UMLをあくまで可視化ツールとして利用するという考え方であれば、UMLを利用しやすくなるのではないでしょうか。

ツイッターでシェア
みんなに共有、忘れないようにメモ

view_list 実践UML記述法
第1回 実践UML記述法:UMLのクラス図における関係の考察
第2回 実践UML記述法:スクリプト言語(Python, Perl, PHPなどなど)における可視性をUMLで記述する1考察
第3回 実践UML記述法:ユースケース図におけるユースケース間の関係の書き方を疑似コードから逆変換して考える
第4回 実践UML記述法:シーケンス図で継承元(親クラス)のメッセージ(メソッド)を利用する際の書き方について

Morichan

Qrunch 移転組です。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント