DataSetとドメインモデル そのメリットとデメリット 囚人 わんくま同盟 大阪#2 & 東京#1 合同勉強会 事例 • • • • ショッピングサイトの作成 顧客、商品、伝票の3つのテーブル 顧客の「ランク」によって「商品価格」 は割り引かれる 「購入処理」が行われると購入した 「顧客のID」「商品のID」「購入価格」 が伝票テーブルに追加される 伝票 PK ID FK1 FK2 顧客ID 商品ID 購入価格 顧客 PK ID 名前 ランク 商品 • • • 顧客のランクは次の通り 「通常会員」…割引なし 「お得意会員」…10%割引で買える • ランクは仕様変更が十分に考えられ る。 Visual Studio 2005 を使う。もちろん Webアプリケーション。 • PK ID 名前 価格 わんくま同盟 大阪#2 & 東京#1 合同勉強会 処理の流れ 商品一覧 ボールペン 鉛筆 シャーペン 消しゴム … … … ボールペン 500円 300円 400円 100円 … … … ボールペン 詳細を見る 詳細を見る 詳細を見る 500円です。 このボールペンは… 購入 詳細を見る ログイン 購入結果 450円でボールペンを買いました。 ログイン わんくま同盟 大阪#2 & 東京#1 合同勉強会 DataSetを使う • テーブルを設計 伝票 PK ID FK1 FK2 顧客ID 商品ID 購入価格 顧客 PK ID 名前 ランク 商品 PK ID 名前 価格 わんくま同盟 大阪#2 & 東京#1 合同勉強会 DataSetを使う • TableAdapter、DataSetをウィザードで作成。 わんくま同盟 大阪#2 & 東京#1 合同勉強会 DataSetを使う ・GridView、ObjectDataSourceを使ってウィザー ドで商品一覧ページの作成 商品一覧 ボールペン 鉛筆 シャーペン 消しゴム … … … 500円 300円 400円 100円 … … … 詳細を見る 詳細を見る 詳細を見る 詳細を見る わんくま同盟 大阪#2 & 東京#1 合同勉強会 DataSetを使う • 購入処理(購入価格の決定) decimal price; DataSet1.CustomerDataTable t = adapter.GetDataById( 1 ); DataSet1.CustomerRow customerRow = t[ 0 ]; if( customerRow.Rank == 1 ) { price = productRow.Price; } else if( customerRow.Rank == 2 ) { price = productRow.Price * 0.9; } else { throw new ApplicationException( "何だこのランクは!" ); } わんくま同盟 大阪#2 & 東京#1 合同勉強会 ドメインモデルを使う • クラスを設計 Customer Product +ComputePrice() NormalCustomer GoodCustomer +ComputePrice() +ComputePrice() わんくま同盟 大阪#2 & 東京#1 合同勉強会 ドメインモデルを使う • データベースと各オブジェクトをマッピング。 • テーブルを設計 • コードを書くか、O/Rマッピングツールを使う。 わんくま同盟 大阪#2 & 東京#1 合同勉強会 ドメインモデルを使う • GridView、ObjectDataSourceを使ってウィザー ドで商品一覧ページの作成 商品一覧 ボールペン 鉛筆 シャーペン 消しゴム … … … 500円 300円 400円 100円 … … … 詳細を見る 詳細を見る 詳細を見る 詳細を見る わんくま同盟 大阪#2 & 東京#1 合同勉強会 ドメインモデルを使う • 購入処理(購入価格の決定) decimal price; Customer c = adapter.GetCustomerById(1); price = c.ComputePrice( product ); わんくま同盟 大阪#2 & 東京#1 合同勉強会 DataSetを使う • メリット • • 生産性が圧倒的に高い。ウィザード等で済ませられる事が可能。 .NETの既存のコンポーネントとの親和性が高い。 • デメリット • • ポリモーフィックな手続きを行いにくい。 DecimalはDecimal、IntはIntとしか扱えない。 わんくま同盟 大阪#2 & 東京#1 合同勉強会 ドメインモデルを使う • メリット • • ポリモーフィックな手続きを行える。 DecimalはMoney、IntはProductIdとして扱える。 • デメリット • • O/Rマッピングがかなり負担になる。 DataSetを使うことを前提としたコンポーネントがあれば、不協和状態になる。 わんくま同盟 大阪#2 & 東京#1 合同勉強会 ディスカッション • 結局何を使うべきか? わんくま同盟 大阪#2 & 東京#1 合同勉強会
© Copyright 2024 ExpyDoc