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
670
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
180
Other Decks in Programming
See All in Programming
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
260
Contextとはなにか
chiroruxx
1
330
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
250
Creating Composable Callables in Contemporary C++
rollbear
0
150
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
360
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
250
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
410
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
830
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.3k
スマートグラスで並列バイブコーディング
hyshu
0
150
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
200
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
210
My Coaching Mixtape
mlcsv
0
150
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Claude Code のすすめ
schroneko
67
230k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
How to Ace a Technical Interview
jacobian
281
24k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
66
55k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
850
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と結合するまでに、テストケースを記述 し、オールグリーンにしておく。