Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

DSLを学ぶ - 設定式によるルールの表現を試す -

1,008 views

Published on

大阪ドメイン駆動設計読書会によるLT会での発表資料。

#dddosaka レポートwiki
https://github.com/dddosaka/reading_ddd_report

Published in: Technology
  • Be the first to comment

DSLを学ぶ - 設定式によるルールの表現を試す -

  1. 1. ー DSLを学ぶ ー 設定式による ルールの表現を試す 2014/9/21 大阪DDD読書会によるLT会 vol.1 #dddosaka by @kuma_nana
  2. 2. はじめに 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について知らなかったので、この機に 学んで話すことにした
  3. 3. アジェンダ 1.元ネタ、お題の説明 2.要件整理、モデリング 3.DSL、式言語を使った実装
  4. 4. 元ネタ、お題の説明
  5. 5. 今日のお題 ギルドワークスの増田亨さんのブログ記事[※2] で、 「変更がたいへんになりそうなコード」として示されているスニペット: if (date.before(SUMMER_START) || date.after(SUMMER_END)) charge = quantity * _winterRate + _winterServiceCharge; else charge = quantity * _summerRate; 冬季と夏季で異なるサービス料金の計算をしている
  6. 6. ここから考えられるテーマ 季節で異なる料金の計算・・・ → ビジネスルールをどう表現するか -似ているけれど違うパターンが複数ある(冬季 と夏季以外にも増えうる場合は?) -パラメータも複数(季節変動のレート値など) -ビジネスルールそのものも変わっていく → (元記事とは違うアプローチになるけれど、)DSLで の表現を考えてみることにした
  7. 7. (小さなお題ですが) 要件整理、モデル
  8. 8. 要件整理 料金表 季節期間料金 夏7 - 8月(基本料金) x (夏季レート) 夏以外 (標準) 上記以外(基本料金) x (標準レート) + (標準固定料金)
  9. 9. 可変点 変わりやすいビジネスポリシー・・・ 料金の計算式 -式自体や、式中の固定値の値は可変 夏の定義 -何月何日から何日までを夏料金にするのか?
  10. 10. 共通点 何らかの計算ルールによって料金が求まること自体 は共通で変わりそうにない
  11. 11. モデル
  12. 12. DSL、式言語を使った実装
  13. 13. 実装:料金設定DSL(式を使用) https://github.com/kumamidori/Sample.ExpressionLanguage/blob/master/app/config/charge.yml # 季節別設定 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 要件整理した料金の概念を、分かりやすく表 現できた。 プログラマでない人が見ても検証可能。
  14. 14. 実装:式言語ライブラリの使用 式言語(Express Language)とは? Javaで式言語として身近なのは、JSPのEL # 参照 ${foo.bar} # 算術演算 $<p>The value is ${(value % 2 == 1) ? 'odd' : 'even'}.</p> 'even'}.</p>
  15. 15. 実装:式言語ライブラリの使用 今回使用:Symfony Expression Language 式をパース、コンパイル、評価できる [※3] $el = new ExpressionLanguage(); $expression = '3 > 2'; ! $parsed = $el->parse($expression, []); $compiled = $el->compile($expression, []); $result = $el->evaluate($expression);
  16. 16. まとめ、感想
  17. 17. まとめ、感想 - 「DSLは、OOPと補完的な関係にある」といった 話題が読書会で出たことがあったと思うけれど、そ の意味が実感的に理解できた ! - 抽象的に分かりやすく考えていくアプローチを習 得していきたい ! ★今回書いたサンプルコード★ https://github.com/kumamidori/Sample.ExpressionLanguage
  18. 18. 引用資料、参考資料 ■引用資料 [※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
  19. 19. Thanks! Twitter: @kuma_nana Web developer / #dddosaka

×