SlideShare a Scribd company logo
ドメイン駆動設計やるなら
スモールオブジェクトプログラミング


    小さなオブジェクトで
  ドメインモデルを組み立てる
 豆ナイト :
 ドメイン居酒屋~モデル駆動プログラミングの集い
           2012年10月26日
        有限会社 システム設計 増田
Domain-Driven Design (DDD)

 ドメイン駆動設計
ドメイン駆動
        興味を持つ
利用者の
やりたい事
        会話する
        モデルで仮説
    コードで実験
ドメインモデルの開発
部品探しの旅   イテレーティブで発見的な活動


  モデリング
           プログラミング

   リファクタリング
利用者のやりたい事の粒度
    会員登録で メールアドレスが必要。
    アドレス形式チェック。
    存在しないアドレスを拒否。
    フリーメールは不可。
    拒否するフリーメールのドメインリスト。

    Biglobe はサブドメイン方式。
    携帯メールも不可。

個々の関心事を小さな部品で表現する
やりたい事の追加や変更=部品の追加・入替え
業務の概念の粒度
日付 (時分秒を持たない)            金額            管理番号,登録番号
時分(秒を持たない)               単価            取引先コード
翌営業日, 休前日                数量,数量単位,換算    取引区分
月末,月初, 四半期, 半期, 年度       消費税,税率,端数処理   契約番号
期間                       合計,小計,総合計     商品番号
有効期限                     数量割引          型式コード
予定日                      キャンペーン価格      製造番号
期限切れ一週間前のアラート            季節料金          シリアルナンバー
前日のリマインダ                 キャンセルポリシー     …
…                        …

Date, String, BigDecimal, Long, …
            小さな部品に
プリミティブな型をラッピングした

業務に必要なデータとロジックをカプセル化
小さな部品で組み立てる
              インタフェース役       小さく(50行以下)
                             役割が明確な
                   調整役       オブジェクトが
                             小数の隣人と協力する


  構造保持役           情報保持役
                                     制御役

              サービス提供役


                          サービス提供役      サービス提供役
情報保持役     情報保持役


情報保持役   サービス提供役           インタフェース役     インタフェース役
アンチパターン
大きな部品                  get
10以上のimport文           get
                       get
5以上のインスタンス変数           set
10行以上の長いメソッド           set
                       set
100行を超えるクラス                  データ入れ物クラス
                             getter/setter だけ
ひとつの部品(クラス)が
いろいろ知っていて、 業務の構造や業務ルールの理解が不十分。
             よく分からないまま作った、とりあえずの置き

なんでもやりたがる んでいく(偶発的凝集)
             場所(クラス、パッケージ)に、なんでも突っ込
ドメインモデルの
 小さな部品たち
基本の練習
ドメイン駆動設計への道
             テクニック               オブジェクト      For
                 メソッドの構成         設計スタイル      Thoughtful Developer
                 オブジェクト間の特性の移動
小さく作る練習          データの再編成         役割ステレオタイプ   Leading Designer
OO エクササイズ        条件記述の単純化        小数の隣人と協力
9つの簡単なルール        メソッド呼び出しの単純化




                                                 ドメインの理解
                                                 言葉の力
      実装の哲学                                      モデル駆動
     クラス
     振る舞いとメソッド
     状態とコレクション
ドメインオブジェクトの設計と実装



   小さく作る
   クラス     50行以内
   メソッド    3行以内
   パッケージ   10ファイル以内
3行メソッド
nextStage()
{
   ready();
   set();
   go();
}
       こういうのが良い感じ
必然的に
   オブジェクト指向(小さく)
   になる


   9つの簡単なルール
          「Thought Works アンソロジー」
            第5章 オブジェクト指向エクササイズ

原文 http://www.bennadel.com/resources/uploads/2012/ObjectCalisthenics.pdf
小さく作る練習
1.ひとつのメソッドのインデントは1段階まで
2.else 句 を使わない
3.すべてのプリミティブ、文字型をラッピング
4.ファーストクラスコレクションを使う
5.1行につき、ドットはひとつ
6.名前は省略しない
7.クラス50行、パッケージ10ファイルまで
8.インスタンス変数は2つまで
9.getter/setter を使わない
小さく作る練習ガイド
                                  パターン集



第5章
オブジェクト指向エクササイズ                     パターン集
9つのルール


slideshare:

オブジェクト指向できていますか?
http://www.slideshare.net/MoriharuOhzu/ss-14083300

オブジェクト指向エクササイズのススメ
http://www.slideshare.net/yojik/ss-1033616

オブジェクト指向の設計と実装 学び方のコツ
http://www.slideshare.net/masuda220/ss-14263541

                              原文    http://www.bennadel.com/resources/uploads/2012/ObjectCalisthenics.pdf
ドメインモデルの
 小さな部品たち
実践の小技
How より What
「複雑」を簡単に
汎用部品 より 専用部品
委譲の隠蔽
 if を使わない
 for を使わない
 setter を使わない
 getter を使わない
How        より   What
expireDate.add(-1);

expireDate.previousDay();

expireDate.dayOfFinalAlert ();
factoring : 因数分解


 複雑を簡単に
x2-4xy+4y2-2x+4y-8


 (x-2y-4)(x-2y+2)


        a = x-2y
        (a-4)(a+2)
汎用部品       より    専用部品
String             AreaCode
Long               EntryNumber
BigDecimal ラッピング
                   Amount
Date               ExpireDate
List<Appoint>      Appointments

 なんでも屋               目的特化
委譲の隠蔽
entrySheet.applicant().personName().familyN
ameKana().substring(0,1);


entrySheet.indexKey();

(Eclipse)
 alt + shift +s, M, M → 委譲メソッドの生成
 alt + ctrl + H → 呼び出し階層
呼び出し階層ビューで名前変更/移動のリファクタリング
if を使わない
enum
Strategy/State パターン
Missing Object パターン (null object パターン)
Map
Set
…
for を使わない
・ファーストクラスコレクションに隠す
・Collection フレームワーク API の復習
        たとえば、TreeMap, TreeSet
必要なら
・Comparable の実装
・Comparator の実装
・equals()/hashCode() の override
setter を使わない
完全コンストラクタ
  Value Object パターン
  生成時に必要な値をすべて渡す

状態を変えたい時
  新しいオブジェクトを作る
  ライフサイクルの短いクラスの導入
  (状態を固定できるまで細分化)
getter を使わない
@Deprecated
   フレームワークは使っていいよ
   アプリケーションでは使っちゃだめよ

get して何したいの?
    ロジックの移動    (データにロジックを寄せる)
    フィールドの移動   (ロジックにデータを寄せる)
まとめ
・ドメインモデルは小さな部品で
・業務のやりたい事の粒度に注目
・小さく作る練習
・実践の小技

More Related Content

ちいさなオブジェクトでドメインモデルを組み立てる