Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Android Clean
Architecture ことはじめ
Mercari, Inc.
Tomoaki Imai
08/08/2015 Android All Stars @Shibuya dots.
Tomoaki Imai
Mercari, Inc.
twitter: @tomoaki_imai
github: tomoima525
今日はみなさんに質問が
あります
胸に手を当てて振り返って
みてください
キレイな設計、できてますか?
Androidにおける設計の難しさ
• Life Cycle(画面再生成 etc)
• 数多く存在するApi
• OSごとのバージョン管理
みんな似たようなことで
悩んでる
ライフサイクル
考えるのめんどくさい
画面回転が入ると面倒
Activity, Fragmentが
どんどん肥大化する
ディレクトリ構成が
プロジェクトでまちまち
Unit/UI Testが難しい
“Android Clean Architecture”
という考え方
The Clean Architecture by Uncle Bob
http://blog.8thlight.com/uncle-bob/2012/08/13/the-...
“Android Clean Architecture”
という考え方
The Clean Architecture
(Enterprise Application)
(Web Service)
+ =
Android
Clean Archit...
“Android Clean Architecture”
という考え方
http://www.slideshare.net/shinnosukekugimiya/ss-50705888
https://github.com/android10/...
今日みなさんに持って返って
もらいたいもの
• Android Clean Architectureの思想をさっくり
理解する
• Android Clean Architectureの実際的な実装方
法を理解する
• 既存の設計と比べてどうい...
標準的なWeb設計の指針
“MVC Architecture”
MVC Architecture
Model
アプリケーションデータ
ビジネスロジック
View Modelをレンダリングする
Controller ユーザーイベントをハンドルする
View
Model
Controller
User
uses...
Life Cycle
Data source
Frameworks
Android Frameworks
Activity
Life Cycle
MVC Architecture on Android
Model
アプリケーションデータ
(http, DB, memory色々)
ビジネスロジック
View
Mo...
MVCでアプリ
Sample App
• GithubからFollowerを取って
くるアプリ
• Followerのrepository見れる
• 選択したFollowerはメモリに
キャッシュし、2回目以降は
トーストで通知する
https://githu...
private GithubApi mApi;
private UserMemoryCache mUserMemoryCache;
…
mApi = createApi();
mUserMemoryCache = UserMemoryCache...
public class MainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// create views...
}
@Override
...
public class MainActivity {
// User events
public void onClick(){}
public void afterTextChanged(){}
// System events
publi...
MVC Architecture on Android
における課題
View(の状態管理)とControllerがActivity上に混在している
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(Li...
Clean Way…?
MVC Architecture on Android
における課題
View(の状態管理)とControllerがActivity上に混在している
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(Li...
MVP Architecture
MVP Architecture
• Presenterを介してModelを制御する設計
View
Presenterからの情報を
レンダリングする
-> 端末の状態は配慮不要
になる
Presenter
- Activityから分割
- ユー...
public interface ShowUserListView {
// UI として表示したい処理を定義する
void showLoading();
void hideLoading();
void showNoResultCase();...
public abstract class Presenter {
// Activity LifeCycle
public abstract void initialize();
public abstract void resume();
...
Activity
public class MainActivity implements ShowUserListView{
@Override
public void onCreate(){
mShowUserListPresenter =...
MVC Architecture on Android
における課題
MVP Architecture
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(LifeCycle)に影響を受ける/テストしにくい...
MVC Architecture on Android
における課題
MVP Architecture
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(LifeCycle)に影響を受ける/テストしにくい...
Domain Layer
• Domain Layerにビジネスロジック
(interactorまたはuse casesと呼ぶ)を
集約する
• Modelとの処理はDomain経由で行う
• 処理は非同期で実行する
• Pure Java
Domain Layer
D...
Domain Layer
UseCase
<<abstract>>
ベースとなるスレッド処理を実装
ConcreteUseCase
UseCaseを継承
ロジック処理の実行、Presenterへのコールバック
PostExecutionThre...
public abstract class UseCase<T> {
// スレッドをキュー処理できるようにする
private ExecutorService mExecutorService
= Executors.newSingleThr...
public class FollowerListUseCase extends UseCase<String> {
@Override
public void execute(String user, FollowerListUseCaseC...
Presenter
public class ShowUserListPresenter extends Presenter
implements FollowerListUseCaseCallback {
private FollowerLi...
MVC Architecture on Android
における課題
MVP Architecture
Domain Layer
Modelのデータ・ソースが多様
各層の依存関係が強い
MVC Architecture on Android
における課題
MVP Architecture
Domain Layer
Modelのデータ・ソースが多様
各層の依存関係が強い
Data Layer
Android Frameworks
Data Layer
• データをEntity(メソッドやデー
タ構造体のかたまり)として扱う
• Domain Layerにデータ元を意識
させないためにRepository パ
ターンで実装する
Dom...
Repository Pattern
• ドメイン駆動開発で利用されるデザインパターン
• UseCaseで必要なデータソースを集約した
Repositoryクラスを実装する
Data
UserRepository DocsRepository...
public class UserRepository {
private GithubApi mApi; // Github API用のインスタンス
private UserMemoryCache mUserMemoryCache; //メモ...
MVC Architecture on Android
における課題
MVP Architecture
Domain Layer
Data Layer(Repository Pattern)
各層の依存関係が強い
MVC Architecture on Android
における課題
MVP Architecture
Domain Layer
Data Layer(Repository Pattern)
各層の依存関係が強い
Dependency Inversion
Principle
Dependency Inversion
Principle
• 依存関係逆転の原則
• 上位モジュールは下位モジュー
ルに依存しない
例) PresenterはDomainの実装が
どのようになってても影響を受
けない
• interface...
public interface UserRepository {
// Domain層(UseCase)側はこの interfaceの仕様だけ知っていればOK
void getFollowers(String userId, UserRepo...
MVC Architecture on Android
における課題
MVP Architecture
Domain Layer
Data Layer(Repository Pattern)
Dependency Inversion Princ...
どう変わった?
こう変わった!
Android Frameworks
Domain
Android Frameworks
Activity
View
Data
Presenter
User
usessees
interface
interface
UIがビジネ...
なんか難しい…?
少しずつ手をつけると
よいかも
どこから手を付けるべきか
手法 実現難易度
MVP Architecture ☆
Domain Layer ☆☆☆
Data Layer(Repository Pattern) ☆☆
Dependency Inversion Principle...
Next step…
• Dependency Injection
• 簡潔に書ける
• モジュールの載せ替えが容易
Next step…
• Implementing Observer Pattern
• Domain Layerの煩雑なスレッド処理, Callback地獄か
らの開放
参考例:
https://github.com/android10/An...
– Clean Architecture, Uncle Bob
Architecture is about Intents,
not Frameworks
– Clean Architecture, Uncle Bob
設計とは(良いコードが書きたいっていう)
意志である!
フレームワークなんて関係ねぇ!(意訳)
Upcoming SlideShare
Loading in …5
×

Android cleanarchitecture

20,650 views

Published on

This slide explains how to develop better Android app with Android Clean Architecture

Published in: Engineering
  • //DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... //DOWNLOAD PDF EBOOK here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... //DOWNLOAD EPUB Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... //DOWNLOAD doc Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... //DOWNLOAD PDF EBOOK here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... //DOWNLOAD EPUB Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... //DOWNLOAD doc Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Thank you so much for your slide! Do you have English version of this slide? Thank you!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Android cleanarchitecture

  1. 1. Android Clean Architecture ことはじめ Mercari, Inc. Tomoaki Imai 08/08/2015 Android All Stars @Shibuya dots.
  2. 2. Tomoaki Imai Mercari, Inc. twitter: @tomoaki_imai github: tomoima525
  3. 3. 今日はみなさんに質問が あります
  4. 4. 胸に手を当てて振り返って みてください
  5. 5. キレイな設計、できてますか?
  6. 6. Androidにおける設計の難しさ • Life Cycle(画面再生成 etc) • 数多く存在するApi • OSごとのバージョン管理
  7. 7. みんな似たようなことで 悩んでる ライフサイクル 考えるのめんどくさい 画面回転が入ると面倒 Activity, Fragmentが どんどん肥大化する ディレクトリ構成が プロジェクトでまちまち Unit/UI Testが難しい
  8. 8. “Android Clean Architecture” という考え方 The Clean Architecture by Uncle Bob http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
  9. 9. “Android Clean Architecture” という考え方 The Clean Architecture (Enterprise Application) (Web Service) + = Android Clean Architecture
  10. 10. “Android Clean Architecture” という考え方 http://www.slideshare.net/shinnosukekugimiya/ss-50705888 https://github.com/android10/Android-CleanArchitecture
  11. 11. 今日みなさんに持って返って もらいたいもの • Android Clean Architectureの思想をさっくり 理解する • Android Clean Architectureの実際的な実装方 法を理解する • 既存の設計と比べてどういうメリットがある か理解する
  12. 12. 標準的なWeb設計の指針 “MVC Architecture”
  13. 13. MVC Architecture Model アプリケーションデータ ビジネスロジック View Modelをレンダリングする Controller ユーザーイベントをハンドルする View Model Controller User usessees
  14. 14. Life Cycle Data source Frameworks
  15. 15. Android Frameworks Activity Life Cycle MVC Architecture on Android Model アプリケーションデータ (http, DB, memory色々) ビジネスロジック View Modelをレンダリングする (端末の状態を意識しながら) Controller ユーザーイベントをハンドルする (端末状態をハンドルする) (色んなViewもハンドルする) View Model Controller User usessees
  16. 16. MVCでアプリ
  17. 17. Sample App • GithubからFollowerを取って くるアプリ • Followerのrepository見れる • 選択したFollowerはメモリに キャッシュし、2回目以降は トーストで通知する https://github.com/tomoima525/CleanArchitectureSample /app配下 -> MVC で実装 /cleanarchitecture配下 -> Clean Architecture で実装
  18. 18. private GithubApi mApi; private UserMemoryCache mUserMemoryCache; … mApi = createApi(); mUserMemoryCache = UserMemoryCache.getInstance(); … public void HogeTask(…){ //ビジネスロジック… mApi.listFollowersAsync(…); mUserMemoryCache.put(…);
 } Models • Modelのデータ元は多様 • ModelとControllerのインタラクション(ビジネスロジック)がテストしにく い
  19. 19. public class MainActivity { @Override protected void onCreate(Bundle savedInstanceState) { // create views... } @Override protected void onResume(){ // resume/update views when system state is resumed } @Override protected void onPause(){ // pause views when system state is paused } } Views • Viewの状態管理が必要
  20. 20. public class MainActivity { // User events public void onClick(){} public void afterTextChanged(){} // System events public void onSaveInstanceState(Bundle outState){} public void onRestoreInstanceState(Bundle inState){} // View events public void gotoUserDetailActivity(Context context){} } Controllers • ViewとControllerがActivity上に混在している • 画面再生成などのシステムの状態もハンドルする必要がある
  21. 21. MVC Architecture on Android における課題 View(の状態管理)とControllerがActivity上に混在している ModelとController間のインタラクション(ビジネスロジック)が システム状態(LifeCycle)に影響を受ける/テストしにくい Modelのデータ・ソースが多様 各層の依存関係が強い
  22. 22. Clean Way…?
  23. 23. MVC Architecture on Android における課題 View(の状態管理)とControllerがActivity上に混在している ModelとController間のインタラクション(ビジネスロジック)が システム状態(LifeCycle)に影響を受ける/テストしにくい Modelのデータ・ソースが多様 各層の依存関係が強い
  24. 24. MVP Architecture
  25. 25. MVP Architecture • Presenterを介してModelを制御する設計 View Presenterからの情報を レンダリングする -> 端末の状態は配慮不要 になる Presenter - Activityから分割 - ユーザーイベントを ハンドルする - Modelの結果をViewに 返すAndroid Frameworks Activity View Model Presenter User usessees
  26. 26. public interface ShowUserListView { // UI として表示したい処理を定義する void showLoading(); void hideLoading(); void showNoResultCase(); void hideNoResultCase(); void showResult(Collection<User> usersCollection); } Views
  27. 27. public abstract class Presenter { // Activity LifeCycle public abstract void initialize(); public abstract void resume(); public abstract void pause(); public abstract void destroy(); } Presenters public class ShowUserListPresenter extends Presenter { public void setShowUserListView(ShowUserListView view){ mShowUserListView = view; //Viewを監視できるようにする } public void getFollowerList(String user){ mShowUserListView.showLoading(); // Activity側にCallbackする } }
  28. 28. Activity public class MainActivity implements ShowUserListView{ @Override public void onCreate(){ mShowUserListPresenter = new ShowUserListPresenter(…); mShowUserListPresenter.setShowUserListView(this); } @Override public void showLoading() { //実際のUI処理はActivityで実行できる! mListView.setVisibility(View.GONE); mProgress.setVisibility(View.VISIBLE); } @Override public void showResult(Collection<User> usersCollection) { mListView.setVisibility(View.VISIBLE); mUserAdapter.refresh(usersCollection); } }
  29. 29. MVC Architecture on Android における課題 MVP Architecture ModelとController間のインタラクション(ビジネスロジック)が システム状態(LifeCycle)に影響を受ける/テストしにくい Modelのデータ・ソースが多様 各層の依存関係が強い
  30. 30. MVC Architecture on Android における課題 MVP Architecture ModelとController間のインタラクション(ビジネスロジック)が システム状態(LifeCycle)に影響を受ける/テストしにくい Modelのデータ・ソースが多様 各層の依存関係が強い
  31. 31. Domain Layer
  32. 32. • Domain Layerにビジネスロジック (interactorまたはuse casesと呼ぶ)を 集約する • Modelとの処理はDomain経由で行う • 処理は非同期で実行する • Pure Java Domain Layer Domain Android Frameworks Activity View Model Presenter User usessees
  33. 33. Domain Layer UseCase <<abstract>> ベースとなるスレッド処理を実装 ConcreteUseCase UseCaseを継承 ロジック処理の実行、Presenterへのコールバック PostExecutionThread (UIThread) スレッド実行後の処理 • Domain層は大まかにUseCase, Threadにより成立 • 設計方法は多くの手法がある
  34. 34. public abstract class UseCase<T> { // スレッドをキュー処理できるようにする private ExecutorService mExecutorService = Executors.newSingleThreadExecutor(); public void start(final T params) { mExecutorService.submit(new Runnable() { @Override public void run() { call(params); } }); } //スレッド内でcallされるメソッド abstract protected void call(T params); } UseCase https://github.com/kgmyshin/Android-archを参考
  35. 35. public class FollowerListUseCase extends UseCase<String> { @Override public void execute(String user, FollowerListUseCaseCallback callback){ mCallback = callback; this.start(user); // (1) ExecutorServiceのスレッド経由でcall()が呼ばれる } @Override protected void call(String user) { // (2) Modelからデータ取得、バリデーション等のロジック処理。 // …省略 // (3) 処理後はUIThread( PostExecutionThread )にCallbackを返す mPostExecutionThread.post(() -> {mCallback.onUserListLoaded(usersCollection);}); } // UIThreadに返すCallbackのinterface interface FollowerListUseCaseCallback { onUserListLoaded(final Collection<User> usersCollection); onError(); } } ConcreteUseCase
  36. 36. Presenter public class ShowUserListPresenter extends Presenter implements FollowerListUseCaseCallback { private FollowerListUseCase mFollowerListUseCase; public void getFollowerList(String user){ // (1) usecaseを実行 -> 別スレッドへ mFollowerListUseCase.execute(user, this); } // (2) FollowerListUseCaseCallback経由で処理結果を受け取る @Override onUserListLoaded(final Collection<User> usersCollection){ // Viewへ結果を渡す } @Override onError(){ // error handling } }
  37. 37. MVC Architecture on Android における課題 MVP Architecture Domain Layer Modelのデータ・ソースが多様 各層の依存関係が強い
  38. 38. MVC Architecture on Android における課題 MVP Architecture Domain Layer Modelのデータ・ソースが多様 各層の依存関係が強い
  39. 39. Data Layer
  40. 40. Android Frameworks Data Layer • データをEntity(メソッドやデー タ構造体のかたまり)として扱う • Domain Layerにデータ元を意識 させないためにRepository パ ターンで実装する Domain Android Frameworks Activity View Data Presenter User usessees
  41. 41. Repository Pattern • ドメイン駆動開発で利用されるデザインパターン • UseCaseで必要なデータソースを集約した Repositoryクラスを実装する Data UserRepository DocsRepository XXRepository
  42. 42. public class UserRepository { private GithubApi mApi; // Github API用のインスタンス private UserMemoryCache mUserMemoryCache; //メモリキャッシュ用インスタンス public UserRepository(){ mUserMemoryCache = UserMemoryCache.getInstance(); mApi = createGithubApi(); } public void getFollowers(String user,UserListCallback callback) { mApi.listFollowersAsync( ... // Networkから取得 } public void putUser(User user){ mUserMemoryCache.put(… // メモリにキャッシュ } } Repository
  43. 43. MVC Architecture on Android における課題 MVP Architecture Domain Layer Data Layer(Repository Pattern) 各層の依存関係が強い
  44. 44. MVC Architecture on Android における課題 MVP Architecture Domain Layer Data Layer(Repository Pattern) 各層の依存関係が強い
  45. 45. Dependency Inversion Principle
  46. 46. Dependency Inversion Principle • 依存関係逆転の原則 • 上位モジュールは下位モジュー ルに依存しない 例) PresenterはDomainの実装が どのようになってても影響を受 けない • interfaceを各層の間に置く Android Frameworks Domain Android Frameworks Activity View Data Presenter User usessees interface interface
  47. 47. public interface UserRepository { // Domain層(UseCase)側はこの interfaceの仕様だけ知っていればOK void getFollowers(String userId, UserRepositoryCallback callback); void getUser(String userId, UserRepositoryCallback callback); void putUser(User user); } Dependency Inversion //実際の実装は interfaceを継承する public class UserRepositoryImpl implements UserRepository { @Override public void getFollowers(String userId, UserRepositoryCallback callback){ //データ取得 … } @Override public void putUser(User user) { } //… }
  48. 48. MVC Architecture on Android における課題 MVP Architecture Domain Layer Data Layer(Repository Pattern) Dependency Inversion Principle
  49. 49. どう変わった?
  50. 50. こう変わった! Android Frameworks Domain Android Frameworks Activity View Data Presenter User usessees interface interface UIがビジネスロジックから分離して 見通しが良くなった ビジネスロジックがAndroidのライフサイ クルから分離され、テストが容易に Modelの仕様変更に柔軟に 対応可能になった モジュールの置き換えが 容易になった
  51. 51. なんか難しい…?
  52. 52. 少しずつ手をつけると よいかも
  53. 53. どこから手を付けるべきか 手法 実現難易度 MVP Architecture ☆ Domain Layer ☆☆☆ Data Layer(Repository Pattern) ☆☆ Dependency Inversion Principle ☆☆
  54. 54. Next step… • Dependency Injection • 簡潔に書ける • モジュールの載せ替えが容易
  55. 55. Next step… • Implementing Observer Pattern • Domain Layerの煩雑なスレッド処理, Callback地獄か らの開放 参考例: https://github.com/android10/Android-CleanArchitecture
  56. 56. – Clean Architecture, Uncle Bob Architecture is about Intents, not Frameworks
  57. 57. – Clean Architecture, Uncle Bob 設計とは(良いコードが書きたいっていう) 意志である! フレームワークなんて関係ねぇ!(意訳)

×