Upload
kumamidori
View
413
Download
5
Embed Size (px)
DESCRIPTION
大阪ドメイン駆動設計読書会によるLT会での発表資料。 #dddosaka レポートwiki https://github.com/dddosaka/reading_ddd_report
Citation preview
設定式による ルールの表現を試す
2014/9/21 大阪DDD読書会によるLT会 vol.1 #dddosaka by @kuma_nana
ー DSLを学ぶ ー
はじめに2008年に行われたEricさんセッションについてのinfoQ記事
Domain-Driven Design and Domain Specific Languages [※1]
In DDD, the "ubiquitous language" is central, but it's richness and fluency is
hard to render in the object-oriented medium. Domain-specific languages hold
out the prospect of to express models and application logic in far better suited
language. In this presentation, Eric Evans talks about how DDD and DSLs
works together in complex business applications.
→ 当読書会でも、DSLの話題がたびたび出た→ DSLについて知らなかったので、この機に 学んで話すことにした
アジェンダ1.元ネタ、お題の説明
2.要件整理、モデリング
3.DSL、式言語を使った実装
元ネタ、お題の説明
今日のお題ギルドワークスの増田亨さんのブログ記事[※2] で、
「変更がたいへんになりそうなコード」として示されているスニペット:
if (date.before(SUMMER_START) || date.after(SUMMER_END))
charge = quantity * _winterRate + _winterServiceCharge;
else
charge = quantity * _summerRate;
冬季と夏季で異なるサービス料金の計算をしている
ここから考えられるテーマ季節で異なる料金の計算・・・
→ ビジネスルールをどう表現するか
-似ているけれど違うパターンが複数ある(冬季と夏季以外にも増えうる場合は?)
-パラメータも複数(季節変動のレート値など) -ビジネスルールそのものも変わっていく → (元記事とは違うアプローチになるけれど、)DSLで
の表現を考えてみることにした
(小さなお題ですが) 要件整理、モデル
要件整理料金表
季節 期間 料金
夏 7 - 8月 (基本料金) x (夏季レート)
夏以外 (標準)
上記以外 (基本料金) x (標準レート) + (標準固定料金)
可変点変わりやすいビジネスポリシー・・・
料金の計算式
-式自体や、式中の固定値の値は可変 夏の定義
-何月何日から何日までを夏料金にするのか?
共通点
何らかの計算ルールによって料金が求まること自体
は共通で変わりそうにない
モデル
DSL、式言語を使った実装
実装:料金設定DSL(式を使用) # 季節別設定 normal: # 期間 span: (date >= 0101 and date < 0701) or date >= 0901 # 式 formula: base * 1.2 + 1000 summer: span: date >= 0701 and date < 0901 formula: base * 0.9
要件整理した料金の概念を、分かりやすく表現できた。 プログラマでない人が見ても検証可能。
https://github.com/kumamidori/Sample.ExpressionLanguage/blob/master/app/config/charge.yml
実装:式言語ライブラリの使用式言語(Express Language)とは?
Javaで式言語として身近なのは、JSPのEL# 参照
${foo.bar}
# 算術演算
$<p>The value is ${(value % 2 == 1) ? 'odd' : 'even'}.</p>
'even'}.</p>
実装:式言語ライブラリの使用今回使用:Symfony Expression Language
式をパース、コンパイル、評価できる [※3] $el = new ExpressionLanguage();
$expression = '3 > 2';
!
$parsed = $el->parse($expression, []);
$compiled = $el->compile($expression, []);
$result = $el->evaluate($expression);
まとめ、感想
まとめ、感想- 「DSLは、OOPと補完的な関係にある」といった
話題が読書会で出たことがあったと思うけれど、その意味が実感的に理解できた!
- 抽象的に分かりやすく考えていくアプローチを習得していきたい!
★今回書いたサンプルコード★https://github.com/kumamidori/Sample.ExpressionLanguage
引用資料、参考資料■引用資料
[※1] Domain-Driven Design and Domain Specific Languages Recorded by Eric Evans http://www.infoq.com/presentations/ddd-dsl-evans![※2] リファクタリングのエッセンス: GuildWorks Blog
http://blog.guildworks.jp/2014/09/09/%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A8%AD%E8%A8%88%E6%94%B9%E5%96%84%E3%81%AE%E3%82%A8%E3%83%83%E3%82%BB%E3%83%B3%E3%82%B9/![※3] Symfony / Expression Language コンポーネント マニュアル日本語訳
http://docs.symfony.gr.jp/symfony2/components/expression_language/introduction.html!■参考資料
- 実践プログラミングDSL (Debasish Ghosh著、佐藤龍一監訳)
- Web+DB Press vol.79 Symfony Expression Language で式言語を試す(PHPメンターズ)
- PHPメンターズ -> 設定の仕様とは
http://phpmentors.jp/post/82335446289/config-dsl
Twitter: @kuma_nana Web developer / #dddosaka
Thanks!