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.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.1k
Other Decks in Programming
See All in Programming
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
170
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
200
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
250
数百円から始めるRuby電子工作
tarosay
0
140
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
680
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
120
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
220
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
AIが無かった頃の素敵な出会いの話
codmoninc
1
410
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
360
メールのエイリアス機能を履き違えない
isshinfunada
0
230
Featured
See All Featured
Everyday Curiosity
cassininazir
0
270
Between Models and Reality
mayunak
4
390
Discover your Explorer Soul
emna__ayadi
2
1.3k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
How STYLIGHT went responsive
nonsquared
100
6.2k
Ethics towards AI in product and experience design
skipperchong
2
340
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
690
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
630
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
790
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ςετશʹͳ͘ͳΔʁ Μͳͨ͊͜ͳ͍
࣮ࡍͷίʔυͰઆ໌ͯ͠΄͍͠ (ུ)