Dslからのコードジェネレーションで楽々play開発

Yoshiteru Takeshita
Yoshiteru TakeshitaGeisha Tokyo Entertainment Inc.
DSLからのコードジェネレー
ションで楽々Play開発
芸者東京エンターテインメント株式会社
竹下 義晃
自己紹介
東京大学 農学生命科学研究科 修士卒
竹下義晃
芸者東京エンターテインメントでScalaとC#を書い
ています。
隔週でやってるScala勉強会の会場を提供してい
ます。ぜひ来てください。
あと、9月開催のScalaMatsuriにも是非来てくださ
い。
動機
同様なコードを書くのが面倒
同様=コピペして、ちょこっと手直し
たとえば
● PlayのControllerとMethodを作って、だいたい
その名前に対応したURLをroutesに記述
● DBモデルクラスとテーブル定義
● APIでのやりとりのために、サーバー(Scala)と
クライアント(C#)で、ほぼ同じモデルクラスを作
る
つまり
● 汎用的に作られたFrameworkと、個々のプロ
ジェクトルールやビジネスルールとの差異を埋
める
● 異なる言語で同じようなコードを書く手間を減ら
す
解決策
DSLを定義して、そこからコードジェネレーションを
行う
DSLとは
Domain Specific Languageの略
特定の分野に限定し、それに特化した言語
正規表現やSQLもDSLの一種。
DSL以外の選択肢
コードジェネレーションのベースとして使用されるも
の
1. ClassにAnnotation
2. XMLなどの既存のフォーマット
3. DBからのリバースエンジニアリング
4. UML
5. エクセル
DSLの長所と短所
長所
● プロジェクト特有の機能に対応できる
● 簡潔にかける
短所
● 新しく学習すべきことが増えてしまう
● ツールサポートがない(簡潔にかけるからツール
サポートいらない)
どれくらい強力か?
うまく言えないのでライブコーディングで確認してく
ださい。
Twitterクローンを作ってみる
https://github.com/takezoux2/dslgen-at-play-
meetup
● ログイン機能のみできている
● DSLからのコードジェネレーションは実装済み
● つぶやく機能を追加
機能実装に必要なもの
● DBモデルクラス
● Repositoryクラス
● Serviceクラス
● Controllerクラス、メソッド
● Viewファイル
● View用モデルクラス
● routesファイル
● DBテーブル定義ファイル
コードジェネレーションのためのトリック
プロジェクトのコーディングルールをきっちり決める
● DBからの取得はIndexをはってあるフィールド
を条件にしてでしか取得してこない
● Controllerの名前とメソッドから、URLを決定で
きる
どうでした?
コードジェネレーションは非常に強力です。
● ロジックのみに集中してコード出来る
● 新しい機能の追加が早く+確実+フォーマット
が統一される
● プロジェクトのルールが変わらない範囲の仕様
変更ならば、非常に楽に修正できる
● プロジェクトのルールが変わっても、少しの修正
で全てを直せる
コードジェネレーションの欠点
● コードジェネレーションを作るためのコストがか
かる(今回のものぐらいで5時間程度かかりまし
た。)
-> フレームワーク化できたりするかな?
● 例外的なことに対応しにくい
-> 既存コードと生成コードをうまくマージする機能
を付けることでわりと解決します
実プロジェクトでは
● マーカーを仕込むことで、ファイルの一部のみ
自動生成されたコードを埋め込めるようにして
いる
● クライアントと共有したいモデルクラスや定数も
生成
● デバッグ環境では、DBのテーブル更新も自動
化
● DBのマイグレーションファイルも生成
参考文献
Code generation in action(Amazon)
エリック・エヴァンスのドメイン駆動設計(Amazon)
1 of 17

More Related Content

Viewers also liked(20)

Similar to Dslからのコードジェネレーションで楽々play開発(20)

効率10倍UP 秀丸IDE化法効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法
将 高野4.8K views
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tips
Oda Shinsuke1.2K views
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
Naruhiko Ogasawara65.2K views
Unityでreflection入門Unityでreflection入門
Unityでreflection入門
Yoshiteru Takeshita4.3K views
Inside of Asakusa DSLInside of Asakusa DSL
Inside of Asakusa DSL
Suguru ARAKAWA3.4K views
[LT] T sql の parse と generator[LT] T sql の parse と generator
[LT] T sql の parse と generator
Oda Shinsuke746 views
Rデータ入力編Rデータ入力編
Rデータ入力編
Monta Yashi1K views

More from Yoshiteru Takeshita(6)

GraphQL with scalaGraphQL with scala
GraphQL with scala
Yoshiteru Takeshita486 views
Scala導入あれこれScala導入あれこれ
Scala導入あれこれ
Yoshiteru Takeshita905 views
Scala web framework比較Scala web framework比較
Scala web framework比較
Yoshiteru Takeshita5.3K views

Recently uploaded(7)

lt.pptxlt.pptx
lt.pptx
tomochamarika39 views
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKD
ryoo toku84 views
SSH超入門SSH超入門
SSH超入門
Toru Miyahara12 views
robotics42.pptxrobotics42.pptx
robotics42.pptx
Natsutani Minoru165 views

Dslからのコードジェネレーションで楽々play開発