Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
検索条件にCRITERIAを
Search
ICKX
May 31, 2025
Programming
99
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
検索条件にCRITERIAを
ICKX
May 31, 2025
More Decks by ICKX
See All by ICKX
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
600
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
200
階層化自動テストで開発に機動力を
ickx
1
950
「兵法」から見る質とスピード
ickx
1
590
あなたの知らない新潟
ickx
0
110
香川にはTyrellがあるからね
ickx
0
450
品質が高いコードって何?Rev2.1
ickx
2
1.1k
品質が高いコードって何?
ickx
7
5k
【PHPerKaigi2021】PHPでCSVを安心して扱うために
ickx
4
3.4k
Other Decks in Programming
See All in Programming
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
300
不幸な GC
chencmd
0
890
AIの中の人になってみる
htkym
0
170
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
180
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
Foundry Localでエージェント開発
seosoft
0
160
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
420
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
190
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
140
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
490
It's Worth the Effort
3n
188
29k
Docker and Python
trallard
47
4.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
680
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.9k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
480
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
340
Prompt Engineering for Job Search
mfonobong
0
450
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
エンジニアに許された特別な時間の終わり
watany
108
250k
The SEO Collaboration Effect
kristinabergwall1
1
550
How to Talk to Developers About Accessibility
jct
2
540
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構築 • 拡張がある前提ならばこのような記述が可能となります • 単数であっても次の通り • 例によってパラメータが変わったとしても実際に利用する側の変更は 不要となりました
おしまい