by shigemk2

当面は技術的なことしか書かない

DDD入門 #ScalaMatsuri #sm_c

講師不在☆だった

  • 業務ドメインと開発を結びつけよう
  • 技術的な関心事とドメイン知識がいっしょくたになってしまう
  • 営業と開発の垣根をなくして共通言語で話していこうという話

GANMA!でDDDをやってみてから1年くらいたった

Septeni

GANMA!をDDDで作ってみたので、実際にどういう仕組で作ったのかを話

ganma.jp

  • DDD/なんか前職ではやっていた
  • DDD本を有給消化中で読んだ
  • ユビキタス言語や構造を考えてみる

漫画のモデリング

  • GANMA!の配信業務
  • 漫画雑誌を「マガジン」
  • 「ナルト1話」「ワンピース1話」を「ストーリー」
  • 一連の話を「ストーリー」

業務

  • 閲覧系
  • 管理業務

ストーリー

  • Story ID(Entity)がある
  • Author 作者
  • ページ
  • サブタイトル

それぞれを型とかtype aliasで定義している

  • ストーリーリポジトリ
    • 取得/登録/更新/削除
  • ドメイン層には言葉しかかかないようにする
  • DBへのアクセスはインフラ層

  • シリーズ(ワンピース/読み切りなど)

  • シリーズリポジトリ
  • マガジンクラス
    • ストーリー
  • マガジンリポジトリ

悩んだ

  • IDはinsertするまでIDを触れない
  • 採番テーブルを作ると手間
  • UUIDを使う

DB→Entity

  • Infra/EntityはDomain層
  • DAO/ドメイン層に生データ/Entity変換のメソッドかクラスを設ける

  • APP層でやっている

  • RepositoryとTable操作系でobjectにしたのでテストやりづらい
  • テストが大変
  • コンテキストが絡まざるを得ないことをするときも大変
  • DI出来るように

よかったこと

  • ドメイン層に余計なことを徹底的に書かない

質疑

  • IDを持っていない状態のEntityは…
  • UUIDを使うことのメリット
  • テーブルはSQLアンチパターン
  • 開発が決めたことをまとめる
    • コンテキストのマップ
    • リポジトリのキャッシュ
  • キーワード決めは開発。理解を得るところは営業とは話し合い。政治力。
  • type aliasと加えて、case classなども使う
  • 用途を間違えなければNoSQLでも可

ScalaとDDD かとじゅんさん

  • オブジェクトやモデルをおさらい
  • ペットショップのドメインを事例に

DDDのまえにOOP

  • OOPはなんのため?
    • デザインパターンのため? 不是
      • メルカトル図法はモデリング 面積はデタラメ
      • 文脈があって 手続きがあるとMVCとは言わないのでは
      • ユーザーの頭の中にあるものとモデルを結びつける
        • 頭のなかにあるものを実装に写しとること
    • モデルはテーブル? 不是
    • シナリオを選ぶ モデルを考える モデルを実装する
    • ドメインモデルでは振る舞いが大事

ペットショップの例を考える

  • ホワイトボードに何かを書く
  • 型が制約をあらわす
    • ペットとペット以外の商品を同じように扱う
    • 現実の業務と密接に絡んでくる
    • 精算時に注文がなければダメなのでは
    • エンティティの実装(値そのものではない)
    • IDを持っていないエンティティは例外扱い 基本はエンティティにIDが存在する
    • CPUとメモリだけでIDを採番出来るようにしたい
      • ID型はなんでもいいが、識別子を保持して、絶対変更してはいけない
    • 顧客を表すエンティティ 属性が多すぎるのは良くない

ライフサイクルの責務を分離

  • グローバルエンティティ/リポジトリ/ファクトリ
  • 集約はIOの最小単位
    • これを検索するのがリポジトリ
    • 集約はテーブルではない それはエンコードの一つではない
  • リポジトリをサポートするtrait
    • リポジトリはDAOではない
    • 遅いストレージに合わせてIFを実装する必要
      • インピーダンスミスマッチ

質疑

  • RDBよりKVSのほうが相性はいいけど、KVSはインデックスを使った問い合わせがほとんど出来ないので注意
  • repositoryのメソッドがtryで囲われているのはやりすぎ…?→IO関係の都合上そうしてる

メモ SBT人間 #ScalaMatsuri

さほど入門ではない。

  • TypeSafe社でリアクティブ関連で商用プラットフォームを作ってる

これを読めばいいです http://www.scala-sbt.org/0.13/docs/ja/Getting-Started.html

  • ここに出ていないコマンドで覚えるべきやつは、helpをつかえば
  • ターミナルを素早く出すTotalTerminal
  • サブライムとiTermで開発してる

こいつを書いておく

sbt.version=0.13.9

マルチプロジェクト/サブプロジェクト(jar)

sbtの概念

buildはsubprojectの集合体-source / libaryDependencies

