単位が異なれば同じ物でも異なるクラスになる#
「一個売りしているリンゴ」をシステムで扱う場合、どのような属性が必要になるかを考えてみます。- 品種
- 重さ
- 売り値
- 入荷日
- 品種 (同じ山には同じ品種を乗せる前提)
- 重さ (一山あたりの総重量)
- 売り値 (一山あたりの総額)
- 個数
「一山売りしているリンゴ」では、
- 一個あたりの売り値(平均の売り値)を返す
これらから解るように、「リンゴ」というクラスが設計段階、特に分析クラス図で出てきても、
- それが一個なのか一山なのかを確定させないと正しいクラスとして設計できない
- それを扱う単位が異なれば異なるクラスになる
要件の中に出てくる単位を見逃さない#
前項で解るように、単位は非常に重要です。ここで言う単位は物理学で言うものではなく、業務を遂行する人たちがあるものをひとかたまりとして扱う大きさのことです。- 一伝票
- 一明細
- 一会社
- 一組織
- 一箱
- 一取引
- 一件
- 一覧
実際のシステムでは一件クラスと一覧クラス#
このページの見出しにあるリンゴ一個とリンゴ一山」は、実際のシステムではどう考えればいいのでしょう? 答えは簡単で、- 『一件』と『一覧』は異なるクラスとして設計・実装する
例えば業務要件を聞いている中で「顧客会社クラス」が出てきた場合は、
- 「顧客会社一件クラス」
- 「顧客会社一覧クラス」
![]() |
![]() |
入荷業務で良く出てくる、
- 入荷伝票
- 入荷明細
![]() |
さらに、
- 入荷伝票一覧クラス
- 入荷伝票一件クラス
- 入荷明細一覧クラス
- 入荷明細一件クラス
![]() |
モノ | 一覧 | 一件 |
---|---|---|
入荷伝票(ヘッダ) | ○ | ○ |
入荷明細 | ○ | ○ |
しかし上の図を見て、次のような設計でいいのではないかと気付いた人がいるかもしれません。伝票一件が明細一覧も兼ねる形です。
![]() |
- 入荷伝票クラスは入荷明細に対する一覧クラスを兼ねている
また、
- 伝票に依存しない明細一覧オブジェクトを形成したい
- 全ての伝票の中から商品Aだけの明細一覧を表示する
それとは別に、入荷伝票とは独立して入荷明細を一覧化するためのクラスも設計します。

RDBならば一レコードと一テーブルが別クラス#
永続化装置としてRDBを使うことが実際の開発では日常的です。この時には、RDBテーブル一つに対して- 一レコードクラス
- 一テーブルクラス (複数レコードを扱う時のクラス)
一テーブルクラスというのは少し解りにくいのですが、複数のレコードを扱う時に使います。複数のレコードというのは最大でそのテーブルの全件を持つことになり、言葉を換えると「一テーブル分」となります。これも前項で出てきた一覧クラスと同等です。
関係をまとめると、
- 一件クラス ⊇ 一レコードクラス
- 一覧クラス ⊇ 一テーブルクラス
その上で、「RDBルから一件を取得する処理」と「RDBから一覧を取得する処理」をそれぞれのクラスの中に実装します。次のような形です。
![]() |
「複数件」が出てきたら一山クラスを作る#
RDBテーブルに限らず、同じものを複数件扱う要件が出てきたならば「一山クラス(一覧クラス)」を必ず作ります。これをせずに実装者任せにして何でもかんでもList(配列)に入れて実装してしまうと、いざ仕様変更が発生した時にあちこちを修正することになっていまいます。Javaで実装する場合、ListやMapなどのコレクション(Collection)を一山クラスの内部で使います。
![]() |
ソートに限らず、業務的な処理も一覧の中に実装します。例えば、「数量の一番多い明細を返す」という処理です。
![]() |
まとめ#
- 単位が換われば異なるクラスにする
- 複数件を扱う場合は一覧クラスを必ず作る
コラム#
つい最近(2011年7月)ですが、「Grailsの開発においてリンゴ一山クラスを見逃していた結果、仕様変更の反映が数十ヶ所に及んでしまい工数をロスしました。」と、うちの若手が後悔していました。リンゴ一山クラスを作成せずに何でもかんでもList(配列)に入れて実装してしまうと、似たような処理があちこちに作られる危険が高くなります。データと処理が分離されてしまうからです。
皆さんの開発現場において設計者がリンゴ一山クラスを見逃しているようならば、このページの内容を参考にして指摘してあげて下さい。
添付ファイルの追加
ログイン済のユーザのみが添付ファイルをアップロード出来ます。
添付ファイル一覧
Kind | Attachment Name | Size | Version | Date Modified | Author | Change note |
---|---|---|---|---|---|---|
gif |
apple_1ko.gif | 2.2 kB | 1 | 11-7-2011 03:13 | ytp | |
gif |
apple_1yama.gif | 3.1 kB | 1 | 11-7-2011 03:13 | ytp | |
png |
nyuuka1.png | 0.9 kB | 1 | 11-7-2011 04:41 | ytp | |
png |
nyuuka2.png | 2.8 kB | 3 | 31-12-2011 20:32 | ytp | |
png |
nyuuka3.png | 4.6 kB | 4 | 19-2-2012 22:30 | ytp | |
png |
nyuuka4.png | 4.1 kB | 4 | 19-2-2012 22:31 | ytp | |
png |
nyuuka5.png | 8.8 kB | 4 | 19-2-2012 22:31 | ytp | |
png |
nyuuka6.png | 2.7 kB | 2 | 31-12-2011 20:33 | ytp | |
png |
nyuuka7.png | 4.0 kB | 3 | 31-12-2011 20:33 | ytp | |
png |
nyuuka8.png | 5.5 kB | 1 | 19-2-2012 22:31 | ytp | |
png |
single_multiple.png | 1.5 kB | 3 | 31-12-2011 20:31 | ytp |
«
This particular version was published on 19-2-2012 22:30 by ytp.