2017-10-21

この記事に関連するサービス
Webアプリケーションの設計・構築・保守
この記事に関連するお問い合わせ

第3章 :クラスの見つけ方

カヤバ ショック リア(左右) ■KYB New SR Special 日産 セドリック/グロリア PY32 91/06~95/05 (GT/SV) (VG30D)【NSG9135 ×2】

格安新品カヤバ ショック リア(左右) ■KYB New SR Special 日産 セドリック/グロリア PY32 91/06~95/05 (GT/SV) (VG30D)【NSG9135 ×2】

一個売りしているリンゴ」をシステムで扱う場合、どのような属性が必要になるかを考えてみます。

  1. 品種
  2. 重さ
  3. 売り値
  4. 入荷日

などが考えられます。それでは、「一山(ひとやま)売りしているリンゴ」はどうでしょうか?

  1. 品種 (同じ山には同じ品種を乗せる前提)
  2. 重さ (一山あたりの総重量)
  3. 売り値 (一山あたりの総額)
  4. 個数

上記を較べてみると、同じリンゴでも違いのある事が解ります。処理を考えてみるとさらに明らかになります。
「一山売りしているリンゴ」では、

  • 一個あたりの売り値(平均の売り値)を返す

というメソッドがすぐに思い浮かびます。
これらから解るように、「リンゴ」というクラスが設計段階、特に分析クラス図で出てきても、

  • それが一個なのか一山なのかを確定させないと正しいクラスとして設計できない

のです。裏を返すと、同じリンゴであっても、

  • それを扱う単位が異なれば異なるクラスになる

ことを理解して設計する必要があるということです。

要件の中に出てくる単位を見逃さない

前項で解るように、単位は非常に重要です。ここで言う単位は物理学で言うものではなく、業務を遂行する人たちがあるものをひとかたまりとして扱う大きさのことです。

  • 一伝票
  • 一明細
  • 一会社
  • 一組織
  • 一箱
  • 一取引
  • 一件
  • 一覧

など色々ありますが、人間が何かをひとかたまりとして扱い、そのかたまりの種類が異なる場合には必ず単位が異なります。もちろん、非常に汎用的な「一個」という単位はあちこちに出てきますが、その場合は「何々一個」というように聞き分けて設計していけば問題ありません。

実際のシステムでは一件クラスと一覧クラス

このページの見出しにある「リンゴ一個とリンゴ一山」を実際のシステムではどう考えればいいのでしょう? 答えは簡単で、

  • 『一件』と『一覧』は異なるクラスとして設計・実装する

です。『一件』がリンゴ一個に相当し、『一覧』がリンゴ一山に相当します。
例えば業務要件を聞いている中で「顧客会社クラス」が出てきた場合は、

  1. 「顧客会社一件クラス」
  2. 「顧客会社一覧クラス」

の二つの可能性があります。 顧客会社を一件のみ、つまり一会社として扱う時のクラスが「顧客会社一件クラス」です。顧客会社を複数件で、つまり一覧として扱う場合は「顧客会社一覧クラス」を作ります 。そして、

  • 一覧クラスは一件クラスを内部で複数持つ

ように設計します。ほとんどのシステムにおいてその両方が必要です。。

別の例を出しましょう。入荷予定の結果クラスである「入荷伝票」を考えてみます。

入荷業務で良く出てくる、

  • 入荷伝票
  • 入荷明細

は、「一伝票」と「一明細」というように単位が異なるので別クラスとして定義します。伝票は、ある仕入れ先からのある日の入荷物全体を表現しています。伝票ヘッダとも言われます。明細は商品単位の情報を持っており、一伝票が複数の明細を持つ形です。

さらに、

  1. 入荷伝票一覧クラス
  2. 入荷伝票一件クラス
  3. 入荷明細一覧クラス
  4. 入荷明細一件クラス

というように、それぞれ一覧と一件というように4つに分けて考えます。

これらのクラスの考え方は次の通りです。「一伝票」「一明細」というように異なる単位で呼ばれる物を見つけたら、それらをさらに「一覧」「一件」というふうに分けて考えます。

モノ 一覧 一件
入荷伝票(ヘッダ)
入荷明細

しかし上の図を見て、次のような設計でいいのではないかと気付いた人がいるかもしれません。伝票一件が明細一覧も兼ねる形です。

実は、

  • 入荷伝票クラスは入荷明細に対する一覧クラスを兼ねている

