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
MVPアーキテクチャ使いたい
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hisaichi5518
November 29, 2015
Programming
3.5k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MVPアーキテクチャ使いたい
AndroidのMVPアーキテクチャについて
hisaichi5518
November 29, 2015
More Decks by hisaichi5518
See All by hisaichi5518
技術力あげたい
hisaichi5518
4
5k
Dartにおける静的解析 / FlutterKaigi 2022
hisaichi5518
0
2.3k
ソフトウェアエンジニアが品質保証を学んでわかったこと / What software engineers have learned about quality assurance
hisaichi5518
6
12k
10X と Flutter / 10X with Flutter
hisaichi5518
0
2.4k
ひさいちとの1on1
hisaichi5518
0
2.7k
しあわせ推進委員会 / Shiawase Promotion Committee
hisaichi5518
0
1.3k
2017-03-23
hisaichi5518
0
3.8k
Pepabo Tech Conference 7
hisaichi5518
1
1.2k
かんばんやりたい
hisaichi5518
0
1.2k
Other Decks in Programming
See All in Programming
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
320
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
16
13k
スマート反転とウェブアクセシビリティ
camiha
0
210
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
160
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
8.2k
Family mrubyの進捗
kishima
1
130
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
190
JRuby: Past, Present, and Future
headius
0
180
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
560
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
170
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
530
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
The browser strikes back
jonoalderson
0
1.7k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
550
Chasing Engaging Ingredients in Design
codingconduct
0
320
The Pragmatic Product Professional
lauravandoore
37
7.4k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
900
GitHub's CSS Performance
jonrohan
1033
470k
It's Worth the Effort
3n
188
29k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Transcript
UIςετݮΒ͍ͨ͠ =MVPΞʔΩςΫνϟ͍͍ͨ hisaichi5518
ҙ
ϩδοΫͱ • ϏδωεϩδοΫ • ϓϨθϯςʔγϣϯϩδοΫ
ϓϨθϯςʔγϣϯϩδοΫ Ϣʔβʔ͔ΒೖྗΛड͚ औΓɺϏδωεϩδοΫ ʹ͢
ϏδωεϩδοΫ APIΛୟ͍ͯɺΛฦ͢
ϏδωεϩδοΫ σʔλϕʔεΛୟ͍ͯɺ Λฦ͢
ϓϨθϯςʔγϣϯϩδοΫ ͦΕ͔Βฦ͖ͬͯͨΛ ܗͯ͠දࣔ͢Δ
͕ʮϩδοΫʯͱݴ͏࣌ɺ ͜ͷ2छྨΛࢦ͠·͢ɻ
! ?
ͳͥΞʔΩςΫνϟΛ࠾༻͢Δͷ͔?
ݱঢ়ͱཧͷΪϟοϓΛ ຒΊΔͨΊͷํ๏ͱ͠ ͯɺΞʔΩςΫνϟΛ࠾ ༻͍ͨ͠
ݱঢ়
UIςετ͔Γॻ͍͍ͯ ͯർฐ͕ͪ͠
ཧ
୯ମςετΛॻ͘ UIςετগͳΊ
ͳͥUIςετ͔Γॻ͔͟ΔΛ͑ͳ͍͔?
androidTestͰͳ͍ͱಈ ͔ͳ͍Ϋϥεͷதʹςε τ͍ͨ͠ͷ͕͋Δ
ͳͥ୯ମςετͰಈ͔ͳ͍Ϋϥεͷதʹςετ͍ͨ͠ͷ͕͋Δ?
ͻͱͭͷΫϥεͷ͕ େ͖͗͢ɻΫϥεͷ Λখ͘͞ग़དྷ͍ͯͳ͍ɻ
ͳͥΛখ͘͞ग़དྷ͍ͯͳ͍ͷ͔?
Ϋϥε͕ԿΛ୲͖͢ ͔ɺܾ·͍ͬͯͳ͍͔Β
ͭ·Γ ཧͱݱ࣮ͷΪϟοϓΛ ຒΊΔʹ
֤ΫϥεͷΛখ͘͞ ͯ͋͛͠Δඞཁ͕͋Γ
ͦͷͨΊʹ ܾ·ΓࣄΛ࡞Δࣄ͕ඞཁ
ͦͷܾ·Γࣄ͕ ΞʔΩςΫνϟ
ʮMVPΞʔΩςΫνϟʯͱ?
MVCͷੜܥ
MVC
Model-View-Controller
݁: Androidʹ͍ͯ ͳ͍
Model = ;ͭ͏ͷΫϥε
View = Activity
Controller = Activity
View + Controller = Activity
ActivityʹϓϨθϯςʔ γϣϯϩδοΫ͕ೖͬͯ ͠·͏
݁: Androidʹ͍ͯ ͳ͍
MVP
Model-View-Presenter
Model
Model • ϏδωεϩδοΫΛॻ͘ • Presenterʹґଘ͠·ͤΜ • Viewʹґଘ͠·ͤΜ
View
View • ը໘ͷදࣔ/ߋ৽ɾϢʔβʔͷೖྗͷड͚ޱ • ϢʔβʔೖྗɺPresenterʹ͢ • ෳͷViewΛ·ͱΊΔ܅Ͱ͋Δ • TextView, Toolbar
...
Presenter
Presenter • ϓϨθϯςʔγϣϯϩδοΫΛॻ͘ • View͔Β͞ΕͨϢʔβʔ͔ΒͷೖྗΛModelʹ͢ • Model͔Βฦ͖ͬͯͨΛͱʹViewͷߋ৽Λߦ͏ • Viewͷߋ৽ɺInterfaceΛܦ༝ͯ͠ߦ͏
MVPΞʔΩςΫνϟɺ Activity͔ΒϓϨθʔς ʔγϣϯϩδοΫΛ Presenterʹൈ͖ग़ͤΔ
จࣈ͡ΌΘ͔ΒΜ!ਤͰ!
Ҿ༻: https://github.com/rallat/EffectiveAndroid/tree/mvp
ਤ͡ΌΘ͔ΒΜ!ίʔυͰ!
(ྫ)ϢʔβʔΛऔಘ໊ͯ͠લΛදࣔ͢Δ
View interfaceΛఆٛ͢Δ public interface UserView { void showName(String name); void
showError(Exception exception); }
View PresenterΛݺͼग़͢ public class UserActivity extends AppCompatActivity implements UserView {
@Override protected void onCreate(Bundle savedInstanceState) { int userId = ...; (new UserPresenter(this)).fetchUser(userId); } @Override public void showName(String name) { mTextView.setText(name); } @Override public void showError(...) { ... } }
Presenter public class UserPresenter { UserView mView; public UserPresenter(UserView view)
{ mView = view; } public void fetchUser(int userId) { ApiClient.getInstance().create(UsersService.class).fetch(userId, new Callback<User>() { @Override public void success(User user, Response response) { mView.showName(user.getName()); } @Override public void failure(RetrofitError error) { mView.showError(error); } }); } }
Model ࠓͷApiClient.javaͱ࣮͕ಉ͡ͳͷͰུ
ͳͥɺMVPΞʔΩςΫνϟςετ͕͍͢͠ͷ͔?
Viewͷߋ৽Interface Λ௨ͯ͡ߦΘΕΔ
ͭ·ΓɺInterfaceΛܧ ঝ͍ͯ͠ΔViewͲ͖ ͑͋͞ΕɺPresenter ͷςετͰ͖Δɻ
Test public class UserPresenterTest { @Test public void testFetchUser() throws
Exception { final AtomicBoolean called = new AtomicBoolean(); mMockClient.mock("/v4/users/\\d.json").to(200, "user.json"); class UserViewTest implements UserView { @Override public void showName(String name) { called.set(true); assertThat(name).isEqualTo("hisaichi5518"); } } UserPresenter presenter = new UserPresenter(new UserViewTest()); presenter.fetchUser(1); assertThat(called.get()).isEqualTo(true); } }
Activityʹґଘ͠ͳ͘ͳ ͬͨͷͰɺϓϨθϯςʔ γϣϯϩδοΫΛ୯ମς ετͰॻ͚Δʂʂ̍
UIςετͰർฐ͠ͳ͍!
ͳͷͰMVPΞʔΩςΫν ϟΛ͍͍ͨ
·ͱΊ
·ͱΊ • ݱঢ়ɺΫϥεͷ͕େ͖͗ͯ͢ɺϓϨθϯςʔγϣϯϩδ οΫΛUIςετͰςετͤ͟ΔΛ͑ͳ͍ • ཧɺΫϥεͷΛখ͘͞͠ɺϩδοΫ୯ମςετͰ ςετ͍ͨ͠ • MVPΞʔΩςΫνϟΛ࠾༻͠ɺΫϥεͷΛ໌֬ʹܾΊɺ ୯ମςετʹد͍ͤͯ͘
·ͱΊ • MVPΞʔΩςΫνϟɺActivity͔ΒϓϨθϯςʔγϣϯϩδ οΫΛ͢Δ • ϓϨθϯςʔγϣϯϩδοΫΛ୯ମςετͰॻ͚ΔΑ͏ʹͳ ΔͷͰɺUIςετΛॻ͘ྔݮΔ
!!!!!!!!!!! ർฐͤͣʹྑ͍ͷ࡞Δκʂ !!!!!!!!!!!
ࢀߟ • hisaichi5518/minne-android • rallat/EffectiveAndroid • AndroidΦʔϧελʔζͰClean Architectureʹ͍ͭͯൃද͠ ͖ͯͨ&ࢀߟϦϯΫू •
AndroidͰMVCΑΓMVPͷํ͕͍͍͔͠Εͳ͍
࣭ٙԠ
ͲͷΑ͏ʹMVPΞʔΩςΫνϟΛར༻ ͍͔ͯ͘͠? • ཧ: ςετΛॻ͍͔ͯΒˠϦϑΝΫλϦϯά • ݱ࣮: PresenterΛར༻͢ΔΑ͏ʹϦϑΝΫλϦϯάˠςετ Λॻ͘ •
·ͣɺݴ͍ग़ͬ͠ͷ͕ΔͭΓ
ΞʔΩςΫνϟΛ࠾༻͢Δ্Ͱͷํ • ཧղ͍ͯ͠ͳ͍ͷΘͳ͍ • ཧղ͠ʹ͍͘ͷΘͳ͍ • ่յͦ͠͏ͳͷΘͳ͍ • ࣮ࡍʹίʔυΛॻ͍ͯஅ͢Δ •
ݱ࣮త͔ɺ͕ॏཁ • ૣ͗͢Δ࠷దԽ͠ͳ͍
Viewʹ͋ͨΔΫϥε? • Activity • Fragment • CustomView ͳͲɻద࣌அ͍ͯ͘͠ɻ
UIςετશʹͳ͘ͳΔʁ Μͳͨ͊͜ͳ͍
࣮ࡍͷίʔυͰઆ໌ͯ͠΄͍͠ (ུ)