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
Androidアプリ開発にクリーンアーキテクチャを取り入れよう
Search
kan
February 18, 2016
Programming
680
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Androidアプリ開発にクリーンアーキテクチャを取り入れよう
アーキテクチャ編
kan
February 18, 2016
More Decks by kan
See All by kan
Androidアプリ開発にクリーンアーキテクチャを取り入れよう(OSS編)
notice
0
180
Laravel5.1をつかった Webアプリケーション開発
notice
0
190
Other Decks in Programming
See All in Programming
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
510
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
600
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
110
Building a Meta Ray-Ban display app
akkeylab
0
180
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1k
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
350
メールのエイリアス機能を履き違えない
isshinfunada
0
250
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.2k
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
160
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
430
Dockerfile CMD for Node.js
grazie1999
0
120
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
470
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
From π to Pie charts
rasagy
0
320
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
300
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Side Projects
sachag
455
43k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
790
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Writing Fast Ruby
sferik
630
63k
Transcript
Androidアプリ開発にクリーン アーキテクチャを取り入れよう (アーキテクチャ編) 2016/02/18 notice,inc. http://www.notice.co.jp/ @notice_inc
Androidアプリ開発の悩み FatAcitivity なんでもかんでもアクティビティに詰め込む Recreation アクティビティのリクリエーション時の再生処理 Fragment フラグメントの複雑なライフサイクルにともなうクラッシュ Asynchronous 非同期処理実装の困難さ
アクティビティリクリエーションに関して configureChangeで回転を止めると、オリエンテー ション変更のイベントがとれず、画面をアダプティブ にできない(オリエンテーション固定アプリなら有 効)。 仕様検討するときに、可能な限り復元しなくていい ように考慮すべき。 フラグメントの注意点 ref. WTF
what the fuck! なんだこれ? http://ninjinkun.hatenablog.com/entry/2014/10/16/234611
様々なアーキテクチャと開発手法 基礎 PofEAA(Patterns of Enterprise Application Architecture) - Martin Fowler
DDD(Domain Driven Design) - Eric Evans UCDD(Use Case Driven Design) MVCの発展形 MVVM(Model-View-ViewModel) MVP(Model-View-Presenter) テスティング TDD(Test Driven Development) - Kent Beck BDD(Behavior Driven Development) 非同期処理 FRP(Functional Reactive Programing) Rx(Reactive Extentions)
クリーンアーキテクチャ The Clean Architecture http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html (1)ビジネスロジックとUIを分離する。 (2)全体が固有のフレームワークやライブラリに依存しない。 (3)データ永続化の手段に依存しない(database,filesystem)。 (4)ユニットテストしやすくする※1。 ※1APIテストケースはそのままAPI利用のサンプルになるので、
ドキュメントの代わりになる。
クリーンアーキテクチャを取り入れよう 依存関係逆転の原則(DIP:the Dependency Inversion Principle) interfaceを使って、オブジェクト間の依存関係を疎に保ち、IoCコンテナで結合する。 関心の分離(SoC: Separation Of Concerns)
UIとビジネスロジック - まぜるな危険! ビジネスロジックとモデル - 特定のデータベースに依存しないように! IoC(DI)って、何が便利なの? ・ユニットテストが簡単。 ・モックオブジェクトでとりあえず、結合できるので、まだ未完成な部分の完成を待つことなく、開発できる。 ・初期化のボイラープレートがなくなる。 開発は、様々なオープンソースライブラリを利用することになるが、開発中に急に使えないと判断せざるえない場合が ある。 そんなときでも、代替のライブラリが利用できるようにしておくことが重要。 オープンソースを利用するなら、最悪は自分でソースコードを修正するぐらいの覚悟が必要。
実際、どうやるの? 以下のようなレイヤーを構成する。 レイヤー アクティビティ ヴュー プレゼンタ インタラクション リポジトリ モデル/APIサービス
アクティビティ Activityはアプリに一つだけ定義する。 各Viewを保持するコンテナとして利用する。 各画面はCustomViewまたはFragmentで実装する (CustomViewなら画面遷移アニメーションも自力実装)。 画面遷移はアクティビティ内で管理する(バックボタン 等も)。
ヴュー Fragment,CustomViewからビジネスロジックを追い出す。 Button button = (Button)v.findViewById(R.id.some_button); button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { ここにだらだら、ロジックを書かず、プレゼンタへまかせる。 操作中の状態を保持するような変数も全てプレゼンタで定義する(ViewModel) presenter.doSomeAction(); } } ); // AndroidStudioなら、SAM(Single Abstract Method)型はlambdaで書ける。 // Retrolambda(backport tool)を使うとJava8のlambdaで書ける。
プレゼンタ Viewを保持したPOJOオブジェクト。 プレゼンタはユーザーの操作から、具体的なビジネスロジックを実行し、その結果をViewに反映する。 一時的な表示上のデータ(チェック状態、選択状態、編集状態)はViewModelに保持する。 オリエンテーションチェンジで保存しておきたいViewModelは、 ActivityのonSaveInstanceStateでプレゼンタのsaveInstanceState()を呼び、 restoreInstanceState()で復元する。 Presenter View Interaction
ViewModel
インタラクション ビジネスロジックを実装するクラス。 設計(interface)と実装(implement)を分離し、DIできるようにしておく。 関連のあるユースケースをインタラクションクラスとして定義する。 インタラクションは、APIを呼び出してサーバからデータを取得し、必要 ならリポジトリを利用して、データを永続化する。 非同期実行インタラクションは終了ハンドラを実装するか、Rxのオブ ザーバーや、Promiseのようなタスクを返す。 インタラクションはプレゼンタからコールされる。
リポジトリ モデルの操作を受け持つ。 インタラクションから呼ばれて、APIで取得したデータを を永続化したり、永続化されているデータを取り出す。 状態は保持しない。 データの永続化に関しては、モデルの実装に依存する。 インタラクションがモデルの実装に依存しないように、モ デルの実装を隠蔽する役目を持つ。
APIサービス サーバサイドとの通信を受け持つ。 サーバサイドから提供される各APIごとにメソッドを実装する。 APIサービスは、Rxのオブザーバーや、Promiseのようなタスクを返す。 APIサービスの下位にHTTPクライアントライブラリの実装をおいて、A PIサービスのインタフェースはライブラリ実装に依存しない。 下位層のプロトコルがHTTPなら、メソッド(GET,POST)、ヘッダ(認証 キー、Cookieなど)を隠蔽する。
モデル 基本的にプレーンなオブジェクト(POAA:Plain Old Android Object)で実装する。 具体的なデータベース実装に依存する部分を 少なくする。 永続化する必要がなくても、APIからの応答など をモデルで定義する(JSONのままでもいいかも)。
ユニットテスト インタラクション以下の層は、JUnitなどで簡単 にテストできる。 モデル、リポジトリ、APIサービス、インタラクショ ンはGUIと結合するまでに、テストケースを記述 し、オールグリーンにしておく。