要求の仕様化

眠れなくなるような話。あるいは眠くなるような話かも。今日2時間くらい悩まされ、まだ結論がでない。

要求を仕様化する対象がシステムの構成要素であるとき、例えば、対象がシステムやサブシステムや共通コンポーネントなどであるとき、不変条件、非機能要件はどのように考えたらいいだろう。使い分けてはいるが、要件=仕様と見なして欲しい。また集合としてシステム自身もシステムの構成要素と見なしている。

対象(システムの構成要素)の仕様化では、対象にシステム要件をブレークダウンして割り付けていく。一般には、機能要件、非機能要件、外部インタフェース要件、画面要件、帳票要件で整理すべきだろう。

対象(システムやサブシステムや共通コンポーネントなど)
   |   +-- 不変条件                       = ? (静的仕様)
   |
   +-- 対象が提供すべきサービス(I/F)      = 機能要件 (非機能要件が内在)
       +-- 公開される操作                 = 機能要件
           |   +-- 事前条件/事後条件     = 機能要件
           |
           +-- 操作から利用する画面      = 画面要件 
           +-- 操作から利用する帳票       = 帳票要件
           +-- 操作から利用する他システム = 外部インタフェース要件

対象が提供すべきサービス=機能要件は操作の集合で表現できる。コンポーネントのインタフェースがメソッドの集合で表現できることでもあきらかだ。操作には事前条件、事後条件も必要であり、これらは機能要件の一部といえる。ではでは、対象に恒久的に与えられる不変条件は、機能要件なのか、非機能要件なのか、場合によるのか。つまり「どんな条件下でも同じ状態であること」というのは、機能要件なのか、非機能要件なのか。車は走ることというのは機能要件だが、走らないということ、常にじっとしているということは機能要件なのだろうか。機能は「働き」である。ただじっとしているだけでは働くことにならない。「機能しないこと」という非機能要件になると考える。この認識でよいのだろうか。

また対象に割りつけられる要件は、静的仕様と動的仕様の側面で捉えることができる。不変条件は静的仕様である。クラスに対して設定されることで明らかだ。一方、操作の事前条件、事後条件は当然、動的仕様であり、機能要件である。ではでは、非機能要件は静的仕様なのか、動的仕様なのか。多くは静的仕様であるが、動的仕様である非機能要件もあるという認識でいいのだろうか。例えば、タイミング制約などは動的な非機能要件といえる。そもそも非機能要件を動的/静的と区分する必要がないのか。見たことがない。たとえば、性能要件やアクセサビリティは動的な非機能要件で、保守性などは静的な非機能要件だとか。