ひがやすを技術ブログ

電通国際情報サービスのプログラマ

ダイコン時代の設計手法 - ユースケースなんていらない

http://d.hatena.ne.jp/akon/20040620#p3やそのコメント
http://d.hatena.ne.jp/higayasuo/20040620#1087744106
http://d.hatena.ne.jp/habuakihiro/20040621#1087747725
とやり取りしていたのですが、お互いいってることが微妙にずれる。
ユースケースFDDロバストネス分析など確立されていると
思われているものをベースにしているにもかかわらずです。
原因の1つはユースケースのもつ曖昧さだと思ってます。
ユースケース図はあまり意味がない。
なんだよあのかかしと楕円はふざけてるのか(言い過ぎ)。
ユースケースの粒度やユースケースの書き方もコーバーンが
うまくまとめてくれてますが、コーバーンのようにユースケースがかける人が
世の中にそんなにいるとは思えない。
そんな難易度高いものを使うってどうよと思ってしまうわけです。
私は、目の前のプロジェクトあるいは直ぐにでも始まろうとしている
プロジェクトを成功させたいだけで、難しいことや属人性の高いものや
教育コストがかかることはできるだけ避けたい。
というわけで結論早すぎですが


ユースケースなんて要らない
FDDベースで整理し直します。

ダイコン時代の設計手法 - FDD

FDDはFeature Driven Developmentの略でシステムがユーザに提供する価値を
Feature(ユーザ機能)に分解してユーザ機能ごとに開発していきます。
ユーザ機能とはで表現されるものです。
なんじゃいそりゃー。VO(動詞 + 目的語)。「〜を〜する」で表現される
ものって置き換えても多分大丈夫とおもふ。


人によって粒度がぶれるのを避けたいので、UIごと(HTMLの1ページ)に
ロバストネス分析することを推奨したい。
ユーザ機能ごとだと粒度が細かすぎる気がします。 -> はぶさん
ロバストネス分析すると

  • UI(バウンダリ)にどのようなイベント(コントロール)が起こってどのUI(バウンダリ)に遷移するのか
  • コントロールがアクセスするエンティティ

が洗い出されます。
ロバストネス分析と平行して

  • UIモック
  • UI仕様書
  • エンティティ仕様書
  • ユーザ機能仕様書

を作成します。
用語がぶれてますがいずれ統一します。m(_ _)m
コントロールは、UI層のコントローラ、サービス層、永続化層に分解し、
UI層のコントローラの仕様はUI仕様書に記述し、
サービス層の仕様はユーザ機能仕様書に記述し、
永続化層の仕様は必要ならSQL仕様書に記述します。(いらんかも)
コントロールはロバストネス分析時には、リンクやボタンのクリックといった
イベントごとにVOの1センテンスで表現され、ユーザ機能に落とすときに、
事前条件・事後条件をつめていくイメージでいます。-> id:akonさん
良い機会だと思っているので、粒度・用語・設計手法はできるだけ
イメージをあわせましょ。

ダイコン時代の設計手法 - PetStore(1)

http://www.javagen.com/petstore/
を例に考えてみます。
私は正直言うと
http://examples.macromedia.com/petmarket/store.htmlのほうしか
しらないので細かいところは若干異なるかも。


最初は、「カテゴリを表示する」です。
5つの動物がカテゴリです。
最初にロバストネス分析を行います。
カテゴリを取得する(C) -> カテゴリ(E)
∟初期ページ(B)
初期ページ(B)は状態として、カテゴリ(E)のリストを持ちます。
カテゴリ(E)はcategoryoid, categorydisplayname, categoryname, color
で構成されます。


次は、カテゴリを取得する(C)を各クラスにマッピングします。

  • GetCategoriesAction(UI層のコントローラ)
  • CatalogService#getCategories()(サービス層)
  • CatalogyDao#getCategories()(永続化層)

カテゴリを取得する、プロダクトを取得する、アイテムを取得するという
ユーザ機能で提供されるサービスをCatalogServiceにまとめています。
永続化層はエンティティ(この例ではCatetory)ごとに作成します。
GetCategoriesActionはCatalogServiceをプロパティに持ち、
CatalogServiceはCatalogyDaoをプロパティに持ちます。
コンポーネントの定義は次のような感じ。


<component class="GetCategoriesAction"/>
<component class="CatalogServiceImpl"/>
<component class="CategoryDaoImpl">
<aspect>
<component class="...S2DaoInterceptor"/>
</aspect>
</component>
教祖のリクエストに応じてがんばって書いてみました。