Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MVPアーキテクチャ使いたい
Search
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
4.9k
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.6k
しあわせ推進委員会 / 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.1k
Other Decks in Programming
See All in Programming
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
430
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
820
The NotImplementedError Problem in Ruby
koic
1
1.1k
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
460
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
170
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
210
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
110
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
340
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.7k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7.2k
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
220
We Are The Robots
honzajavorek
0
270
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
630
Chasing Engaging Ingredients in Design
codingconduct
0
230
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
The World Runs on Bad Software
bkeepers
PRO
72
12k
Odyssey Design
rkendrick25
PRO
2
720
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
310
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
340
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Producing Creativity
orderedlist
PRO
348
40k
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ςετશʹͳ͘ͳΔʁ Μͳͨ͊͜ͳ͍
࣮ࡍͷίʔυͰઆ໌ͯ͠΄͍͠ (ུ)