のです。また、

  • 伝票に依存しない明細一覧オブジェクトを形成したい

場合に上記ではうまくいきません。例えば、

  • 全ての伝票の中から商品Aだけの明細一覧を表示する

というような要件に対応できないのです。入荷明細一覧クラスから参照できる入荷伝票が1つしかないことになり、

  • 入荷明細に商品Aを持つ複数の入荷伝票

という関係を表現できません。 このため、入荷伝票が入荷明細一覧クラスを兼ねる形で設計しておくようにします。
それとは別に、入荷伝票とは独立して入荷明細を一覧化するためのクラスも設計します。次のような形です。

上記図のカージナリティに注意して下さい。

  • 入荷伝票一件クラスと入荷明細一件クラスは「1:1以上」
  • 入荷明細一覧クラスと入荷明細一件クラスは「1:0以上」

となります。入荷明細が1件も存在しない入荷伝票は許されません。一方で、「商品Aを持つ入荷明細」を検索した場合の結果が0件となることはあり得ます。

RDBならば一レコードと一テーブルが別クラス

永続化装置としてRDBを使うことが実際の開発では日常的です 。この時には、RDBテーブル一つに対して

  • 一レコードクラス
  • 一テーブルクラス (複数レコードを扱う時のクラス)

を必ず対(つい)で設計・実装するようにします。 一レコードクラスは前項で書いた一件クラスと同じ事です。物や結果の一件分がRDBテーブルの一レコードとして保存されます。
一テーブルクラスというのは少し解りにくいのですが、複数のレコードを扱う時に使います。

  • 複数のレコードというのは最大でそのテーブルの全件を持つ

ことになり、言葉を換えると

  • 一テーブル分

となります。これも前項で出てきた一覧クラスと同等です。
関係をまとめると、

  • 一件クラス ⊇ 一レコードクラス
  • 一覧クラス ⊇ 一テーブルクラス

となります。それぞれ何が違うかというと、一件クラスまたは一覧クラスのうちRDBに永続化する必要のあるものが一レコードまたは一テーブルという別の呼び方をされることがあるというだけです。永続化される必要の無いものは別名では呼ばれません。
その上で、

  • RDBから一件を取得する処理
  • RDBから一覧を取得する処理

をそれぞれのクラスの中に実装します。次のような形です。

この際、入荷伝票一件クラスのRDBから一件を取得する処理の中で、

  • ひも付く複数件の入荷明細を取得する処理

も実装します。

「複数件」が出てきたら一山クラスを作る

RDBテーブルに限らず、同じものを複数件扱う要件が出てきたならば「一山クラス(一覧クラス)」を必ず作ります。これをせずに実装者任せにして何でもかんでもList(配列)に入れて実装してしまうと、いざ仕様変更が発生した時にあちこちを修正することになっていまいます。
Javaで実装する場合、ListやMapなどのコレクション(Collection)を一山クラスの内部で使います。

明細の一覧を画面に表示する場合にある規則で並べたい、例えば商品順に並べたいような場合、一覧クラスの中でTreeMapクラスを使います(ただし入荷商品に重複がない前提)。そうすることで、ソート処理を別途用意する必要がなくなります。。明細一覧というデータ構造とソート処理を分離することなく実装できるのです。
ソートに限らず、業務的な処理も一覧の中に実装します。例えば、「数量の一番多い明細を返す」という処理です。

まとめ

  • 単位が換われば異なるクラスにする
  • 複数件を扱う場合は一覧クラスを必ず作る

コラム

2011年当時、「Grailsの開発においてリンゴ一山クラスを見逃していた結果、仕様変更の反映が数十ヶ所に及んでしまい工数をロスしました。」と、うちの若手が後悔していました。
リンゴ一山クラスを作成せずに何でもかんでもList(配列)に入れて実装してしまうと、似たような処理があちこちに作られる危険が高くなります。データと処理が分離されてしまうからです。
皆さんの開発現場において設計者がリンゴ一山クラスを見逃しているようならば、このページの内容を参考にして指摘してあげて下さい。

FD1-3 シビック ステンレスピラー 6P MICロゴ マットブラック,OSG EXゴールドドリル ステンレス・軟鋼用スタブ [EX-SUS-GDS-18.8] EXSUSGDS18.8 販売単位:1 送料無料

