物事を決められない人って、あなたの周りにもいると思います。一緒にレストランに入っても、いつまでもメニューを決められないとか・・・
決断できず行動までに時間がかかる人です。課題に直面したとき、あれもこれもと考えてしまうことで、スッキリした解決策が見いだせず、頭のなかがぐるぐるまわり、一種の思考停止になるタイプです。
そのようなタイプは、考え方をシンプルにする方法を身に付けるのがいいと思います。
「関心の分離」という、ソフトウエアで疎結合を実現するにあたっての原則があります。関心の分離によってモジュールが定義され、それらが疎結合で結ばれることで保守が簡単になります。ソフトウエアに新たな課題が与えられても、柔軟に対応することが可能です。
Webアプリケーションの開発エンジニアはクラス図を描くので「関心の分離」はよく知っていると思います。ただ「関心の分離」はエンジニアだけでなく、誰もが知って損は無いと思います。「関心の分離」の考えを持つことで、物事を考えるとき、どの部分に焦点をあてるべきかを整理することができます。これは一種のロジカルシンキングです。
ここでは概念レベルで「関心の分離」について書いてみます。
「関心の分離」とは、言葉どおり、たくさんある関心の集まりを一定の基準で分離することです。「関心の集まり」の箱は、関心事が密集したいわば密結合の状態を指しています。関心を何らかの基準で分離することで、密から疎になります。
ここでは、例として「販売システム」を関心事で分離してみます。
「販売システム」と聞いて、皆さんのとらえ方は多種多様です。
生命保険の勧誘をするシステムのことか。
ネットショッピングのことか。
「販売」の言葉からいろいろなシステムの連想ができますが、正解も不正解も分かりません。なぜなら「販売」以外の具体的な情報がないからです。販売に関わる関心事はたくさんあるものの、それを分離する基準がないので「販売」という関心の集合体を分けることはできません。
関心を分離するには、利用者がシステムにどのような要求を期待しているかの情報が必要です。利用者の要求が関心を分離するための基準になります。利用者の要求を洗い出すツールはいろいろありますが、ここでは「ユースケース図」というのを使います。
「ユースケース図」は下図のように、アクターと呼ばれるシステムの利用者が、システムに対して要求している事項を分かりやすく例示した絵です。この成果物は、ITエンジニアと、ITの専門家ではない一般の利用者と話をしながら描きます。システムの中身はブラックボックスとして、システムの外側だけに利用者の意識が注ぐよう工夫された図です。このツール自体が利用者の関心事と、システムを設計・開発するITエンジニアの関心事を分離しています。
今回、次のユースケース図を描きました。この情報から関心を分離していきます。
まず、以下のユースケースに着目します。赤字を見ると、この販売システムは、商品の売上実績を登録する機能が必要です。
売上実績の中心は金額です。売上を計上した金額への関心でひとつの箱ができそうです。一方、商品に対する関心は売上の関心と関係はしていますが、別な箱にする方がスッキリします。ですので、先ほど書いた「販売」という密な箱をこのように分離します。
次にこのユースケースに着目します。先ほどのユースケースでは「商品の売上実績を登録する」でしたが、ここでは売上実績をあげた販売員を登録する機能を要求しています。
この販売システムには、何を売ったかという関心事と、誰が売ったかという関心事があることに気がつきます。ですので、関心事をこのように分離します。
次にこのユースケースに着目します。商品の名前と価格と書いています。この文脈は、名前と価格は商品の関心事を示す、具体的な属性と読めます。ですので、赤字で書いた名前や価格を商品とは違う関心事として分離する必要性はありません。
続いてこのユースケースです。唐突にキャンペーン期間という言葉が出てきます。
キャンペーンは独立した箱にしておく方がスッキリしますが、この箱がどこの箱と関係しているかを読み取ることはできません。ですので、以下のように独立した箱として記載しておきます。
最後にこのユースケースをみます。キャンペーン期間と割引率は密に関連しています。また、商品の価格というのは、割引率を考慮した商品の価格という意味です。
価格は商品の属性として定義しています。割引率を考慮した商品の価格は、商品の箱とキャンペーンの箱を関連させることで、容易に求められます。そのため、商品とキャンペーンの箱を関連づけします。
このようにユースケースに記載された情報から「販売」という関心の集合体は、「販売員」「売上実績」「商品」「キャンペーン」という関心事の違いによって分類できます。
話をはじめに戻すと、わたしはレストランで何を注文するかを決めるのに1分もかかりません。わたしが注文システムに要求するユースケースはこうです。
わたしはメニュー表をみて、注文する可能性のある複数のメニューをひとつひとつ指さしながら、
「どれにしようかなてんのかみさまのいうとおり」
と心の中で念じます。
そして、最後に指さしたものを注文します。
そんなわけで今日は大船に用があって行ったんですが、お昼ご飯は地元で人気がある居酒屋さんの臥薪 (がしん) へ。
心の赴くままに注文しました。
美味しかった~