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も
抽象構文木っぽくしておくと
後からの拡張に対応しやすいよねっていう
ちょっとしたお話
2017/02/21
和田潤也
Copyright © 2014 Sansan, Inc. All rights reserved.
> 自己紹介
Sansan事業部 開発部
和田潤也
@chocolamint
某 SIer で Web 系のフロントエンド寄り基盤の開発をメイ...
Copyright © 2014 Sansan, Inc. All rights reserved.
> オレオレDSLってなんのこと?
田中 太郎 OR 次郎
田中 太郎 次郎ORAND
Copyright © 2014 Sansan, Inc. All rights reserved.
> 実際にあった事例
- https://github.com/eightcard/lk-linkknowledge/pull/6781
pu...
Copyright © 2014 Sansan, Inc. All rights reserved.
> なるほど、こういう想定
AndAlso
["田中"]
OrElse
["太郎", "次郎"]
パーサーが
IEnumerable<Toke...
Copyright © 2014 Sansan, Inc. All rights reserved.
> データ構造の修正はコストがデカい
括弧で優先順位をつけられるようになったら?
田中 OR (山田 太郎)
引用符で「完全一致」が指定できる...
Copyright © 2014 Sansan, Inc. All rights reserved.
> 本来の構造に忠実にいこう
あ お
い う え
AND
OR
MultinaryExpression
多項式
LiteralExpressi...
Copyright © 2014 Sansan, Inc. All rights reserved.
> データ構造に落としてみました
Copyright © 2014 Sansan, Inc. All rights reserved.
> ついでに Visitor パターン使ってみました
Copyright © 2014 Sansan, Inc. All rights reserved.
> なおパーサーは愚直な模様
「パーサーコンビネーター」とか
言ってみたい
Copyright © 2014 Sansan, Inc. All rights reserved.
> YAGNI≠拡張性への考慮を捨てる
You ain't gonna need it
「作らない」⇒ あとから作れるように!
Copyright © 2014 Sansan, Inc. All rights reserved.
> 「拡張しやすい」とは何なのか
Copyright © 2014 Sansan, Inc. All rights reserved.
> 現実に即しておく=シンプル
• 現実のモデルとの差異を埋める必要がない
• 現実との乖離から生じるリスクが少ない
• 現実的に起こり得る将...
Copyright © 2014 Sansan, Inc. All rights reserved.
> もう一つの例
SQS
IThrottlingPolicy
Copyright © 2014 Sansan, Inc. All rights reserved.
> 同時実行するメッセージの数を制限する
interface IThrottlingPolicy
{
Task<IDisposable> En...
Copyright © 2014 Sansan, Inc. All rights reserved.
> とりあえず差し込めるようにしておく?
- ✓ DO provide at least one type that is an
implem...
Copyright © 2014 Sansan, Inc. All rights reserved.
> 設計が全て
- そのインターフェースは何故必要ですか?
- 「あってもなくてもいい」インターフェースは要らない
- そのインターフェースは...
Copyright © 2014 Sansan, Inc. All rights reserved.
> 必要になったら作れるようにしておく
- 最初の検索の例
- パーサーは括弧を想定していない状態
> なので入れ子構造の式ツリーは返ってこな...
Copyright © 2014 Sansan, Inc. All rights reserved.
> ソースはシンプルに・想定は複雑に
- いま「やりたいこと」は何か
- 将来変わらない「やりたいこと」は何か
Copyright © 2014 Sansan, Inc. All rights reserved.
> どちらがシンプルか
メッセージを同時に4つずつしか取り出さないように
制御しながら、順次取り出して処理する
メッセージを
順次取り出して処...
Copyright © 2014 Sansan, Inc. All rights reserved.
> Make it simple
Upcoming SlideShare
Loading in …5
×

ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話

1,377 views

Published on

https://sansan.connpass.com/event/49964/ の発表資料

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話

