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
日経電子版 for Androidにおける ドメインレイヤ(ユースケース)の実装方針について
Search
yokomii
September 13, 2025
Programming
25
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
日経電子版 for Androidにおける ドメインレイヤ(ユースケース)の実装方針について
yokomii
September 13, 2025
More Decks by yokomii
See All by yokomii
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
1.9k
Riveで公式犬をインタラクションする
yokomii
0
430
Rich UI implementation examples using Jetpack Compose (Jetpack Composeを活用した強力なUI表現の実装実例)
yokomii
0
15
Other Decks in Programming
See All in Programming
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.7k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
610
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
190
Android CLI
fornewid
0
220
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
330
Building a Meta Ray-Ban display app
akkeylab
0
160
Cloudflare is Agents
chimame
0
170
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
今さら聞けない .NET CLI
htkym
0
190
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
230
Google Apps Script で Ruby を動かす
kawahara
0
240
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
240
Featured
See All Featured
Side Projects
sachag
455
43k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
420
How STYLIGHT went responsive
nonsquared
100
6.2k
Documentation Writing (for coders)
carmenintech
77
5.5k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
370
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
Technical Leadership for Architectural Decision Making
baasie
3
480
Building Applications with DynamoDB
mza
96
7.2k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
410
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
The Limits of Empathy - UXLibs8
cassininazir
1
600
Transcript
2023/6/15 横山朝海(@yokomii) 日経電子版 for Androidにおける ドメインレイヤ(ユースケース)の実装方針について NIKKEI TECH TALK #8
1
2 ドメインレイヤ
ハッシュタグ #nikkei_tech_talk • クリーンアーキテクチャやオニオンアーキテクチャにおけるドメイン層のこ とではありません🙇 • Androidの推奨アーキテクチャガイドラインにおけるドメインレイヤです ◦ https://developer.android.com/topic/architecture/intro ◦
日経電子版 Androidアプリではこの推奨アーキテクチャを設計の基 本指針としています ドメインレイヤ 3
ハッシュタグ #nikkei_tech_talk Android 推奨アーキテクチャ 4 • 推奨アーキテクチャにおける共通原則 ◦ 関心の分離 ◦
永続データモデルによるUI操作 ◦ SSOT ◦ 単方向データフロー(UDF) • 上記共通原則を考慮した上で、2層(UI、データ) 以上のレイヤードアーキテクチャを推奨 ◦ ドメインレイヤはオプショナル
ハッシュタグ #nikkei_tech_talk データレイヤ 5 • アプリデータの作成、保存、変更のためのビジネ スロジック群 • データソース ◦
アプリとシステム(ネットワーク、ローカルDBな ど)間のデータの橋渡しをする • リポジトリ ◦ データ管理のためのビジネスロジックを有す る ◦ 上位レイヤにデータを公開する
ハッシュタグ #nikkei_tech_talk UIレイヤ 6 • データレイヤから取得したデータを表示するため のレイヤ • UI状態ホルダ(ViewModel) ◦
下位レイヤからデータの取得 ◦ UI状態の生成・保持 ◦ UI操作によって適切なビジネスロジックを呼 び出す • UI要素(View、Jetpack Compose) ◦ UIをレンダリング
ハッシュタグ #nikkei_tech_talk 🌟ドメインレイヤ 7 • UIレイヤとデータレイヤの間に位置するレイヤ • 複雑なビジネスロジックや、複数のUI状態ホルダ で再利用される単純なビジネスロジックをカプセル 化した「ユースケース」クラスを内包
ハッシュタグ #nikkei_tech_talk ユースケース 8 • ビジネスロジックをカプセル化したクラス ◦ 1ビジネスロジックにつき1クラスの単位で実 装 •
その他ガイドライン上の推奨事項 ◦ 命名規則 ▪ 動詞の現在形 + 対象 + UseCase ◦ ライフサイクルを持たない ▪ 毎回新しいインスタンスを生成 ▪ 状態(可変データ)を持たない ◦ メインセーフ
ハッシュタグ #nikkei_tech_talk ユースケース 9 • ユースケースクラスを設ける利点 ◦ 共通ロジックをカプセル化することでボイラー プレートコードの回避 ◦
ロジックを外部クラスに切り出すことで、ケー スを使用するクラスの可読性の向上 ◦ 1クラスで1ビジネスロジックだけに集中するこ とでコードがシンプルになり、テストが書きや すい
ハッシュタグ #nikkei_tech_talk ユースケース 10 • システムの振る舞いの中核を担う、クリーンアーキテクチャのユースケースとは別物 • あくまでビジネスロジックをカプセル化することで、コードの複雑さを減らすことが目的 • 推奨事項がいくつか存在するが、様々なアプリに適用しやすいようにあえて厳格なルールは設けられ
ていない⇨自由実装になりがち • 👉 ガイドライン以上の細かな方針を各アプリで定めることが重要!! https://developer.android.com/jetpack/guide/domain-layer
11 日経電子版 for Androidにおける ユースケースの実装方針🧭 (推奨ケース・非推奨ケース)
12 🙆推奨ケース
ハッシュタグ #nikkei_tech_talk 🙆推奨ケースその1 13 複数リポジトリ処理を組み合わせる • (公式ガイドラインでも紹介されているケース) • 複数リポジトリからの取得値を別の値に変換して 返すなど
• ユースケースはUIレイヤとデータレイヤの間に位 置するので、UI状態ホルダとリポジトリの中継処 理をすることが多い
ハッシュタグ #nikkei_tech_talk 🙆推奨ケースその2 14 単一リポジトリ内の複数処理を組み合わせる • (このようなビジネスロジックは大体リポジトリ側で 吸収できるはず) • アプリ特有の関数の実行手順がある場合などに
ユースケースで吸収 ◦ 例えばWearとモバイルで共通のリポジトリを 用いているが、リトライ回数に違いがあるとき など
ハッシュタグ #nikkei_tech_talk 🙆推奨ケースその3 15 再利用されるビジネスロジック • (公式ガイドラインでも紹介されているケース) • UIレイヤで繰り返し発生するロジックをビジネスロ ジックとしてカプセル化する
• 公式ガイドではUtilクラスの代替としてユースケー スを用いることを推奨 ◦ Utilクラスは1クラスに複数ビジネスロジックが 含まれることで肥大化し煩雑になりがち ◦ 反面ユースケースは1クラス1ロジックかつ、ク ラス名によって処理内容が明瞭
16 🙅非推奨ケース
ハッシュタグ #nikkei_tech_talk 🙅非推奨ケースその1 17 リポジトリの関数を呼ぶだけのケース • UIからリポジトリの直接参照を禁止する場合に、 その中継を担うためのケース • リポジトリ参照を制限をするメリット
◦ UIでデータ取得する際に必ずユースケースを 経由するのでコードの一貫性が保たれる ◦ リポジトリに含まれる全ての関数がUIに公開 されなくなる
ハッシュタグ #nikkei_tech_talk 🙅非推奨ケースその1 18 リポジトリの関数を呼ぶだけのケース • 日経電子版のデータレイヤの特徴 ◦ 扱うデータの種類が多い ◦
リポジトリの関数の種類が多い ▪ サービスを長期運用する中でどんどん数 が増えていった • 関数呼び出しごとにクラスを設けた場合にクラス 数が膨大になりすぎる ◦ 先にデータやリポジトリ関数の整理が必要 • ↑のため、UI状態ホルダがリポジトリを直接参照す ることを制限せず、このようなケースは一旦不要と した
ハッシュタグ #nikkei_tech_talk 🙅非推奨ケースその2 19 モデルデータをUI状態に変換 • UI状態 = モデルデータをUIがレンダリングしやす い形式に加工した状態
◦ ref: https://developer.android.com/topic/archite cture/ui-layer#define-ui-state • UI状態をカプセル化したクラスはUIレイヤに定義 している ◦ 下層であるドメインレイヤからは参照できない • よってUI状態はUIレイヤの関心ごと⇨変換はUIレ イヤでやる
ハッシュタグ #nikkei_tech_talk 🙅非推奨ケースその3 20 Resultクラスを戻り値とするビジネスロジック • 当初、kotlin.Resultや自作のResultクラスで実行 結果をラップして値を返すようなケースを認めてい た •
←のようなコードでは、CancellationExceptionを 握りつぶしてしまうので呼び出し元のコルーチンが 正常に中断されなくなる • 意図しないキャンセル例外の握りつぶしを防ぐた めにResultクラスの利用は非推奨とした ◦ FYI: kotlin-resultには runSuspendCatching()というこの問題を回避 する仕組みがある
ハッシュタグ #nikkei_tech_talk • Androidの推奨アーキテクチャは幅広いアプリ(iOSも👍)に適用しやすいように、あえて厳密にルー ル化されていない部分がある ◦ そのため、各アプリでより詳細な方針を定めることが重要 • 今回紹介した方針はあくまで電子版における内容であり、全てのアプリにおいて最適解ではないこと をご留意ください
◦ 開発規模や要件によって最適な戦略を探る🧐 • アプリ独自の方針が公式ガイドラインの指針から大きく外れないことを推奨 ◦ 公式の情報はエンジニア間で共通認識となりやすいので、そこに揃えておくと読み解きやすい コードになる • 皆さんの開発してるアプリでのユースケースの実装方針もぜひ教えてください🫶 まとめ 21
22 ご清聴ありがとうございました🧏