「After DroidKaigi LT Night」2023/09/25の登壇資料です。
©2023 RAKUS Co., Ltd.アーキテクチャを明文化して臨んだ新規アプリ開発戦略After DroidKaigi LT Night2023/09/25@akkiee76
View Slide
Akihiko Sato株式会社ラクス 楽楽精算開発iOS / Android / バックエンド@akkiee76自己紹介
既存アプリのリプレース案件で実際に行なった開発戦略 😃
リプレースの背景弊社1アプリのフレームワークとして Cordova を使用● Cordova Android の開発が遅延○ 新バージョン、API への対応の遅れ● Cordova 自体の EOL リスクネイティブアプリとしてリプレースすることに
開発に向けてのチーム課題● Android ネイティブアプリのナレッジが少ない● 新規アプリ開発の経験がないリプレース案件の苦戦が明らか・・・ 😕
アーキテクチャを確立しガイドラインとして明文化しよう😃
アーキテクチャ選定にあたって● モダンなアーキテクチャは学習コストが大きい● 開発のスケジュールもタイトオーソドックスな MVVM アーキテクチャを採用(Compose の採用は見送りに)https://developer.android.com/jetpack/guide
設計の基本原則ガイドライン作成にあって以下を基本原則に● 「関心の分離(単一責任の原則)」を重要原則とする● クラスの責務をできるだけシンプル/コンパクトに保つ● 責務の細分化により、テスト容易性を向上させる
では、明文化した内容を一部紹介します😃
レイヤー構造3層レイヤー構造を採用し定義を記載● Presentation Layer● Domain Layer● Data Layerhttps://developer.android.com/jetpack/guide
Presentation Layer の定義プレゼンテーション層は、ユーザーに情報を表示し、入力を受け付ける機能を持っています。具体的には、ユーザー操作や外部入力(レスポンス)によってデータが変更されるたびに、変更された情報を反映するよう UI を更新する必要があります。主にプレゼンテーション層は、Activity、Fragment、ViewModel やBindingModel に変換するための Converter などを配置します。また、RecyclerView を用いる場合、 Adapter や ViewHolder などもプレゼンテーション層に配置します。
Domain Layer の定義ドメイン層は、複雑なビジネスロジックや複数の ViewModel で再利用される単純なビジネスロジックが隠蔽(カプセル化)されたレイヤーです。ビジネスロジックの複雑さに対処する場合や再利用性を優先する場合、対象のロジックをこのレイヤーに実装します。また、各ユースケースでは異なるビジネスロジックが集約されるため、それぞれのユースケースクラスは疎であることがアーキテクチャとして重要です。
Data Layer の定義データ層は、アプリで扱うデータに関連するロジックが集約されます。具体的には、アプリで使用するデータの作成、保存、変更方法(APIに関するものを含む)を決定する実際のロジックで構成されることがこのレイヤーの期待です。データ層は、それぞれが 0 から複数のデータソースを含むことができるリポジトリで構成されます。また、アプリで処理するデータの種類ごとに Repository を作成する必要があります。
Package 構成を定義
基本クラスの各ルールを記載・Activity・Fragment・ViewModel・UseCase・Repository・責務・命名規則・ルール(制約)・実装例・テストで確認すること・テスト実装例明文化各ルールを適用したサンプルプロジェクトも用意
開発完了後に振り返ってみると・・・
良かったこと✅ チームの技術力が向上 ・オブジェクト指向の成長✅ 設計の議論をすることが少なく、開発に注力できた ・チームの生産性が 20% 向上✅ クラスの責務を小さくしたため、テストが実装しやすかった ・テスト品質の担保
イマイチだったこと🚫 アプリ規模に対してファイル数が多くなる ・責務を細かく分けすぎてしまった🚫 メンバーにより理解度の乖離が出てしまった ・ガイドラインを作成しても実践するための学習コストは必要🚫 package 構成を各レイヤーで限定しすぎてしまった ・レイヤーを跨いで使用するクラスの置き場に困る(後述)
package 構成の技術的課題「NetworkError」のようにレイヤーを跨いで使用するクラスが複数登場package private が望ましい
課題へのアプローチ● アプリ本体はドメイン駆動の package 構造に変更● マルチモジュールを採用し、どのドメインからも参照可能に
まとめアーキテクチャの明文化により以下の恩恵を受けることができます● チームの技術力向上● 開発の生産性アップ● 品質担保チームでぜひトライしてみてはいかがでしょうか
Thank you !