19
設定式による ルールの表現を試す 2014/9/21 大阪DDD読書会によるLT会 vol.1 #dddosaka by @kuma_nana ー DSLを学ぶ ー

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

Embed Size (px)

DESCRIPTION

大阪ドメイン駆動設計読書会によるLT会での発表資料。 #dddosaka レポートwiki https://github.com/dddosaka/reading_ddd_report

Citation preview

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

設定式による ルールの表現を試す

2014/9/21 大阪DDD読書会によるLT会 vol.1 #dddosaka by @kuma_nana

ー DSLを学ぶ ー

Page 2: 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について知らなかったので、この機に 学んで話すことにした

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

アジェンダ1.元ネタ、お題の説明

2.要件整理、モデリング

3.DSL、式言語を使った実装

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

元ネタ、お題の説明

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

今日のお題ギルドワークスの増田亨さんのブログ記事[※2] で、

「変更がたいへんになりそうなコード」として示されているスニペット:

if (date.before(SUMMER_START) || date.after(SUMMER_END))

charge = quantity * _winterRate + _winterServiceCharge;

else

charge = quantity * _summerRate;

冬季と夏季で異なるサービス料金の計算をしている

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

ここから考えられるテーマ季節で異なる料金の計算・・・

→ ビジネスルールをどう表現するか

-似ているけれど違うパターンが複数ある(冬季と夏季以外にも増えうる場合は?)

-パラメータも複数(季節変動のレート値など) -ビジネスルールそのものも変わっていく → (元記事とは違うアプローチになるけれど、)DSLで

の表現を考えてみることにした

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

(小さなお題ですが) 要件整理、モデル

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

要件整理料金表

季節 期間 料金

夏 7 - 8月 (基本料金) x (夏季レート)

夏以外 (標準)

上記以外 (基本料金) x (標準レート) + (標準固定料金)

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

可変点変わりやすいビジネスポリシー・・・

料金の計算式

-式自体や、式中の固定値の値は可変 夏の定義

-何月何日から何日までを夏料金にするのか?

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

共通点

何らかの計算ルールによって料金が求まること自体

は共通で変わりそうにない

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

モデル

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

DSL、式言語を使った実装

Page 13: 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

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

実装:式言語ライブラリの使用式言語(Express Language)とは?

Javaで式言語として身近なのは、JSPのEL# 参照

${foo.bar}

# 算術演算

$<p>The value is ${(value % 2 == 1) ? 'odd' : 'even'}.</p>

'even'}.</p>

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

実装:式言語ライブラリの使用今回使用:Symfony Expression Language

式をパース、コンパイル、評価できる [※3] $el = new ExpressionLanguage();

$expression = '3 > 2';

!

$parsed = $el->parse($expression, []);

$compiled = $el->compile($expression, []);

$result = $el->evaluate($expression);

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

まとめ、感想

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

まとめ、感想- 「DSLは、OOPと補完的な関係にある」といった

話題が読書会で出たことがあったと思うけれど、その意味が実感的に理解できた!

- 抽象的に分かりやすく考えていくアプローチを習得していきたい!

★今回書いたサンプルコード★https://github.com/kumamidori/Sample.ExpressionLanguage

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

引用資料、参考資料■引用資料

[※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

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

Twitter: @kuma_nana Web developer / #dddosaka

Thanks!