SlideShare una empresa de Scribd logo
1 de 15
Descargar para leer sin conexión
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
ViewInteraction
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と結合するまでに、テストケースを記述
し、オールグリーンにしておく。

Más contenido relacionado

La actualidad más candente

はてなにおける Android アプリのソフトウェアテスト
はてなにおける Android アプリのソフトウェアテストはてなにおける Android アプリのソフトウェアテスト
はてなにおける Android アプリのソフトウェアテストYu Nobuoka
 
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方Makoto Yamazaki
 
Model View Presenter for Android
Model View Presenter for AndroidModel View Presenter for Android
Model View Presenter for Androidshinnosuke kugimiya
 
AngularJSについて
AngularJSについてAngularJSについて
AngularJSについて昌生 高橋
 
AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行Yu Nobuoka
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。Daisuke Yamashita
 
Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。Naoto Kishino
 
3D touch for iOS
3D touch for iOS3D touch for iOS
3D touch for iOStoyship
 
ng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターンng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターンHayashi Yuichi
 
Android6.0 RuntimePermissionの実装と注意点
 Android6.0 RuntimePermissionの実装と注意点 Android6.0 RuntimePermissionの実装と注意点
Android6.0 RuntimePermissionの実装と注意点Katsuki Nakatani
 
第5回業開中心会議
第5回業開中心会議第5回業開中心会議
第5回業開中心会議Kaoru NAKAMURA
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
SeleniumConf16 UK参加報告
SeleniumConf16 UK参加報告SeleniumConf16 UK参加報告
SeleniumConf16 UK参加報告Osamu Shimoda
 
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発Osamu Monoe
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介Mori Shingo
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜Takao Sumitomo
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しようUnityTechnologiesJapan002
 

La actualidad más candente (20)

Kifの紹介
Kifの紹介Kifの紹介
Kifの紹介
 
はてなにおける Android アプリのソフトウェアテスト
はてなにおける Android アプリのソフトウェアテストはてなにおける Android アプリのソフトウェアテスト
はてなにおける Android アプリのソフトウェアテスト
 
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
 
Model View Presenter for Android
Model View Presenter for AndroidModel View Presenter for Android
Model View Presenter for Android
 
AngularJSについて
AngularJSについてAngularJSについて
AngularJSについて
 
AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
バグのことは嫌いになってもXcodeのことは嫌いにならないでください。
 
Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。Win7 * appium * androidで実機自動テストやってみた。
Win7 * appium * androidで実機自動テストやってみた。
 
Stac2014 石川
Stac2014 石川Stac2014 石川
Stac2014 石川
 
3D touch for iOS
3D touch for iOS3D touch for iOS
3D touch for iOS
 
ng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターンng-mtg#6 AngularJS ディレクティブ・パターン
ng-mtg#6 AngularJS ディレクティブ・パターン
 
Android6.0 RuntimePermissionの実装と注意点
 Android6.0 RuntimePermissionの実装と注意点 Android6.0 RuntimePermissionの実装と注意点
Android6.0 RuntimePermissionの実装と注意点
 
第5回業開中心会議
第5回業開中心会議第5回業開中心会議
第5回業開中心会議
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
SeleniumConf16 UK参加報告
SeleniumConf16 UK参加報告SeleniumConf16 UK参加報告
SeleniumConf16 UK参加報告
 
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 

Similar a Androidアプリ開発にクリーンアーキテクチャを取り入れよう

Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
 Sansan Tech Meetup Androidエンジニアが振り返る Google I/O   Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
Sansan Tech Meetup Androidエンジニアが振り返る Google I/O 健一 辰濱
 
無料静的ホスティング × FaaSの話
無料静的ホスティング × FaaSの話無料静的ホスティング × FaaSの話
無料静的ホスティング × FaaSの話Shinichi Ueno
 
Origami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しよう
Origami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しようOrigami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しよう
Origami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しようkoji kobayashi
 
Smartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポートSmartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポートMasaru Kimura
 
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)Mitsuru Ogawa
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことleverages_event
 
App Modernization for .NET
App Modernization for .NETApp Modernization for .NET
App Modernization for .NETYuta Matsumura
 
SGT技術トークス 継続的デリバリー
SGT技術トークス 継続的デリバリーSGT技術トークス 継続的デリバリー
SGT技術トークス 継続的デリバリーYukei Wachi
 
uGUIのRectTransformをさわってみた
uGUIのRectTransformをさわってみたuGUIのRectTransformをさわってみた
uGUIのRectTransformをさわってみたKeizo Nagamine
 
恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例Life Robotics
 
ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewRakuten Group, Inc.
 
AppPot製品概要
AppPot製品概要AppPot製品概要
AppPot製品概要Ryohei Sogo
 
Ricoh UCS for iPad でみる エンタープライズ アジャイル開発
Ricoh UCS for iPad でみる エンタープライズ アジャイル開発Ricoh UCS for iPad でみる エンタープライズ アジャイル開発
Ricoh UCS for iPad でみる エンタープライズ アジャイル開発Naoki Umehara
 
Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Atsushi Harada
 
「Camelog」Android開発秘話
「Camelog」Android開発秘話「Camelog」Android開発秘話
「Camelog」Android開発秘話Shoya Tsukada
 
Androidのライブ壁紙について
Androidのライブ壁紙についてAndroidのライブ壁紙について
Androidのライブ壁紙についてyoropan
 

Similar a Androidアプリ開発にクリーンアーキテクチャを取り入れよう (20)

Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
 Sansan Tech Meetup Androidエンジニアが振り返る Google I/O   Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
 
無料静的ホスティング × FaaSの話
無料静的ホスティング × FaaSの話無料静的ホスティング × FaaSの話
無料静的ホスティング × FaaSの話
 
Origami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しよう
Origami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しようOrigami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しよう
Origami studio (ver2) 勉強会 #2 - 仕組みやコンセプトを理解しよう
 
Smartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポートSmartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポート
 
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)今後のWeb開発の未来を考えてangular jsにしました(拡大版)
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
 
Reactive
ReactiveReactive
Reactive
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のこと
 
ARCore Update (Jan 2020)
ARCore Update (Jan 2020)ARCore Update (Jan 2020)
ARCore Update (Jan 2020)
 
AndroidでDIxAOP
AndroidでDIxAOPAndroidでDIxAOP
AndroidでDIxAOP
 
App Modernization for .NET
App Modernization for .NETApp Modernization for .NET
App Modernization for .NET
 
SGT技術トークス 継続的デリバリー
SGT技術トークス 継続的デリバリーSGT技術トークス 継続的デリバリー
SGT技術トークス 継続的デリバリー
 
uGUIのRectTransformをさわってみた
uGUIのRectTransformをさわってみたuGUIのRectTransformをさわってみた
uGUIのRectTransformをさわってみた
 
恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例
 
ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConView
 
AppPot製品概要
AppPot製品概要AppPot製品概要
AppPot製品概要
 
Ricoh UCS for iPad でみる エンタープライズ アジャイル開発
Ricoh UCS for iPad でみる エンタープライズ アジャイル開発Ricoh UCS for iPad でみる エンタープライズ アジャイル開発
Ricoh UCS for iPad でみる エンタープライズ アジャイル開発
 
Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~
 
CordovaでAngularJSアプリ開発
CordovaでAngularJSアプリ開発CordovaでAngularJSアプリ開発
CordovaでAngularJSアプリ開発
 
「Camelog」Android開発秘話
「Camelog」Android開発秘話「Camelog」Android開発秘話
「Camelog」Android開発秘話
 
Androidのライブ壁紙について
Androidのライブ壁紙についてAndroidのライブ壁紙について
Androidのライブ壁紙について
 

Androidアプリ開発にクリーンアーキテクチャを取り入れよう