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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
870
今さら聞けない .NET CLI
htkym
0
170
FDEが実現するAI駆動経営の現在地
gonta
2
240
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
190
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
570
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
290
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
490
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
190
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
17k
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.3k
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4k
Everyday Curiosity
cassininazir
0
270
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
780
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
For a Future-Friendly Web
brad_frost
183
10k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
260
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
450
Discover your Explorer Soul
emna__ayadi
2
1.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Navigating Weather and Climate Data
rabernat
0
430
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ςετશʹͳ͘ͳΔʁ Μͳͨ͊͜ͳ͍
࣮ࡍͷίʔυͰઆ໌ͯ͠΄͍͠ (ུ)