京セラ ソリッドエンドミル 2FESM03911006,[ホイール1本(単品)] SSR / EXECUTOR EX04 (BD) 19インチ×8.0J PCD:114.3 穴数:5 インセット:46,大阪魂 六角穴付ボルト ユニファイねじ並目(UNC) (SCM435/黒染め)(小箱)#6×3/16 1箱(100個),17インチ サマータイヤ セット【適応車種:アテンザセダン(GJ系)】WEDS ウェッズスポーツ SA-54R ブルーライトクロームII 7.5Jx17Bluearth RV-02 225/55R17.【1500円以上購入で300円OFFクーポン 8/18 10:00~8/23 9:59】 【送料無料(沖縄・離島を除く)】 bB 年式:H12~H17 4WD フロアマット一式 プレミアム [カラー:グレー] 【天野: カー用品 内装パーツ フロアマット】【AMANO】,16インチノートE11系MONZA JAPAN ワーウィック ヴェルネ タイプ レナ ブルーブラッククリアポリッシュ 6.0Jx16エコピア PZ-X 195/45R16.タンガロイ 外径用TACバイト SVQCL2525M16 【711-2602】,RIDEA アジャストクラッチレバー 本体:ゴールド アジャスト:シルバー TMAX,【取寄品】 NRS ミニスーパーグリーン 58×3.5×9.53 #36 25点セット 切削工具 DIY ディスクグラインダー,【メーカー在庫あり】 2626-200 クニペックス 40゜絶縁先曲ラジオペンチ 1000V.CBR250RR(MC22) ホイールタイプロングアルミビレットレバーセット レッド U-KANAYA,【送料無料】アルミ板 A5052 20x400x400mm ハイロジック A5052-20-400-40 (03017704-001) ★全品ポイント10倍!(P10倍)★税抜5000円以上で送料無料★ 激安祭,SMC ソレノイドバルブ【VZ3123-1GB-M5】[販売単位:1個売り] [入り数:1]SMC(株)【05P03Dec16】,【期間限定 ポイント10倍】タンガロイ 旋削用M級ネガTACチップ COAT DNMG150404-AS_T9115-T9115 [10個入] 【DIY 工具 TRUSCO トラスコ 】【おしゃれ おすすめ】[CB99].プーマセーフティ ヒューズ・モーション・イエロー・メン・ロー 28.0cm 64.228.028.0,カヤバ ショック リア(左右) ■KYB New SR Special 日産 セドリック/グロリア PY32 91/06~95/05 (GT/SV) (VG30D)【NSG9135 ×2】,[KYB] カヤバ ショック NEW SR SPECIAL フロント右 1本 ソニカ L405S 06/06~07/08 FF [全グレード] 送料1000円(税別) ※北海道・沖縄・離島は送料別途,エントリーでポイント10倍 9/01 09:59まで 【送料無料】 245/40R20 20インチ WEDS ウェッズ クレンツェ エルアボラ 331EVO 8.5J 8.50-20 NITTO ニットー NT555 G2 サマータイヤ ホイール4本セット フジコーポレーション.

サンドビック コロターン107 旋削用ポジ・チップ 1125 RCMT1204M0SM 1125 【10個セット】

Liugoo Leathers 最高級プレミアムカウ牛革 メンズ シングルライダース カラー:ターコイズ サイズ:M,129-5-45-H10 KUKKO 大型トラック用ボールジョイントプーラ10T,『カード対応OK!』###■〒ミズムジャパン/MISM【309050005】(7704402) 吸い取る油・水兼用パレットシート 20枚入 受注単位1.スプーン リジッドカラー(リジカラ) ホンダ エリシオン RR4 フロント用 品番: 50261-RR1-000,APP(エーピーピー) AP-8000 ニッサン シーマ FGY33・FGDY33 96.6~01.1 SFIDA(スフィーダ) ブレーキパッド.[Projectμ] プロジェクトミュー ブレーキパッド BESTOP フロント用 【デュエット M111A 00.5~04.5 1300cc】,【1500円以上購入で300円OFFクーポン 8/18 10:00~8/23 9:59】 【天野】 ウィッシュ 年式:H21~H24 (7人乗り 4WD) フロアマット一式 プレミアム [カラー:ベージュ] 【カー用品:内装パーツ:フロアマット】,[ホイール1本(単品)] SSR / EXECUTOR EX01 (FLC) 18インチ×8.0J PCD:112 穴数:5 インセット:48,カヤバ ショック リア(左右) ■KYB New SR Special 日産 セドリック/グロリア PY32 91/06~95/05 (GT/SV) (VG30D)【NSG9135 ×2】,ミツビシ ミラージュ A05A 15インチ アルミホイール 一台分(4本) LEONIS NAVIA 05 (レオニス ナヴィアゼロファイブ) マットブラック/リムポリッシュ アルミ.いつでもポイント10倍! OSG 一般加工用MTシャンク レギュラ型 ゴールドドリル EX-MT-GDR-10.3XMT1,ジキルマフラー(ステンレスタイプ) THREE ONE(スリーワン) マジェスティ(MAJESTY)SG20J(07年~),(クーポン配布中)アールズギア 03-07CB1300サイレンサーL OD WH07-02OD-XL 【送料無料】(北海道・沖縄除く),テイストマフラー ウイルズウィン(WirusWin)APE(エイプ)100.セレナ C25/CC25 ストリートシリーズ車高調 ストリート ゼロ A (econ2対応),allsafe ラッシングベルト ラチェット式シボリ50仕様重荷重 R5I17,タンガロイ 旋削用M級ネガTACチップ COAT DNMG150608L-S T9125 [入数:10] 【703-1637】,オークラ輸送機 ベルトコンベヤ ベルコンミニ3 ヘッドドライブ 蛇行レスタイプ 100V単相 DHG40UR100N09R04X.

