SlideShare a Scribd company logo
1 of 17
Download to read offline
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)

More Related Content

What's hot

TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2kamukiriri
 
メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばKouji Matsui
 
Roslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaYuta Matsumura
 
古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!Naoto Ishizawa
 
ディープラーニングのフレームワークの自作
ディープラーニングのフレームワークの自作ディープラーニングのフレームワークの自作
ディープラーニングのフレームワークの自作Ko Hamada
 
俺とモデリング
俺とモデリング俺とモデリング
俺とモデリングMasayuki KaToH
 
データベース定義書の更新は再考の仕事
データベース定義書の更新は再考の仕事データベース定義書の更新は再考の仕事
データベース定義書の更新は再考の仕事Atsushi Yasuda
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeKiwamu Okabe
 

What's hot (8)

TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2
 
メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらば
 
Roslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuoka
 
古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!
 
ディープラーニングのフレームワークの自作
ディープラーニングのフレームワークの自作ディープラーニングのフレームワークの自作
ディープラーニングのフレームワークの自作
 
俺とモデリング
俺とモデリング俺とモデリング
俺とモデリング
 
データベース定義書の更新は再考の仕事
データベース定義書の更新は再考の仕事データベース定義書の更新は再考の仕事
データベース定義書の更新は再考の仕事
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
 

Viewers also liked

やさしいIteratee入門
やさしいIteratee入門やさしいIteratee入門
やさしいIteratee入門Takashi Kawachi
 
C# linq入門 意図編
C# linq入門 意図編C# linq入門 意図編
C# linq入門 意図編Fujio Kojima
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方Shunji Konishi
 
ORと経済学の「結婚」問題
ORと経済学の「結婚」問題ORと経済学の「結婚」問題
ORと経済学の「結婚」問題Yosuke YASUDA
 
文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDoxTomoharu ASAMI
 
学ばないDSL
学ばないDSL学ばないDSL
学ばないDSLKenta USAMI
 
DSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイルDSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイル陽平 山口
 
恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】
恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】
恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】Tomoya Tatekawa
 
DSLについて語るときに僕の語ること
DSLについて語るときに僕の語ることDSLについて語るときに僕の語ること
DSLについて語るときに僕の語ることTomohiro Nishimura
 
Twitter API最新事情 - API Meetup Tokyo #1 #apijp
Twitter API最新事情 - API Meetup Tokyo #1 #apijpTwitter API最新事情 - API Meetup Tokyo #1 #apijp
Twitter API最新事情 - API Meetup Tokyo #1 #apijpYusuke Yamamoto
 
SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~bleis tift
 
この人と結婚していいの?を読んで
この人と結婚していいの?を読んでこの人と結婚していいの?を読んで
この人と結婚していいの?を読んでShumpei Shiraishi
 
DSLの過去と未来
DSLの過去と未来DSLの過去と未来
DSLの過去と未来Akio Tajima
 
全角チルダ問題
全角チルダ問題全角チルダ問題
全角チルダ問題tsudaa
 
地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)Tsunenori Oohara
 
婚活偏差値ランキングと傾向と対策
婚活偏差値ランキングと傾向と対策婚活偏差値ランキングと傾向と対策
婚活偏差値ランキングと傾向と対策大和 金太郎
 
最高の自分を手に入れる方法
最高の自分を手に入れる方法最高の自分を手に入れる方法
最高の自分を手に入れる方法大和 金太郎
 
婚活の戦略「恋愛マスターのマインドセット」
婚活の戦略「恋愛マスターのマインドセット」婚活の戦略「恋愛マスターのマインドセット」
婚活の戦略「恋愛マスターのマインドセット」大和 金太郎
 

Viewers also liked (20)

やさしいIteratee入門
やさしいIteratee入門やさしいIteratee入門
やさしいIteratee入門
 
C# linq入門 意図編
C# linq入門 意図編C# linq入門 意図編
C# linq入門 意図編
 
SimpleModeler
SimpleModelerSimpleModeler
SimpleModeler
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方
 
ORと経済学の「結婚」問題
ORと経済学の「結婚」問題ORと経済学の「結婚」問題
ORと経済学の「結婚」問題
 
文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox 文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
文書をプログラムにする技術 - SimpleModeler + Mindmap & SmartDox
 
学ばないDSL
学ばないDSL学ばないDSL
学ばないDSL
 
DSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイルDSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイル
 
恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】
恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】
恋人がいない30代前半女性が5年以内に結婚できる確率は17.6%【アラサー未婚女性へ】
 
RubyでDSL
RubyでDSLRubyでDSL
RubyでDSL
 
DSLについて語るときに僕の語ること
DSLについて語るときに僕の語ることDSLについて語るときに僕の語ること
DSLについて語るときに僕の語ること
 
Twitter API最新事情 - API Meetup Tokyo #1 #apijp
Twitter API最新事情 - API Meetup Tokyo #1 #apijpTwitter API最新事情 - API Meetup Tokyo #1 #apijp
Twitter API最新事情 - API Meetup Tokyo #1 #apijp
 
SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~
 
この人と結婚していいの?を読んで
この人と結婚していいの?を読んでこの人と結婚していいの?を読んで
この人と結婚していいの?を読んで
 
DSLの過去と未来
DSLの過去と未来DSLの過去と未来
DSLの過去と未来
 
全角チルダ問題
全角チルダ問題全角チルダ問題
全角チルダ問題
 
地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)
 
婚活偏差値ランキングと傾向と対策
婚活偏差値ランキングと傾向と対策婚活偏差値ランキングと傾向と対策
婚活偏差値ランキングと傾向と対策
 
最高の自分を手に入れる方法
最高の自分を手に入れる方法最高の自分を手に入れる方法
最高の自分を手に入れる方法
 
婚活の戦略「恋愛マスターのマインドセット」
婚活の戦略「恋愛マスターのマインドセット」婚活の戦略「恋愛マスターのマインドセット」
婚活の戦略「恋愛マスターのマインドセット」
 

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

効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法将 高野
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Ra Zon
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tipsOda Shinsuke
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜Naruhiko Ogasawara
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてHuy Do
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングkei takakuda
 
C++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するC++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するYou&I
 
.NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!).NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!)Akira Inoue
 
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6健太 田上
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~Fujio Kojima
 
インターネット広告の概要とシステム設計
インターネット広告の概要とシステム設計インターネット広告の概要とシステム設計
インターネット広告の概要とシステム設計MicroAd, Inc.(Engineer)
 
[LT] T sql の parse と generator
[LT] T sql の parse と generator[LT] T sql の parse と generator
[LT] T sql の parse と generatorOda Shinsuke
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
Rデータ入力編
Rデータ入力編Rデータ入力編
Rデータ入力編Monta Yashi
 
3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみたYasushi Kato
 
「Delphi/C++BuilderユーザーのためのSencha入門」
「Delphi/C++BuilderユーザーのためのSencha入門」「Delphi/C++BuilderユーザーのためのSencha入門」
「Delphi/C++BuilderユーザーのためのSencha入門」Embarcadero Technologies
 

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

効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tips
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについて
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
 
C++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するC++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用する
 
Unityでreflection入門
Unityでreflection入門Unityでreflection入門
Unityでreflection入門
 
.NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!).NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!)
 
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
 
インターネット広告の概要とシステム設計
インターネット広告の概要とシステム設計インターネット広告の概要とシステム設計
インターネット広告の概要とシステム設計
 
Inside of Asakusa DSL
Inside of Asakusa DSLInside of Asakusa DSL
Inside of Asakusa DSL
 
[LT] T sql の parse と generator
[LT] T sql の parse と generator[LT] T sql の parse と generator
[LT] T sql の parse と generator
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
Rデータ入力編
Rデータ入力編Rデータ入力編
Rデータ入力編
 
3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた
 
「Delphi/C++BuilderユーザーのためのSencha入門」
「Delphi/C++BuilderユーザーのためのSencha入門」「Delphi/C++BuilderユーザーのためのSencha入門」
「Delphi/C++BuilderユーザーのためのSencha入門」
 

More from Yoshiteru Takeshita

Developing large-scale smart-phone game servers by a single person
Developing large-scale smart-phone game servers by a single personDeveloping large-scale smart-phone game servers by a single person
Developing large-scale smart-phone game servers by a single personYoshiteru Takeshita
 
Play framework+docker+aws ecr+aws beanstalk で楽々デプロイ
Play framework+docker+aws ecr+aws beanstalk で楽々デプロイPlay framework+docker+aws ecr+aws beanstalk で楽々デプロイ
Play framework+docker+aws ecr+aws beanstalk で楽々デプロイYoshiteru Takeshita
 
Scala Matsuri 2016コミュニティセッション
Scala Matsuri 2016コミュニティセッションScala Matsuri 2016コミュニティセッション
Scala Matsuri 2016コミュニティセッションYoshiteru Takeshita
 

More from Yoshiteru Takeshita (6)

GraphQL with scala
GraphQL with scalaGraphQL with scala
GraphQL with scala
 
Developing large-scale smart-phone game servers by a single person
Developing large-scale smart-phone game servers by a single personDeveloping large-scale smart-phone game servers by a single person
Developing large-scale smart-phone game servers by a single person
 
Play framework+docker+aws ecr+aws beanstalk で楽々デプロイ
Play framework+docker+aws ecr+aws beanstalk で楽々デプロイPlay framework+docker+aws ecr+aws beanstalk で楽々デプロイ
Play framework+docker+aws ecr+aws beanstalk で楽々デプロイ
 
Scala Matsuri 2016コミュニティセッション
Scala Matsuri 2016コミュニティセッションScala Matsuri 2016コミュニティセッション
Scala Matsuri 2016コミュニティセッション
 
Scala導入あれこれ
Scala導入あれこれScala導入あれこれ
Scala導入あれこれ
 
Scala web framework比較
Scala web framework比較Scala web framework比較
Scala web framework比較
 

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