Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
検索条件にCRITERIAを
Search
ICKX
May 31, 2025
Programming
0
70
検索条件にCRITERIAを
ICKX
May 31, 2025
Tweet
Share
More Decks by ICKX
See All by ICKX
階層化自動テストで開発に機動力を
ickx
1
800
「兵法」から見る質とスピード
ickx
1
480
あなたの知らない新潟
ickx
0
71
香川にはTyrellがあるからね
ickx
0
370
品質が高いコードって何?Rev2.1
ickx
2
1k
品質が高いコードって何?
ickx
7
4.7k
【PHPerKaigi2021】PHPでCSVを安心して扱うために
ickx
4
3.2k
【PHPerKaigi2020】ぼくのかんがえたさいつよQueryBuilder
ickx
0
1.1k
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!
ickx
0
780
Other Decks in Programming
See All in Programming
CSC307 Lecture 12
javiergs
PRO
0
460
RAGでハマりがちな"Excelの罠"を、データの構造化で突破する
harumiweb
9
2.5k
AIに仕事を丸投げしたら、本当に楽になれるのか
dip_tech
PRO
0
180
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.6k
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.6k
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
470
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
550
ご飯食べながらエージェントが開発できる。そう、Agentic Engineeringならね。
yokomachi
1
280
TROCCOで実現するkintone+BigQueryによるオペレーション改善
ssxota
0
130
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
320
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
160
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
380
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Side Projects
sachag
455
43k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
180
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Balancing Empowerment & Direction
lara
5
930
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
370
First, design no harm
axbom
PRO
2
1.1k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
200
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
760
Transcript
検索条件にCRITERIAを 同人ソフトサークル Project ICKX 若葉 章 @effy_staffs (EFFY開発チーム)
検索をパターン化する CRITERIAパターン(造語)の ご紹介
状況! • これは部屋単位の予約システムです • 部屋の予約は次の三要素で成立します • 予約日 • 部屋番号 •
顧客ID • 指定する予約日と部屋番号でリソースに アクセスしたいです
ほーん、ならまずはVoこうするか
Entityはこうやな
URLの構築はこうやな Symfonyの場合、 URLパスパート上の変数名と ここのキー名が完全一致する 必要がある 年月日なので フォーマットを 整えるっぴ
検索はこうやな Doctrineかつスキーマ定義で Datetime型を指定している場合、 Datetime型を与える必要がある 設定次第だがDoctrineの場合 プロパティ名を lowerCamelCaseに する必要がある
似たような検索が出るたびに こうちまちま弄るのめんどくさいな
具体的には・・・ • 全ての検索箇所、URL構築箇所においてそれぞれのエンティティの 特性に合わせたプロパティ名の書き換えが必要 • 検索とURL構築でコンテキストが異なり、コンタミネーションすると 事故につながる 今回は たまたま 同じ
検索条件にCRITERIAを
まずはエンティティを抽象的に扱えるように
検索条件インターフェースの用意 • 全ての検索条件はcriteriaアクセサーを持つ • 本例においてPHP8.4からの非対称可視性プロパティフックで実装 しているのは責務を明確にしたいから
ドメイン層としての検索条件インターフェースの用意 • ドメイン層なのでドメインエンティティからの変換が可能 • 一度ドメイン層として”検索条件”を一般化する事で、 アプリ層などの他階層での関心毎を減らす
アプリ層としての検索条件インターフェースの用意 • ドメイン検索条件として検索条件を受け入れる事でシステム全体の 検索条件を明確にする • アプリ層として検索条件の受け入れ方を一般化し、どのような特性 であっても同じ手触りを提供させる • 合わせて、共通項は自動化もさせる
アプリ層としての検索条件特性の用意 • アプリ層としての検索条件の特性を抽出し、以降の実装での考え事 を減らします
特性に応じた検索条件インターフェースの用意 • 検索特性に応じた検索条件インターフェースを用意することで 知識のコンタミネーションを防ぐ ※URLって書いてあるんだからURL用の結果が返るのは自明
検索条件にCRITERIAを
ドメイン検索条件 • ドメイン知識としての 検索条件が明快になった • 要求を全て満たしている ので高品質 • 予約日と部屋番号で リソースにアクセス
• 要求の確認対象が明確かつ 最小なので、検証しやすい • ドメイン層としての コンテキストを持つため 利用側での自律動作を 実施しやすい(後述)
アプリ検索条件(repository) • アプリ検索条件インターフェースがそのまま使われる事はないです • このリポジトリ検索に 必要なコンテキストだけを 考えれば良くなっています • 今回はVOが持つ情報が 1:1で適合しているので
get criteriaでは変換なし
アプリ検索条件(url) • このURL検索に 必要なコンテキストだけを 考えれば良くなっています • リポジトリ側と違って こちらではコンテキストに 依存した変換を行って います
• これが利用側における 自律的な動作です • 十分なコンテキストを 与えられているため 必要ならクラス名を元に 完全自動変換すら可能です
検索条件がCRITERIAに
検索 • これだけで済むようになっちゃった • 以降、検索条件が変わったとしてもcriteria群を弄るだけで 利用側のコードを変更する事はありません (それ以前にクラスとして用途が明確になっているので変更される 事はまず起きえないんですが)
URL構築 • URL検索条件インスタンスを直接与えられるならこれで済むように なりました • リポジトリ検索条件とインターフェースが同一なため、ドメイン 検索条件を修正し、アプリ検索条件が追随すれば自動的に全体の 協調が取れます
URL構築 • ただまぁ流石に繰り返しの中などでは利用できないので、twig拡張 を用意した方が良いです • twig拡張の例
URL構築 • 拡張がある前提ならばこのような記述が可能となります • 単数であっても次の通り • 例によってパラメータが変わったとしても実際に利用する側の変更は 不要となりました
おしまい