エレベーターのリファレンスモデル

エレベータの要求仕様

 第2回で紹介したように、分科会では一度モデリングに行き詰まり、概念モデルからやり直しを行いました。従って以下の要求仕様を参照すると分かりますが、「キャビンが呼び出され」→「移動階に移動して」→「ドアが開いて降りる」といった非常に単純な要求仕様となっています。それでは、以下エレベータの要求仕様を参照ください。

http://monoist.atmarkit.co.jp/fembedded/uml/umlprimer03/umlprimer03a.html

リファレンスモデルの重要性を感じるケースが最近増えていますが、エレベーターの仕様のように一見簡単でいて実は実装しようとするといくつかの落とし穴にはまる話を読んで、実際に問題仕様のままリリースされたエレベーターシステムに合った時のことを思い出しました。

昨年、半年ほど滞在した赤坂にある某ウィークリーマンションのエレベーターなのですが・・・*1

  • エレベーターは2基あります。
  • 1基は1階、もう1基は6階で待機しています。(客がいない場合)
  • 1〜5階で呼ばれた時は、1階側の待機エレベーター、6階以上の階で呼ばれた時は6階側の待機エレベーターが対応します。待機エレベーターがないときは通過予定になっているエレベーターが対応します。
  • エレベーター内のボタンを押せばどの階にでも行けます。

制御系プログラムの仕様としては普通かな・・と思えるのですが。問題は詳細仕様で。
おそらくこんな仕様があったのでしょう。

  • エレベーターの進行方向の表示はエレベーターコントローラーに問い合わせてその結果を表示する。

4階から下向きのボタンを押すと、普通は1階で待機しているエレベーターが下から上がって来ますが、4階に到着して扉が開いてもエレベーターの進行方向は上矢印のままです。エレベーターに乗り込んで、1階を選択して扉が閉まるまでその表示が変わることはありません。4階に止まったということはその段階では、上の階で呼んでいる客がいないことはわかるのですが、到着後、扉が閉まりきるまでに上の階で呼び出されると困ったことになります。もし上の階で待っている客がいた場合、エレベーターに乗り込んだ後、意図せず上層階に連れられてしまうのです。実際なんどかそういう体験をしました。

驚くのはこういう状態でリリースされてしまったという事実です。たぶんテストケース的にはセーフだったんだと思いますが、なんとなく命を預ける装置だけに気持ち悪い感じがします。
ところで、この仕様が気持ち悪いのは、現在の一般的なエレベーター仕様と違う動作をしているからです。上記仕様でも、客の先行選択権を強く認めるか否かという思想の問題なのですが、下向きのボタンに対して対応したエレベーターは下に行くものという「リファレンスモデル」が一般化された現在においては、キモイ仕様ということでバグか?とさえ思ってしまうわけです。

エレベーターの仕様を書くときは、一般的なリファレンスモデルを参照したいですね。便利にする追加仕様はその枠組みを外さない範囲で努力したいところです。

*1:興味のある方は是非現地を訪れてください