Slide 1

Slide 1 text

©2023 RAKUS Co., Ltd. アーキテクチャを明文化して臨んだ 新規アプリ開発戦略 After DroidKaigi LT Night 2023/09/25 @akkiee76

Slide 2

Slide 2 text

Akihiko Sato 株式会社ラクス 楽楽精算開発 iOS / Android / バックエンド @akkiee76 自己紹介

Slide 3

Slide 3 text

既存アプリのリプレース案件で 実際に行なった開発戦略 😃

Slide 4

Slide 4 text

リプレースの背景 弊社1アプリのフレームワークとして Cordova を使用 ● Cordova Android の開発が遅延 ○ 新バージョン、API への対応の遅れ ● Cordova 自体の EOL リスク ネイティブアプリとしてリプレースすることに

Slide 5

Slide 5 text

開発に向けてのチーム課題 ● Android ネイティブアプリのナレッジが少ない ● 新規アプリ開発の経験がない リプレース案件の苦戦が明らか・・・ 😕

Slide 6

Slide 6 text

アーキテクチャを確立し ガイドラインとして明文化しよう😃

Slide 7

Slide 7 text

アーキテクチャ選定にあたって ● モダンなアーキテクチャは学習コストが大きい ● 開発のスケジュールもタイト オーソドックスな MVVM アーキテクチャを採用 (Compose の採用は見送りに) https://developer.android.com/jetpack/guide

Slide 8

Slide 8 text

設計の基本原則 ガイドライン作成にあって以下を基本原則に ● 「関心の分離(単一責任の原則)」を重要原則とする ● クラスの責務をできるだけシンプル/コンパクトに保つ ● 責務の細分化により、テスト容易性を向上させる

Slide 9

Slide 9 text

では、明文化した内容を一部紹介します😃

Slide 10

Slide 10 text

レイヤー構造 3層レイヤー構造を採用し定義を記載 ● Presentation Layer ● Domain Layer ● Data Layer https://developer.android.com/jetpack/guide

Slide 11

Slide 11 text

Presentation Layer の定義 プレゼンテーション層は、ユーザーに情報を表示し、入力を受け付ける機能を 持っています。具体的には、ユーザー操作や外部入力(レスポンス)によって データが変更されるたびに、変更された情報を反映するよう UI を更新する必要 があります。 主にプレゼンテーション層は、Activity、Fragment、ViewModel や BindingModel に変換するための Converter などを配置します。また、 RecyclerView を用いる場合、 Adapter や ViewHolder などもプレゼンテーショ ン層に配置します。

Slide 12

Slide 12 text

Domain Layer の定義 ドメイン層は、複雑なビジネスロジックや複数の ViewModel で再利用される単 純なビジネスロジックが隠蔽(カプセル化)されたレイヤーです。 ビジネスロジックの複雑さに対処する場合や再利用性を優先する場合、対象の ロジックをこのレイヤーに実装します。また、各ユースケースでは異なるビジネ スロジックが集約されるため、それぞれのユースケースクラスは疎であることが アーキテクチャとして重要です。

Slide 13

Slide 13 text

Data Layer の定義 データ層は、アプリで扱うデータに関連するロジックが集約されます。具体的に は、アプリで使用するデータの作成、保存、変更方法(APIに関するものを含 む)を決定する実際のロジックで構成されることがこのレイヤーの期待です。 データ層は、それぞれが 0 から複数のデータソースを含むことができるリポジト リで構成されます。また、アプリで処理するデータの種類ごとに Repository を 作成する必要があります。

Slide 14

Slide 14 text

Package 構成を定義

Slide 15

Slide 15 text

基本クラスの各ルールを記載 ・Activity ・Fragment ・ViewModel ・UseCase ・Repository ・責務 ・命名規則 ・ルール(制約) ・実装例 ・テストで確認すること ・テスト実装例 明文化 各ルールを適用したサンプルプロジェクトも用意

Slide 16

Slide 16 text

開発完了後に 振り返ってみると・・・

Slide 17

Slide 17 text

良かったこと ✅ チームの技術力が向上  ・オブジェクト指向の成長 ✅ 設計の議論をすることが少なく、開発に注力できた  ・チームの生産性が 20% 向上 ✅ クラスの責務を小さくしたため、テストが実装しやすかった  ・テスト品質の担保

Slide 18

Slide 18 text

イマイチだったこと 🚫 アプリ規模に対してファイル数が多くなる  ・責務を細かく分けすぎてしまった 🚫 メンバーにより理解度の乖離が出てしまった  ・ガイドラインを作成しても実践するための学習コストは必要 🚫 package 構成を各レイヤーで限定しすぎてしまった  ・レイヤーを跨いで使用するクラスの置き場に困る(後述)

Slide 19

Slide 19 text

package 構成の技術的課題 「NetworkError」のようにレイヤーを跨いで使用するクラスが複数登場 package private が望ましい

Slide 20

Slide 20 text

課題へのアプローチ ● アプリ本体はドメイン駆動の package 構造に変更 ● マルチモジュールを採用し、どのドメインからも参照可能に

Slide 21

Slide 21 text

まとめ アーキテクチャの明文化により以下の恩恵を受けることができます ● チームの技術力向上 ● 開発の生産性アップ ● 品質担保 チームでぜひトライしてみてはいかがでしょうか

Slide 22

Slide 22 text

Thank you !