本日のお裾分け

日々の開発で得た知識をシェアします。Java/Scala/Ruby/javascript

【MEAN+TypeScript+DDDシリーズ】 はじめに

MEANスタック+TypeScriptでDDD開発シリーズ mrdshinse.hatenablog.com

サービス設計について

今回は、家計簿の管理を簡易化するアプリケーションを作ることにします。
想定ユーザーは共同生活をしている2人組とし、同棲やルームシェアで共通の財布を作っている人達が、お金の管理でモメない事を目的とします。

入力インターフェースは普段使っているコミュニケーションツールのLINEを利用し、LINE Botに話しかける事で誰が何にいくら使ったかを記録し、Botがお金を払いすぎている人を教えてくれる事を要件とします。

先月いくら使ったか?などサマリーを見る事でお金の使いすぎなど予算計画を立てられるよう、Webブラウザから毎月のサマリーなどをグラフィカルに確認できる事も要件としましょう。

上記を機能に落とし込むと、以下のような感じでしょうか。

機能一覧

  • LINEチャットBot
    • 支払いイベント登録
    • 現在の支払い状態確認
  • Webアプリケーション
    • 支払いイベントモニタリング画面
    • 支払いサマリー画面

DB設計について

データはどのように保持しましょうか?
複数人で開発をする場合、コミュニケーションを取る上でDBスキーマの認識を合わせておいた方が安心して開発を進められます。
ざっくりと上記要件を落とし込むと、以下のような形になるでしょうか。

//支払いイベント
const paymentEvent = {
  who: {
    userId: 'abc123',
    userName: 'ビョーン・イエロッテ(Björn)'
  },
  when: '2017-03-01 12151200',
  amount: 3250,
  purpose: 'ランチ代',
  meta: {
    createdBy: 'chatbot',
    createdAt: '2017-03-01 12151200'
  }
};

//支払い状態
const paidStatus = {
  when: '2017-03-02 23454000',
  units: [{
    who: {
      userId: 'abc123',
      userName: 'ビョーン・イエロッテ(Björn)'
    },
    balance: 1625
  },{
    who: {
      userId: 'xyz789',
      userName: 'イェスパー・ストロムブラード(Jesper)'
    },
    balance: -1625
  }],
  meta: {
    createdBy: 'chatbot',
    createdAt: '2017-03-02 23454000'
  }
}

//支払いサマリー
const paymentSummery = {
  period: {
    from: '2017-02-01 00000000',
    to: '2017-03-31 23595999',
  },
  type: 'total',
  units: [{
    who: {
      userId: 'abc123',
      userName: 'ビョーン・イエロッテ(Björn)'
    },
    amount: 3250
  }],
  meta: {
    createdBy: 'webapp',
    createdAt: '2017-03-01 12151200'
  }
}

今回はここまで。

DDD(ドメイン駆動設計)を勉強する際は、以下の2冊がオススメです。

実践編

理論編