依存関係で他のプロジェクトを作らないといけないので、lazy val Scala Puzzlersに書いてる

lazy val foo = (project in file("foo"))
  • sbtは、mavenとかの系統 プログラミング言語を使ってビルドを定義できる(rakeみたいなやつ)
  • その前はantを使っていた
  • さらにその前はシェルスクリプトのコマンドだった、といいつつ、makeとかgccとか 環境依存が激しい。
  • ネットにつながっていればライブラリを管理できるようになったのがCPAN/maven/rakeなど
  • ずっと一生使える

lazy valでないとbazが先に呼べない/Scalaに見えてDSLなのである

lazy val foo = (project in file("foo")),
  dependsOn(baz)
  • コンパイラのsbt
  • クロスコンパイルする理由は、数カ月ごとに新しいScalaのバージョンがあって、ライブラリに互換性がなかった
  • settingの型
  • sbtはイミュータブルなつくり

  • プラグインを書きたい人はDefaults.scalaを読むべし

  • key.scalaも

  • dependency orient program

  • ~testOnlyとか使ってみるといい

memo Mastering Scala using IntelliJ IDEA #ScalaMatsuri

  • プラグイン開発者

私はEmacsを使っているわ

他にも生産性のあるツールを使っている

とあるお話

  • カンファレンスに行くと、ツールに関する感想/コメントを頂く
    • IntelliJについてのフィードバックだが、ツールを100%活かしきれていない
    • 基本的なフィーチャー パフォーマンス
    • いろんなフィーチャーを見つけるフィーチャーを見つける

いろいろな機能

  • Activator Templateテンプレートを作れる
    • もっというと、生産性を上げるためには、マウスを使う必要もない
  • presentation assistant
    • MacOS KeyMap
    • すべてのショートカットを覚えるのは大変
  • find action(describe-key/describe-mode)
    • キーを忘れた時に使う
    • 生産性を上げるためにはマウスを使わないほうがいい というかショートカットキーを使い倒す
  • scala plugin featureを使う
  • distruction free mode
  • ナビゲーション機能(helm-ls-git)
    • implcitサーチしたいときはクラスサーチを使う(implicitと入力してみよう)
    • シンボル/クラス/ファイル→shift + w
    • どの検索でもキャメルを使うことが出来る(ImplColとかくと、Implicit Collectorみたいなのもサーチ出来る)
  • ナビゲーションバー
  • 新しいクラスを作れたりする
  • 開かれたファイルの履歴を見たい 最近使ったファイルを検索出来て(helm-recentf)
  • distruction free mode
  • デバッグ/設定そのものの修正も可能
  • クラスのメンバーを知れる

質問

  • 新しいことを学んでいった?
  • このプレゼンテーションを最初から知ってた?

  • IntelliJを使うとScalaコーディングの生産性が上がるよ
  • 宿題
    • Eclipseのプロジェクト
    • 2007年から対応出来る
  • presentation mode(全スクリーンにリサイズできる)
  • ファイルのリファクタ(ensimeの機能は使い切れてないなあ)
  • Inspecting code(引数が何を意味しているのかも分かったりする)
    • もっとeditをしたい場合/yellow codeを見つけたい時
  • ワークシート
    • プロジェクト/ライブラリ をもっと早くテストすることが出来る
    • 簡易的なREPL
  • Intention Action 小さなファクター
    • explicit parameterを使って、置き換えることが出来る
    • preferenceを読んだらいいと思うんです
  • Scalaでセミコロンは好まれない
  • 1行or複数行でリファクタも一瞬で出来る
  • リージョン消しや1行1行消せる
  • ショートカットは使い倒さなければいけない
  • 自動補完はデフォルト出来る(smart completion デフォルトで入っているが、JavaのIntelliJよりsmartではなかったりする)
  • コピペは自分の好きなプログラミングパターンですね
  • コンパイルエラーも自動変換でリファクタしてくれる

  • デバッガ/何年も使っていても知らなかったっていう人がいる機能

    • キーボードを使ってブレークポイントを突っ込むことが出来る
    • ブレークポイントの箇所でその値の情報を知ることができるし、その変数を使ってコードを試し書きすることも出来る
  • ベーシックなIntteliJだけではなくScalaプラグインのこともわかるようになる

memo Scala Code Clinic #ScalaMatsuri

  • Akkaを使ったプロジェクト
  • マルチプロジェクト構成の意図
  • 型に対してのパターンマッチはよくない
  • asInstanceOfがないのはAkkaが悪い
  • mapするのは遅いし、マッチしなかったらエラーになるので、collectを使ったほうがよろし
  • Akkaが型がつかないのがよくない
  • パターンマッチでどのcaseにもマッチしないものが来たら実行時エラーになりそう
  • エクストラパターン
  • Akkaが悪い
  • OptionにはtoLeft/toRightメソッドがあって、これでもってEither型に変換できちゃう