Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
200
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
110
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
740
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.6k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
450
Workers Cache を知る
syumai
0
320
iOSDCのペンライトを自動制御したい!
akkeylab
0
300
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
Are APIs Still Relevant in the AI Era?
soyuka
0
380
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
570
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
580
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
250
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Un-Boring Meetings
codingconduct
0
430
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
300
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
BBQ
matthewcrist
89
10k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
Statistics for Hackers
jakevdp
799
230k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The Curious Case for Waylosing
cassininazir
1
550
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と結合するまでに、テストケースを記述 し、オールグリーンにしておく。