スライド 1

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 合同勉強会