【メーカー在庫あり】 BC57.0 756-8207 (株)ユーコー・コーポレーション YUKO フレックスホーン#AO240,【ホーザン】ドラム抜き C-349【送料込/送料無料】

カーマット フロアマット 日産 クリッパー/クリッパーリオ 15年9月~24年12月 フットレスト無-スポーツチェック ライム,日東工器 ダイヤフラム式ポンプ 真空ポンプ-コンプレッサ兼用 VC0301B-A1 (No:34397),122) リョー ビ パワーミキサー PM-1011【RCP】.ELDINE(エルディーネ) Solide(ソリード) 3D構造マット 1台分 ブルー×ブラックチェック BMW MINI R60 クロスオーバー  DMM3602CE,カーマット フロアマット ホンダ トゥデイ 5年1月~9年6月 -LUXループブラック.【72時間限定】会員ポイント最大16倍 8/19 ~8/22 迄 新品アルミホイール1本価格 20インチTSW Ascent(アセント) 20×10.0J 5/120 +25マットチタニウムシルバー 20100,CRIMSON(クリムソン) CLUB LINEA L747D (クラブリネア L747D) 17インチ 8.0J PCD:100 穴数:4 inset:33 DISK TYPE:LOW カラー:ブラックポリッシュ [ホイール1本単位]/H,17インチカローラ ルミオン全グレードWEDS レオニス NAVIA 05 マットブラック/リムポリッシュ 7.0Jx17ヨコハマ エコス ES31 215/45R17,カヤバ ショック リア(左右) ■KYB New SR Special 日産 セドリック/グロリア PY32 91/06~95/05 (GT/SV) (VG30D)【NSG9135 ×2】,【代引き不可】【クラッツィオ Clazzio】ワゴンR MC などにお勧め ダブルカラータイプ / 基本デザイン選択 カスタムオーダーシートカバー 1台分 品番:ES-0604.【MBRO】サンダーテール フルLED ブロンズ LA600S タントカスタム LA600S などにお勧め 品番:DT600TAN-3LTB-CBR-04 COLIN コーリンプロジェクト,三菱K 小径エンドミル MS2XLD0020N010 ▼671-4170 三菱マテリアル(株) MITSUBISHI.【KYO-EI WTSハブユニットシステム 11mm厚】5穴/PCD114.3mm オデッセイ用 対応型式:RB1 RB2等におすすめ,G-trick (Gトリック) SUPER SPACER System1 System2専用ロックボルトセット M12×1.5 球面 R14 首下:24mm カラー:シルバー [代金引換不可商品],ワイトレ20mm+専用スペーサー3mm【23mm】アスコット・アスコットイノーバ/ホンダ/PCD 4H-114.3■キックス Kics ワイドトレッドスペーサー&アジャスタブルプレート【2枚1SET】 こだわりのツライチ 23ミリ/2.3cm/2.3センチ,キックス/KICS ワイドトレッドスペーサー/Wide Tread Spacer M12×P1.25 4025W3 厚み25mm 4H100P1.25.

。。

{yahoojp}nice01-myp03-wl-4169