Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
MVPアーキテクチャ使いたい
hisaichi5518
November 29, 2015
Programming
3
2.3k
MVPアーキテクチャ使いたい
AndroidのMVPアーキテクチャについて
hisaichi5518
November 29, 2015
Tweet
Share
More Decks by hisaichi5518
See All by hisaichi5518
hisaichi5518
0
2k
hisaichi5518
0
860
hisaichi5518
0
3.4k
hisaichi5518
1
820
hisaichi5518
0
750
hisaichi5518
2
1.2k
hisaichi5518
0
840
hisaichi5518
23
6.2k
hisaichi5518
1
2.2k
Other Decks in Programming
See All in Programming
bkuhlmann
4
620
adoranwodo
0
220
kyonmm
2
2.1k
sullis
0
120
aratayokoyama
0
200
wasabeef
1
560
akatsukinewgrad
0
180
shigeruoda
0
470
pdone
0
210
inoue2002
0
270
momofff
0
160
kenmaz
1
100
Featured
See All Featured
afnizarnur
176
14k
lara
172
9.5k
jasonvnalue
82
8k
bkeepers
321
53k
jrom
114
7.1k
revolveconf
200
9.6k
philhawksworth
190
17k
jeffersonlam
328
15k
jonyablonski
14
1.1k
tanoku
258
24k
hatefulcrawdad
257
17k
shpigford
165
19k
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ςετશʹͳ͘ͳΔʁ Μͳͨ͊͜ͳ͍
࣮ࡍͷίʔυͰઆ໌ͯ͠΄͍͠ (ུ)