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
DMM Android Meetup#5 「例外と向き合う」
Search
irom219
June 23, 2023
Technology
1
610
DMM Android Meetup#5 「例外と向き合う」
https://dmm.connpass.com/event/283512/
irom219
June 23, 2023
Tweet
Share
More Decks by irom219
See All by irom219
DroidKaigi CfP分析
yukihiromori
0
160
レイヤードアーキテクチャにおける例外との向き合い方
yukihiromori
0
5k
Android meetup #3 モバイルエンジニア向けのGCP Cloud Functions
yukihiromori
2
340
DMM android meatup #2 Android OpenGLES
yukihiromori
2
400
Other Decks in Technology
See All in Technology
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
200
Introduction to Works of ML Engineer in LY Corporation
lycorp_recruit_jp
0
140
SRE×AIOpsを始めよう!GuardDutyによるお手軽脅威検出
amixedcolor
0
190
マルチモーダル / AI Agent / LLMOps 3つの技術トレンドで理解するLLMの今後の展望
hirosatogamo
37
12k
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
OTelCol_TailSampling_and_SpanMetrics
gumamon
1
220
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
210
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
490
複雑なState管理からの脱却
sansantech
PRO
1
160
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
1.3k
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.7k
Featured
See All Featured
Building Your Own Lightsaber
phodgson
103
6.1k
GraphQLとの向き合い方2022年版
quramy
43
13k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
The Pragmatic Product Professional
lauravandoore
31
6.3k
A designer walks into a library…
pauljervisheath
204
24k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Scaling GitHub
holman
458
140k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Done Done
chrislema
181
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
430
Transcript
© DMM © DMM CONFIDENTIAL 例外と向き合う #dmm_android勉強会 電子書籍事業部 森 幸浩
2023/06/20
© DMM 2 名前 森 幸浩 (もり ゆきひろ) 所属 電子書籍事業部
Androidチーム 自己紹介 • 約3年電子書籍事業部のAndroidチームで開発 • リファクタリングや新機能開発を担当
© DMM 3 ▪ 例外についての言語仕様 - Java言語での例外 - Kotlin言語での例外 -
検査例外がなくなった背景 ▪ Kotlinの例外処理のアプローチ - 非検査例外 - エラー状態の定義 ▪ DMMブックスでの例外処理のアプローチ - 非検査例外の独自定義 目次
© DMM 例外についての言語仕様
© DMM Java言語での例外 5 検査例外 ▪ コンパイル時にtry-catchがされているかを チェックする 非検査例外 (RuntimeException)
▪ コンパイル時にtry-catchがされているかを チェックしない
© DMM Java言語での例外 6 検査例外 ▪ コンパイル時にtry-catchがされているかをチェックする
© DMM Java言語での例外 7 非検査例外 (RuntimeException) ▪ コンパイル時にtry-catchがされているかをチェックしない
© DMM Java言語での例外 8 検査例外 ▪ コンパイル時にtry-catchがされているかを チェックする 例外処理をプログラマに強制する 非検査例外
(RuntimeException) ▪ コンパイル時にtry-catchがされているかを チェックしない 例外処理はプログラマの判断に任される
© DMM Kotlin言語での例外 ところが... Kotlinではコンパイルエラーがでない 9
© DMM Kotlin言語での例外 Kotlinでは検査例外が廃止された 翻訳 Kotlinには検査例外がありません。ここには多くの理由がありますが、なぜそうしたのかを説明する簡 単な例を示します。 10 https://kotlinlang.org/docs/exceptions.htm l#checked-exceptions
↑公式ドキュメントより抜粋
© DMM Kotlin言語で検査例外がなくなった背景
© DMM 検査例外がなくなった背景 検査例外はコンパイル時点で処理すべき例外の漏れを防げる - 生産性が上がる - 品質向上につながる と思われていたが... 12
© DMM 検査例外がなくなった背景 小規模なシステムであれば 発生箇所からハンドリングまでの距離が近いため複雑化しない 13
© DMM 検査例外がなくなった背景 14 小規模なシステムであれば 考慮しなければいけない例外の数も限定的
© DMM 検査例外がなくなった背景 システムの規模が大きくなると 発生箇所とハンドリングまでの距離が遠く中間のビジネスロジックが 複雑化 15
© DMM 検査例外がなくなった背景 システムの規模が大きくなると 複雑化したビジネスロジックでは考慮しなければならない例外が 爆発的に増加 16
© DMM 検査例外がなくなった背景 中間層ではthrows項で発生する例外の明示が必要なため 大量の例外宣言によりコードの可読性が落ち、生産性が落ちる 17
© DMM 検査例外がなくなった背景 結果として 検査例外を握りつぶしたり... 18
© DMM 検査例外がなくなった背景 結果として 非検査例外に変えたりする実装が横行し品質も上がらない 19
© DMM 検査例外がなくなった背景 検査例外はコンパイル時点で処理すべき例外の漏れを防げる - 生産性が上がる - 品質向上につながる と思われていたが、規模が大きくなると -
生産性が下がり - 品質向上もしない (握り潰しなどの横行により) 20
© DMM Kotlin言語での例外処理のアプローチ
© DMM Kotlin言語での例外処理のアプローチ 非検査例外 Java言語の非検査例外と同様に 非検査例外をthrowする方法 実行側でtry-catchにより ハンドリングする 22
© DMM Kotlin言語での例外処理のアプローチ 非検査例外 メリット - シンプルに書ける - 可読性が高い デメリット
- ハンドリングが漏れると クラッシュに繋がる 23
© DMM Kotlin言語での例外処理のアプローチ エラー状態の定義 例外を取りうる操作の場合 実行結果にエラー状態を定義する 24
© DMM Kotlin言語での例外処理のアプローチ エラー状態の定義 メリット - 網羅的に書ける デメリット - 実行結果の型定義が増える
- 予め例外を想定する必要がある 25
© DMM DMMブックスアプリでの例外処理のアプローチ
© DMM DMMブックスアプリでのアプローチ 非検査例外を独自定義 文脈単位で非検査例外を独自定義 個別に関心事がある例外をsealedクラスの子クラスで定義 27
© DMM DMMブックスアプリでのアプローチ 非検査例外を独自定義 Repository層で変換 親クラスで伝播する 28
© DMM DMMブックスアプリでのアプローチ 非検査例外を独自定義 Repository層で独自定義の例外に変換して上位のレイヤーに伝播していく 29
© DMM DMMブックスアプリでのアプローチ 非検査例外を独自定義 UseCase層など中間層では集約された例外で扱うため 記述量が抑えられる 30
© DMM DMMブックスアプリでのアプローチ 非検査例外を独自定義 ViewModel層で表示内容に変換する際に集約化された詳細を確認する 31
© DMM DMMブックスアプリでのアプローチ 非検査例外を独自定義 - 関心ごとのある例外をsealedクラスで定義 → 網羅性をある程度 確保 -
文脈単位で定義することで伝播する例外を集約 → 中間層での可読性の向上 といった感じで 例外を階層化し集約することで複雑さを整理することにしました 32
© DMM まとめ
© DMM まとめ ▪ 例外についての言語仕様 Java言語では検査例外があるがKotlinでは検査例外がない 検査例外はスケールが大きくなると生産性が落ち、品質向上につながらない そのためKotlinでは検査例外が廃止された ▪ Kotlinの例外処理のアプローチ
非検査例外 可読性は上がるが 網羅性に問題あり エラー定義 網羅性はあるが 定義量が多くなる ▪ DMMブックスでの例外処理のアプローチ 非検査例外を独自に階層化し集約 関心事のある例外のみを定義することで網羅性と可読性をあげた 34
© DMM ご静聴ありがとうございました