本記事は、 Qrunch からの移転記事です。
移転元: 実践UML記述法:スクリプト言語(Python, Perl, PHPなどなど)における可視性をUMLで記述する1考察 - 雑木林
スクリプト言語における可視性をUMLで記述する場合、リバースエンジニアリングによる結果論的可視性を書くといいかもしれない
UMLには可視性という概念があります。
Javaにおけるアクセス修飾子とほぼ同等のもの、と考えておけば間違いではありません。
public
、private
、protected
、およびpackage
です。
スクリプト言語(ここではPython、Perl、PHPといったいわゆるP言語を対象としておきます)には、絶対的な可視性はありません。
例えばPythonであれば、変数の前にアンダースコアを付けることで「疑似的に」プライベート変数を設定できますが、実際に外部から参照できないわけではありません。
スクリプト言語で開発する場合、UMLにおける可視性の情報は無意味です。
それどころか、余計な情報として「ノイズ」と言われても仕方ありません。
UMLには可視性を書かなくても構文的に問題ないため、可視性の情報無しでも大丈夫です。
しかし、それでは次のような問題が起こりえます。
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変数は利用していないクラス図
@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を利用しやすくなるのではないでしょうか。
第1回 | 実践UML記述法:UMLのクラス図における関係の考察 |
第2回 | 実践UML記述法:スクリプト言語(Python, Perl, PHPなどなど)における可視性をUMLで記述する1考察 |
第3回 | 実践UML記述法:ユースケース図におけるユースケース間の関係の書き方を疑似コードから逆変換して考える |
第4回 | 実践UML記述法:シーケンス図で継承元(親クラス)のメッセージ(メソッド)を利用する際の書き方について |
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント