Slide 1

Slide 1 text

UIςετݮΒ͍ͨ͠ =MVPΞʔΩςΫνϟ࢖͍͍ͨ hisaichi5518

Slide 2

Slide 2 text

஫ҙ

Slide 3

Slide 3 text

ϩδοΫͱ͸ • ϏδωεϩδοΫ • ϓϨθϯςʔγϣϯϩδοΫ

Slide 4

Slide 4 text

ϓϨθϯςʔγϣϯϩδοΫ Ϣʔβʔ͔ΒೖྗΛड͚ औΓɺϏδωεϩδοΫ ʹ౉͢

Slide 5

Slide 5 text

ϏδωεϩδοΫ APIΛୟ͍ͯɺ஋Λฦ͢

Slide 6

Slide 6 text

ϏδωεϩδοΫ σʔλϕʔεΛୟ͍ͯɺ ஋Λฦ͢

Slide 7

Slide 7 text

ϓϨθϯςʔγϣϯϩδοΫ ͦΕ͔Βฦ͖ͬͯͨ஋Λ ੔ܗͯ͠දࣔ͢Δ

Slide 8

Slide 8 text

๻͕ʮϩδοΫʯͱݴ͏࣌͸ɺ ͜ͷ2छྨΛࢦ͠·͢ɻ

Slide 9

Slide 9 text

! ?

Slide 10

Slide 10 text

ͳͥΞʔΩςΫνϟΛ࠾༻͢Δͷ͔?

Slide 11

Slide 11 text

ݱঢ়ͱཧ૝ͷΪϟοϓΛ ຒΊΔͨΊͷํ๏ͱ͠ ͯɺΞʔΩςΫνϟΛ࠾ ༻͍ͨ͠

Slide 12

Slide 12 text

ݱঢ়

Slide 13

Slide 13 text

UIςετ͹͔Γॻ͍͍ͯ ͯർฐ͕ͪ͠

Slide 14

Slide 14 text

ཧ૝

Slide 15

Slide 15 text

୯ମςετΛॻ͘ UIςετগͳΊ

Slide 16

Slide 16 text

ͳͥUIςετ͹͔Γॻ͔͟ΔΛ͑ͳ͍͔?

Slide 17

Slide 17 text

androidTestͰͳ͍ͱಈ ͔ͳ͍Ϋϥεͷதʹςε τ͍ͨ͠΋ͷ͕͋Δ

Slide 18

Slide 18 text

ͳͥ୯ମςετͰಈ͔ͳ͍Ϋϥεͷதʹςετ͍ͨ͠΋ͷ͕͋Δ?

Slide 19

Slide 19 text

ͻͱͭͷΫϥεͷ੹຿͕ େ͖͗͢ɻΫϥεͷ੹຿ Λখ͘͞ग़དྷ͍ͯͳ͍ɻ

Slide 20

Slide 20 text

ͳͥ੹຿Λখ͘͞ग़དྷ͍ͯͳ͍ͷ͔?

Slide 21

Slide 21 text

Ϋϥε͕ԿΛ୲౰͢΂͖ ͔ɺܾ·͍ͬͯͳ͍͔Β

Slide 22

Slide 22 text

ͭ·Γ ཧ૝ͱݱ࣮ͷΪϟοϓΛ ຒΊΔʹ͸

Slide 23

Slide 23 text

֤Ϋϥεͷ੹຿Λখ͘͞ ͯ͋͛͠Δඞཁ͕͋Γ

Slide 24

Slide 24 text

ͦͷͨΊʹ ܾ·ΓࣄΛ࡞Δࣄ͕ඞཁ

Slide 25

Slide 25 text

ͦͷܾ·Γࣄ͕ ΞʔΩςΫνϟ

Slide 26

Slide 26 text

ʮMVPΞʔΩςΫνϟʯͱ͸?

Slide 27

Slide 27 text

MVCͷ೿ੜܥ

Slide 28

Slide 28 text

MVC

Slide 29

Slide 29 text

Model-View-Controller

Slide 30

Slide 30 text

݁࿦: Androidʹ޲͍ͯ ͳ͍

Slide 31

Slide 31 text

Model = ;ͭ͏ͷΫϥε

Slide 32

Slide 32 text

View = Activity

Slide 33

Slide 33 text

Controller = Activity

Slide 34

Slide 34 text

View + Controller = Activity

Slide 35

Slide 35 text

ActivityʹϓϨθϯςʔ γϣϯϩδοΫ͕ೖͬͯ ͠·͏

Slide 36

Slide 36 text

݁࿦: Androidʹ޲͍ͯ ͳ͍

Slide 37

Slide 37 text

MVP

Slide 38

Slide 38 text

Model-View-Presenter

Slide 39

Slide 39 text

Model

Slide 40

Slide 40 text

Model • ϏδωεϩδοΫΛॻ͘ • Presenterʹґଘ͠·ͤΜ • Viewʹґଘ͠·ͤΜ

Slide 41

Slide 41 text

View

Slide 42

Slide 42 text

View • ը໘ͷදࣔ/ߋ৽ɾϢʔβʔͷೖྗͷड͚ޱ • Ϣʔβʔೖྗ͸ɺPresenterʹ౉͢ • ෳ਺ͷViewΛ·ͱΊΔ܅Ͱ͋Δ • TextView, Toolbar ...

Slide 43

Slide 43 text

Presenter

Slide 44

Slide 44 text

Presenter • ϓϨθϯςʔγϣϯϩδοΫΛॻ͘ • View͔Β౉͞ΕͨϢʔβʔ͔ΒͷೖྗΛModelʹ౉͢ • Model͔Βฦ͖ͬͯͨ஋Λ΋ͱʹViewͷߋ৽Λߦ͏ • Viewͷߋ৽͸ɺInterfaceΛܦ༝ͯ͠ߦ͏

Slide 45

Slide 45 text

MVPΞʔΩςΫνϟ͸ɺ Activity͔ΒϓϨθʔς ʔγϣϯϩδοΫΛ Presenterʹൈ͖ग़ͤΔ

Slide 46

Slide 46 text

จࣈ͡ΌΘ͔ΒΜ!ਤͰ!

Slide 47

Slide 47 text

Ҿ༻: https://github.com/rallat/EffectiveAndroid/tree/mvp

Slide 48

Slide 48 text

ਤ͡ΌΘ͔ΒΜ!ίʔυͰ!

Slide 49

Slide 49 text

(ྫ)ϢʔβʔΛऔಘ໊ͯ͠લΛදࣔ͢Δ

Slide 50

Slide 50 text

View interfaceΛఆٛ͢Δ public interface UserView { void showName(String name); void showError(Exception exception); }

Slide 51

Slide 51 text

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(...) { ... } }

Slide 52

Slide 52 text

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() { @Override public void success(User user, Response response) { mView.showName(user.getName()); } @Override public void failure(RetrofitError error) { mView.showError(error); } }); } }

Slide 53

Slide 53 text

Model ࠓͷApiClient.javaͱ࣮૷͕ಉ͡ͳͷͰུ

Slide 54

Slide 54 text

ͳͥɺMVPΞʔΩςΫνϟ͸ςετ͕͠΍͍͢ͷ͔?

Slide 55

Slide 55 text

Viewͷߋ৽͸Interface Λ௨ͯ͡ߦΘΕΔ

Slide 56

Slide 56 text

ͭ·ΓɺInterfaceΛܧ ঝ͍ͯ͠ΔView΋Ͳ͖ ͑͋͞Ε͹ɺPresenter ͷςετ͸Ͱ͖Δɻ

Slide 57

Slide 57 text

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); } }

Slide 58

Slide 58 text

Activityʹґଘ͠ͳ͘ͳ ͬͨͷͰɺϓϨθϯςʔ γϣϯϩδοΫΛ୯ମς ετͰॻ͚Δʂʂ̍

Slide 59

Slide 59 text

UIςετͰർฐ͠ͳ͍!

Slide 60

Slide 60 text

ͳͷͰMVPΞʔΩςΫν ϟΛ࢖͍͍ͨ

Slide 61

Slide 61 text

·ͱΊ

Slide 62

Slide 62 text

·ͱΊ • ݱঢ়ɺΫϥεͷ੹຿͕େ͖͗ͯ͢ɺϓϨθϯςʔγϣϯϩδ οΫΛUIςετͰςετͤ͟ΔΛ͑ͳ͍ • ཧ૝͸ɺΫϥεͷ੹຿Λখ͘͞͠ɺϩδοΫ͸୯ମςετͰ ςετ͍ͨ͠ • MVPΞʔΩςΫνϟΛ࠾༻͠ɺΫϥεͷ੹຿Λ໌֬ʹܾΊɺ ୯ମςετʹد͍ͤͯ͘

Slide 63

Slide 63 text

·ͱΊ • MVPΞʔΩςΫνϟ͸ɺActivity͔ΒϓϨθϯςʔγϣϯϩδ οΫΛ෼཭͢Δ • ϓϨθϯςʔγϣϯϩδοΫΛ୯ମςετͰॻ͚ΔΑ͏ʹͳ ΔͷͰɺUIςετΛॻ͘ྔ͸ݮΔ

Slide 64

Slide 64 text

!!!!!!!!!!! ർฐͤͣʹྑ͍΋ͷ࡞Δκʂ !!!!!!!!!!!

Slide 65

Slide 65 text

ࢀߟ • hisaichi5518/minne-android • rallat/EffectiveAndroid • AndroidΦʔϧελʔζͰClean Architectureʹ͍ͭͯൃද͠ ͖ͯͨ&ࢀߟϦϯΫू • AndroidͰ͸MVCΑΓMVPͷํ͕͍͍͔΋͠Εͳ͍

Slide 66

Slide 66 text

࣭ٙԠ౴

Slide 67

Slide 67 text

ͲͷΑ͏ʹMVPΞʔΩςΫνϟΛར༻ ͍͔ͯ͘͠? • ཧ૝: ςετΛॻ͍͔ͯΒˠϦϑΝΫλϦϯά • ݱ࣮: PresenterΛར༻͢ΔΑ͏ʹϦϑΝΫλϦϯάˠςετ Λॻ͘ • ·ͣ͸ɺݴ͍ग़ͬ͠΃ͷ๻͕΍Δͭ΋Γ

Slide 68

Slide 68 text

ΞʔΩςΫνϟΛ࠾༻͢Δ্Ͱͷํ਑ • ཧղ͍ͯ͠ͳ͍΋ͷ͸࢖Θͳ͍ • ཧղ͠ʹ͍͘΋ͷ͸࢖Θͳ͍ • ่յͦ͠͏ͳͷ͸࢖Θͳ͍ • ࣮ࡍʹίʔυΛॻ͍ͯ൑அ͢Δ • ݱ࣮త͔ɺ͕ॏཁ • ૣ͗͢Δ࠷దԽ͸͠ͳ͍

Slide 69

Slide 69 text

Viewʹ͋ͨΔΫϥε͸? • Activity • Fragment • CustomView ͳͲɻద࣌൑அ͍ͯ͘͠ɻ

Slide 70

Slide 70 text

UIςετ͸׬શʹͳ͘ͳΔʁ Μͳͨ͊͜ͳ͍

Slide 71

Slide 71 text

࣮ࡍͷίʔυͰઆ໌ͯ͠΄͍͠ (ུ)