  1. 1. ちょっとしたオレオレDSLも 抽象構文木っぽくしておくと 後からの拡張に対応しやすいよねっていう ちょっとしたお話 2017/02/21 和田潤也
  2. 2. Copyright © 2014 Sansan, Inc. All rights reserved. > 自己紹介 Sansan事業部 開発部 和田潤也 @chocolamint 某 SIer で Web 系のフロントエンド寄り基盤の開発をメインに従事 2015年12月より に JOIN • 壁を登ってた時代がありました…… • 最近の週末は女性声優のイベントで忙しいとのこと
  3. 3. Copyright © 2014 Sansan, Inc. All rights reserved. > オレオレDSLってなんのこと? 田中 太郎 OR 次郎 田中 太郎 次郎ORAND
  4. 4. Copyright © 2014 Sansan, Inc. All rights reserved. > 実際にあった事例 - https://github.com/eightcard/lk-linkknowledge/pull/6781 public class Token { public TokenType Type { get; } public IList<string> Words { get; } public Token(TokenType type, IList<string> words) { Type = type; Words = words; } } public enum TokenType { AndAlso, OrElse } むむむ?
  5. 5. Copyright © 2014 Sansan, Inc. All rights reserved. > なるほど、こういう想定 AndAlso ["田中"] OrElse ["太郎", "次郎"] パーサーが IEnumerable<Token> を返す
  6. 6. Copyright © 2014 Sansan, Inc. All rights reserved. > データ構造の修正はコストがデカい 括弧で優先順位をつけられるようになったら? 田中 OR (山田 太郎) 引用符で「完全一致」が指定できるようになったら? "田中 太郎"
  7. 7. Copyright © 2014 Sansan, Inc. All rights reserved. > 本来の構造に忠実にいこう あ お い う え AND OR MultinaryExpression 多項式 LiteralExpression リテラル式
  8. 8. Copyright © 2014 Sansan, Inc. All rights reserved. > データ構造に落としてみました
  9. 9. Copyright © 2014 Sansan, Inc. All rights reserved. > ついでに Visitor パターン使ってみました
  10. 10. Copyright © 2014 Sansan, Inc. All rights reserved. > なおパーサーは愚直な模様 「パーサーコンビネーター」とか 言ってみたい
  11. 11. Copyright © 2014 Sansan, Inc. All rights reserved. > YAGNI≠拡張性への考慮を捨てる You ain't gonna need it 「作らない」⇒ あとから作れるように!
  12. 12. Copyright © 2014 Sansan, Inc. All rights reserved. > 「拡張しやすい」とは何なのか
  13. 13. Copyright © 2014 Sansan, Inc. All rights reserved. > 現実に即しておく=シンプル • 現実のモデルとの差異を埋める必要がない • 現実との乖離から生じるリスクが少ない • 現実的に起こり得る将来の変更に対応しやすい
  14. 14. Copyright © 2014 Sansan, Inc. All rights reserved. > もう一つの例 SQS IThrottlingPolicy
  15. 15. Copyright © 2014 Sansan, Inc. All rights reserved. > 同時実行するメッセージの数を制限する interface IThrottlingPolicy { Task<IDisposable> EnterAsync( CancellationToken cancellationToken); } • SemaphoreThrottle で単純な上限数制御 • IntervalThrottle でスループット制御
  16. 16. Copyright © 2014 Sansan, Inc. All rights reserved. > とりあえず差し込めるようにしておく? - ✓ DO provide at least one type that is an implementation of an interface. https://msdn.microsoft.com/ja-jp/library/ms229022(v=vs.110).aspx 理想的には 2 つ以上作ってみるのがオススメ (実利用するかはともかく脳内で) 適切に抽象化できていれば 複数の実装が提供され得るはず
  17. 17. Copyright © 2014 Sansan, Inc. All rights reserved. > 設計が全て - そのインターフェースは何故必要ですか? - 「あってもなくてもいい」インターフェースは要らない - そのインターフェースは何をしますか? - 明確な 1 つの責務を持つべき - そのインターフェースにはどのような実装が想定されますか? - 実装が 1 つしか考えられないインターフェースは要らない
  18. 18. Copyright © 2014 Sansan, Inc. All rights reserved. > 必要になったら作れるようにしておく - 最初の検索の例 - パーサーは括弧を想定していない状態 > なので入れ子構造の式ツリーは返ってこない - パーサーが対応されれば Visitor は勝手に対応される - ○○が起こったタイミングで△△する - Publisher は○○が起こったことを知らせる - Subscriber は通知を受けて△△をする - ☆☆というルールで■■をする - ■■をする方法(戦略)は☆☆以外にも考えられる
  19. 19. Copyright © 2014 Sansan, Inc. All rights reserved. > ソースはシンプルに・想定は複雑に - いま「やりたいこと」は何か - 将来変わらない「やりたいこと」は何か
  20. 20. Copyright © 2014 Sansan, Inc. All rights reserved. > どちらがシンプルか メッセージを同時に4つずつしか取り出さないように 制御しながら、順次取り出して処理する メッセージを 順次取り出して処理する 同時に4つずつまでしか 取り出さないように 制御する
  21. 21. Copyright © 2014 Sansan, Inc. All rights reserved. > Make it simple

×