SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
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-clean-architecture.html
“Android Clean Architecture”
という考え方
The Clean Architecture
(Enterprise Application)
(Web Service)
+ =
Android
Clean Architecture
“Android Clean Architecture”
という考え方
http://www.slideshare.net/shinnosukekugimiya/ss-50705888
https://github.com/android10/Android-CleanArchitecture
今日みなさんに持って返って
もらいたいもの
• Android Clean Architectureの思想をさっくり
理解する
• Android Clean Architectureの実際的な実装方
法を理解する
• 既存の設計と比べてどういうメリットがある
か理解する
標準的なWeb設計の指針
“MVC Architecture”
MVC Architecture
Model
アプリケーションデータ
ビジネスロジック
View Modelをレンダリングする
Controller ユーザーイベントをハンドルする
View
Model
Controller
User
usessees
Life Cycle
Data source
Frameworks
Android Frameworks
Activity
Life Cycle
MVC Architecture on Android
Model
アプリケーションデータ
(http, DB, memory色々)
ビジネスロジック
View
Modelをレンダリングする
(端末の状態を意識しながら)
Controller
ユーザーイベントをハンドルする
(端末状態をハンドルする)
(色んなViewもハンドルする)
View
Model
Controller
User
usessees
MVCでアプリ
Sample App
• GithubからFollowerを取って
くるアプリ
• Followerのrepository見れる
• 選択したFollowerはメモリに
キャッシュし、2回目以降は
トーストで通知する
https://github.com/tomoima525/CleanArchitectureSample
/app配下 -> MVC で実装
/cleanarchitecture配下 -> Clean Architecture で実装
private GithubApi mApi;
private UserMemoryCache mUserMemoryCache;
…
mApi = createApi();
mUserMemoryCache = UserMemoryCache.getInstance();
…
public void HogeTask(…){
//ビジネスロジック…
mApi.listFollowersAsync(…);
mUserMemoryCache.put(…);

}
Models
• Modelのデータ元は多様
• ModelとControllerのインタラクション(ビジネスロジック)がテストしにく
い
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の状態管理が必要
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上に混在している
• 画面再生成などのシステムの状態もハンドルする必要がある
MVC Architecture on Android
における課題
View(の状態管理)とControllerがActivity上に混在している
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(LifeCycle)に影響を受ける/テストしにくい
Modelのデータ・ソースが多様
各層の依存関係が強い
Clean Way…?
MVC Architecture on Android
における課題
View(の状態管理)とControllerがActivity上に混在している
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(LifeCycle)に影響を受ける/テストしにくい
Modelのデータ・ソースが多様
各層の依存関係が強い
MVP Architecture
MVP Architecture
• Presenterを介してModelを制御する設計
View
Presenterからの情報を
レンダリングする
-> 端末の状態は配慮不要
になる
Presenter
- Activityから分割
- ユーザーイベントを
ハンドルする
- Modelの結果をViewに
返すAndroid Frameworks
Activity
View
Model
Presenter
User
usessees
public interface ShowUserListView {
// UI として表示したい処理を定義する
void showLoading();
void hideLoading();
void showNoResultCase();
void hideNoResultCase();
void showResult(Collection<User> usersCollection);
}
Views
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する
}
}
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);
}
}
MVC Architecture on Android
における課題
MVP Architecture
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(LifeCycle)に影響を受ける/テストしにくい
Modelのデータ・ソースが多様
各層の依存関係が強い
MVC Architecture on Android
における課題
MVP Architecture
ModelとController間のインタラクション(ビジネスロジック)が
システム状態(LifeCycle)に影響を受ける/テストしにくい
Modelのデータ・ソースが多様
各層の依存関係が強い
Domain Layer
• Domain Layerにビジネスロジック
(interactorまたはuse casesと呼ぶ)を
集約する
• Modelとの処理はDomain経由で行う
• 処理は非同期で実行する
• Pure Java
Domain Layer
Domain
Android Frameworks
Activity
View
Model
Presenter
User
usessees
Domain Layer
UseCase
<<abstract>>
ベースとなるスレッド処理を実装
ConcreteUseCase
UseCaseを継承
ロジック処理の実行、Presenterへのコールバック
PostExecutionThread
(UIThread)
スレッド実行後の処理
• Domain層は大まかにUseCase, Threadにより成立
• 設計方法は多くの手法がある
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を参考
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
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
}
}
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 パ
ターンで実装する
Domain
Android Frameworks
Activity
View
Data
Presenter
User
usessees
Repository Pattern
• ドメイン駆動開発で利用されるデザインパターン
• UseCaseで必要なデータソースを集約した
Repositoryクラスを実装する
Data
UserRepository DocsRepository XXRepository
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
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を各層の間に置く
Android Frameworks
Domain
Android Frameworks
Activity
View
Data
Presenter
User
usessees
interface
interface
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) {
}
//…
}
MVC Architecture on Android
における課題
MVP Architecture
Domain Layer
Data Layer(Repository Pattern)
Dependency Inversion Principle
どう変わった?
こう変わった!
Android Frameworks
Domain
Android Frameworks
Activity
View
Data
Presenter
User
usessees
interface
interface
UIがビジネスロジックから分離して
見通しが良くなった
ビジネスロジックがAndroidのライフサイ
クルから分離され、テストが容易に
Modelの仕様変更に柔軟に
対応可能になった
モジュールの置き換えが
容易になった
なんか難しい…?
少しずつ手をつけると
よいかも
どこから手を付けるべきか
手法 実現難易度
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/Android-CleanArchitecture
– Clean Architecture, Uncle Bob
Architecture is about Intents,
not Frameworks
– Clean Architecture, Uncle Bob
設計とは(良いコードが書きたいっていう)
意志である!
フレームワークなんて関係ねぇ!(意訳)

Mais conteúdo relacionado

Mais procurados

AndroidStudioはじめました ~Gradle編~
AndroidStudioはじめました ~Gradle編~AndroidStudioはじめました ~Gradle編~
AndroidStudioはじめました ~Gradle編~Yabata Tomomitsu
 
Android アプリ開発における Gradle ビルドシステム
Android アプリ開発における Gradle ビルドシステムAndroid アプリ開発における Gradle ビルドシステム
Android アプリ開発における Gradle ビルドシステムYu Nobuoka
 
Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発
Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発
Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発Akira Inoue
 
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなしterahide
 
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション 【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション 日本マイクロソフト株式会社
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発日本マイクロソフト株式会社
 
Session5 - LabVIEW NXG Training Course
Session5 - LabVIEW NXG Training CourseSession5 - LabVIEW NXG Training Course
Session5 - LabVIEW NXG Training CourseYusuke Tochigi
 
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 日本マイクロソフト株式会社
 
[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-Device[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-DeviceKenichi Kambara
 
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化Akira Inoue
 
GBDC 勉強会 #2 Android Studio 実践レポート
GBDC 勉強会 #2 Android Studio 実践レポートGBDC 勉強会 #2 Android Studio 実践レポート
GBDC 勉強会 #2 Android Studio 実践レポートYutaka Kato
 
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsiderMoq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider貴志 上坂
 
Session1 - LabVIEW NXG Training Course
Session1 - LabVIEW NXG Training CourseSession1 - LabVIEW NXG Training Course
Session1 - LabVIEW NXG Training CourseYusuke Tochigi
 
第5回業開中心会議
第5回業開中心会議第5回業開中心会議
第5回業開中心会議Kaoru NAKAMURA
 
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発Osamu Monoe
 
AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行Yu Nobuoka
 

Mais procurados (20)

【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
AndroidStudioはじめました ~Gradle編~
AndroidStudioはじめました ~Gradle編~AndroidStudioはじめました ~Gradle編~
AndroidStudioはじめました ~Gradle編~
 
Kifの紹介
Kifの紹介Kifの紹介
Kifの紹介
 
【BS2】.NET 6 最新アップデート
【BS2】.NET 6 最新アップデート【BS2】.NET 6 最新アップデート
【BS2】.NET 6 最新アップデート
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
Android アプリ開発における Gradle ビルドシステム
Android アプリ開発における Gradle ビルドシステムAndroid アプリ開発における Gradle ビルドシステム
Android アプリ開発における Gradle ビルドシステム
 
Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発
Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発
Azure と Visual Studio で実践するモダナイゼーションとクラウド ネイティブ アプリケーション開発
 
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
 
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション 【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
Session5 - LabVIEW NXG Training Course
Session5 - LabVIEW NXG Training CourseSession5 - LabVIEW NXG Training Course
Session5 - LabVIEW NXG Training Course
 
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
 
[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-Device[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-Device
 
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
 
GBDC 勉強会 #2 Android Studio 実践レポート
GBDC 勉強会 #2 Android Studio 実践レポートGBDC 勉強会 #2 Android Studio 実践レポート
GBDC 勉強会 #2 Android Studio 実践レポート
 
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsiderMoq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
 
Session1 - LabVIEW NXG Training Course
Session1 - LabVIEW NXG Training CourseSession1 - LabVIEW NXG Training Course
Session1 - LabVIEW NXG Training Course
 
第5回業開中心会議
第5回業開中心会議第5回業開中心会議
第5回業開中心会議
 
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
 
AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行AndroidJUnitRunner で JUnit 4 形式のテストに移行
AndroidJUnitRunner で JUnit 4 形式のテストに移行
 

Semelhante a Android cleanarchitecture

GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009miwarin
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Shotaro Suzuki
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力Keiji Ariyama
 
Azure IoT Edge で Custom Vision
Azure IoT Edge で Custom VisionAzure IoT Edge で Custom Vision
Azure IoT Edge で Custom VisionYoshitaka Seo
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方Chihiro Ito
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Build Windows ラップアップ
Build Windows ラップアップBuild Windows ラップアップ
Build Windows ラップアップSunao Tomita
 
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)Yasui Tsutomu
 
Microsoft Tunnel 概要
Microsoft Tunnel 概要Microsoft Tunnel 概要
Microsoft Tunnel 概要Yutaro Tamai
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...Akira Inoue
 
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質Hironori Washizaki
 
運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうか運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうかMasahito Zembutsu
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携Tomoaki Shimizu
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Takashi EGAWA
 

Semelhante a Android cleanarchitecture (20)

GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
 
Azure IoT Edge で Custom Vision
Azure IoT Edge で Custom VisionAzure IoT Edge で Custom Vision
Azure IoT Edge で Custom Vision
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Build Windows ラップアップ
Build Windows ラップアップBuild Windows ラップアップ
Build Windows ラップアップ
 
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
 
Microsoft Tunnel 概要
Microsoft Tunnel 概要Microsoft Tunnel 概要
Microsoft Tunnel 概要
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
 
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
 
運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうか運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうか
 
【BS7】GitHubをフル活用した開発
【BS7】GitHubをフル活用した開発【BS7】GitHubをフル活用した開発
【BS7】GitHubをフル活用した開発
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
 

Mais de Tomoaki Imai

Android development at mercari 2015
Android development at mercari 2015Android development at mercari 2015
Android development at mercari 2015Tomoaki Imai
 
Tips for better CI on Android
Tips for better CI on AndroidTips for better CI on Android
Tips for better CI on AndroidTomoaki Imai
 
Debot android debugging library
Debot android debugging libraryDebot android debugging library
Debot android debugging libraryTomoaki Imai
 
What I learned about communication in Sanfrancisco
What I learned about communication in SanfranciscoWhat I learned about communication in Sanfrancisco
What I learned about communication in SanfranciscoTomoaki Imai
 
Developing better debug_components
Developing better debug_componentsDeveloping better debug_components
Developing better debug_componentsTomoaki Imai
 
Development at Mercari
Development at MercariDevelopment at Mercari
Development at MercariTomoaki Imai
 
ユーザーを待たせないためにできること
ユーザーを待たせないためにできることユーザーを待たせないためにできること
ユーザーを待たせないためにできることTomoaki Imai
 
US進出でのAndroid開発inメルカリ Mercari US App Development
US進出でのAndroid開発inメルカリ Mercari US App Development US進出でのAndroid開発inメルカリ Mercari US App Development
US進出でのAndroid開発inメルカリ Mercari US App Development Tomoaki Imai
 
ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)Tomoaki Imai
 

Mais de Tomoaki Imai (9)

Android development at mercari 2015
Android development at mercari 2015Android development at mercari 2015
Android development at mercari 2015
 
Tips for better CI on Android
Tips for better CI on AndroidTips for better CI on Android
Tips for better CI on Android
 
Debot android debugging library
Debot android debugging libraryDebot android debugging library
Debot android debugging library
 
What I learned about communication in Sanfrancisco
What I learned about communication in SanfranciscoWhat I learned about communication in Sanfrancisco
What I learned about communication in Sanfrancisco
 
Developing better debug_components
Developing better debug_componentsDeveloping better debug_components
Developing better debug_components
 
Development at Mercari
Development at MercariDevelopment at Mercari
Development at Mercari
 
ユーザーを待たせないためにできること
ユーザーを待たせないためにできることユーザーを待たせないためにできること
ユーザーを待たせないためにできること
 
US進出でのAndroid開発inメルカリ Mercari US App Development
US進出でのAndroid開発inメルカリ Mercari US App Development US進出でのAndroid開発inメルカリ Mercari US App Development
US進出でのAndroid開発inメルカリ Mercari US App Development
 
ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)
 

Android cleanarchitecture