ϞόΠϧ։ൃͷͨΊͷΞʔΩςΫνϟೖ@AbemaTV Hack
View Slide
2About me௩ຊࢤhttps://twitter.com/itometeamhttps://github.com/itomehttps://medium.com/@itometeam0.5min
ΞʔΩςΫνϟͬͯͳʹʁ5min
4ΞʔΩςΫνϟͬͯͳʹʁ5minΞʔΩςΫνϟ(ઃܭ)ʹͨ͘͞Μͷҙຯ͕͋ΔɾCPUͳͲϋʔυΣΞͷ੍ޚͷํࣜͱͯ͠ͷΞʔΩςΫνϟɾωοτϫʔΫͷΞʔΩςΫνϟɾιϑτΣΞͷΞʔΩςΫνϟɾ…etc←ࠓ͜͜ʹ͍ͭͯ͠·͢
5ΞʔΩςΫνϟͬͯͳʹʁ5minͦͷ·͑ʹ
6ΞʔΩςΫνϟͬͯͳʹʁ5minͦͦΞʔΩςΫνϟͬͯͲ͏ͯ͠ඞཁͳΜͩΖ͏ʁ
ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3min
8ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minͱͱϓϩάϥϛϯάʹଟ͘ͷϕετɾϓϥΫςΟεʢεϜʔζͳ։ൃɾอकɾӡ༻ͷͨΊʹकΔ͖ϧʔϧʣ͕͋Δ
9ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minྫ͑ɿ ׂ౷࣏ʢDivide and Conquerʣͦͷ··Ͱղܾ͢Δ͜ͱ͕͍͠ʮେ͖ͳʯɺ͍͔ͭ͘ͷʮখ͞ͳʯʹׂͯ͠ɺݸผʹղܾ͢Δ
10ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minྫ͑ɿ ಉܕݪཧʢIsomorphism Principleʣʮܗʹͩ͜ΘΔʯͱ͍͏ݪཧɺຊ࣭తʹಉ͜͡ͱιʔείʔυͰಉ͡Α͏ʹѻ͏͜ͱͰʮҟʯΛཱͪ͘͢͢Δɻ
11ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minྫ͑ɿ ઢܗݪཧʢLinearity PrincipleʣॲཧͷྲྀΕΛઢʹ͢Δݪଇɻ͋Δػೳ͍͔ͭ͘ͷখ͞ͳػೳΛઢతʹॏͶ߹Θ࣮ͤͯݱ͢Δͷ͕Α͍ɻ
12ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minྫ͑ɿ ୯Ұݪଇมߋ͢Δཧ༝͕ಉ͡ͷूΊɺมߋ͢Δཧ༝͕ҧ͏ͷ͚Δݪଇɻ1ͭͷϞδϡʔϧɺΫϥεؔʹมߋ͢Δཧ༝͕̎ͭҎ্͍͚͋ͬͯͳ͍ɻ
13ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minଞʹɿDRYݪଇKISSݪଇڽूɾ݁߹ݪଇ։์ɾดݪଇ݁ՌͷہॴԽ܁Γฦ͠ͷ࠷খԽϩδοΫͱσʔλͷҰମԽରশੑݪଇϙϦϞʔϑΟζϜใͷӅṭΧϓηϧԽશੑɾॆੑɾϓϦϛςΟϒؔ৺ͷϙϦγʔͱ࣮ͷࢀরͷҰੑςετ༰қੑ୯७ݪཧ໌ূݪཧڻ͖࠷খͷݪଇੑࢀরಁաੑ݆ͷݪଇϘʔΠεΧτϧʔϧGOFσβΠϯύλʔϯσϧϝϧͷ๏ଇSOLIDݪଇ҆ఆੑͷݪଇ֊ݪཧґଘੑٯసͷݪଇ૬ޓӡ༻ੑ࠶ར༻ΠϯλʔϑΣަੑܖʹΑޚతϓӪδϣ
14ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3min୯ҰػೳͷΞϓϦέʔγϣϯɺঢ়ଶͷগͳ͍ΞϓϦέʔγϣϯͰ͋Ε͜ΕΒͷݪଇʹै͏͜ͱͰมߋʹڧ͍ΫϦʔϯͳίʔυ͕ॻ͚Δ
15ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3min͔࣌͠͠ྲྀΕɻɻɻ
16ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minΞϓϦέʔγϣϯΑΓଟػೳʹΞϓϦέʔγϣϯͷঢ়ଶΑΓෳࡶʹɾϝοηʔδػೳɾ௨ػೳɾࣸਅɺಈըࡱӨɾܾࡁػೳ ɾϝσΟΞͷ࠶ੜɾݸਓؒૹۚɾը૾ิਖ਼ɾϩάΠϯ͍ͯ͠Δʁɾܾࡁใొ͞Ε͍ͯΔʁɾ௨ڐՄ͍ͯ͠Δʁɾ֎෦αʔϏε࿈ܞ͍ͯ͠Δʁ
17ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3min։ൃͷෳࡶԽʹΑ͍ͬͯΖΜͳ͕ग़ͯ͘ΔɾͨΓతͳ࣮ͰϕετɾϓϥΫςΟε͔Β֎Εͯ͠·͏͜ͱ͕ଟ͍ɾνʔϜ։ൃͰɺϝϯόʔͷٕज़ྗʹΑͬͯίʔυͷ࣭ʹ͕ࠩग़Δɾٕज़ྗʹ͕ࠩͳͯ͘ɺϓϩδΣΫτશମͰॻ͖ํ͕౷ҰͰ͖ͳ͍
18ΞʔΩςΫνϟ͕ਁಁ͢ΔલͷιϑτΣΞ։ൃ3minϓϩδΣΫτશମͰઃܭΛ౷Ұ͠Α͏ʂ͞Βʹͦͷઃܭʹै͏͚ͩͰɺϕετϓϥΫςΟεͳ։ൃ͕Ͱ͖ΔΑ͏ʹϧʔϧΛܾΊΑ͏ʂMVCɺFluxͳͲͷΞʔΩςΫνϟ͕ొ
19ΞʔΩςΫνϟͬͯͳʹʁ5minؓٳ
20ΞʔΩςΫνϟͬͯͳʹʁ5minΞʔΩςΫνϟͱطଘͷϕετɾϓϥΫςΟεʹଇͬͨɺϓϩδΣΫτશମͷ࣮ύλʔϯͷ͜ͱ
21ΞʔΩςΫνϟͬͯͳʹʁ5min౷Ұ͞ΕͨΞʔΩςΫνϟΛಋೖ͢Δ͜ͱͰɾΞʔΩςΫνϟͷϧʔϧʹैͬͯ։ൃΛ͢ΕɺɹطଘͷϕετɾϓϥΫςΟεΛҙࣝ͠ͳͯ͘ʢ͋Δ͍Βͳͯ͘ʣɹมߋʹڧ͍ΫϦʔϯͳίʔυΛॻ͚ΔΑ͏ʹͳΔɾ։ൃνʔϜͷ୭͕ॻ͍ͨίʔυͰɺɹଞͷਓ͕؆୯ʹಡΊΔɺ·ͨमਖ਼ΛͰ͖ΔΑ͏ʹͳΔ
దͳΞʔΩςΫνϟબఆͷίπ3min
23దͳΞʔΩςΫνϟબఆͷίπ3minɾͲͷΞʔΩςΫνϟΛબͿ͔ʹਖ਼ղɾෆਖ਼ղͳ͍ɾجຊతʹͲΜͳΞʔΩςΫνϟͰɺɹͲΜͳΞϓϦέʔγϣϯ։ൃ͕Ͱ͖Δɻ
24దͳΞʔΩςΫνϟબఆͷίπ3minΞʔΩςΫνϟΛߟ͑Δͱ͖ʹߟྀ͢Δ͜ͱɾΞϓϦέʔγϣϯͷෳࡶ͞ɾ։ൃνʔϜͷਓɾٕज़ྗɾσϑΝΫτελϯμʔυͳ࣮
25దͳΞʔΩςΫνϟબఆͷίπ3minΞʔΩςΫνϟΛߟ͑Δͱ͖ʹߟྀ͢Δ͜ͱɾΞϓϦέʔγϣϯͷෳࡶ͞ɾ։ൃνʔϜͷਓɾٕज़ྗɾσϑΝΫτελϯμʔυͳ࣮
26దͳΞʔΩςΫνϟબఆͷίπ3minɾΞϓϦέʔγϣϯͷෳࡶ͞γϯϓϧͳΞϓϦ։ൃͰ͋Εɺίʔυ͕ʹͳΓ͍͢FluxͳͲͷΞʔΩςΫνϟΑΓɺMVCMVVMͷ΄͏͕ૣ͘։ൃ͕Ͱ͖ΔҰํɺFluxReduxɺMVIͷΑ͏ͳΞʔΩςΫνϟίʔυͷ੍͕ڧ͍ͨΊɺେنͳ։ൃͰഁͮ͠Β͍ͨͩ͠ɺίʔυৗʹෳࡶԽ͍ͯ͘͠ͷͳͷͰɺݟۃΊ͕ඞཁ
27దͳΞʔΩςΫνϟબఆͷίπ3minΞʔΩςΫνϟΛߟ͑Δͱ͖ʹߟྀ͢Δ͜ͱɾΞϓϦέʔγϣϯͷෳࡶ͞ɾ։ൃνʔϜͷਓɾٕज़ྗɾσϑΝΫτελϯμʔυͳ࣮
28దͳΞʔΩςΫνϟબఆͷίπ3minɾ։ൃνʔϜͷਓɾٕज़ྗ։ൃϝϯόʔ͕ଟ͍͚ΕɺΞʔΩςΫνϟʹΑΔ੍͕ڧ͍ํ͕Α͍ΞʔΩςΫνϟͷ֓೦ࣗମ͕͍͠߹ɺϝϯόʔશһ͕ͦΕΛशಘ͢Δίετ։ൃͷʹؚ·ΕΔɻ։ൃϝϯόʔͷେ෦͕׳Ε͍ͯΔΞʔΩςΫνϟ͕͋ΕɺͦΕΛ·ͣݕ౼͢Δ
29దͳΞʔΩςΫνϟબఆͷίπ3minΞʔΩςΫνϟΛߟ͑Δͱ͖ʹߟྀ͢Δ͜ͱɾΞϓϦέʔγϣϯͷෳࡶ͞ɾ։ൃνʔϜͷਓɾٕज़ྗɾσϑΝΫτελϯμʔυͳ࣮
30దͳΞʔΩςΫνϟબఆͷίπ3minɾσϑΝΫτελϯμʔυͳ࣮Ͱ͖Δ͚ͩελϯμʔυͳΞʔΩςΫνϟΛબΜͩํ͕ɺϥΠϒϥϦ͕ॆ࣮͍ͯͨ͠ΓɺυΩϡϝϯτStack OverflowͷճͳͲͷࣝʹΞΫηε͍ͨ͢͠ΊΑ͍AndroidͰ͋ΕMVVM͕ެࣜʹαϙʔτ͞Ε͍ͯΔɻiOSʹެࣜͷ࣮ͳ͍͕ɺClean ArchitectureFluxʹΑΔ࣮ྫ͕ଟ͍
31దͳΞʔΩςΫνϟબఆͷίπ3minҎ্ͷΑ͏ͳߟྀ͖͢ΛΫϦΞͰ͖͍ͯΕɺجຊతʹԿΛબΜͰͳ͍
32దͳΞʔΩςΫνϟબఆͷίπ3minͨͩ͠ɺෳͷઃܭΛࠞͥͳ͍Α͏ʹ͢ΔA͞ΜB͞ΜFlux͕͖ͳͷͰɺࣗͷϩάΠϯը໘FluxΛ࠾༻͠·͢ʂMVCʹ׳Ε͍ͯΔͷͰɺͷ୲͍ͯ͠ΔϓϩϑΟʔϧը໘MVCΛͱʹઃܭ͠·͢ʂ
33దͳΞʔΩςΫνϟબఆͷίπ3minͨͩ͠ɺෳͷઃܭΛࠞͥͳ͍Α͏ʹ͢ΔA͞ΜB͞ΜB͞Μͷίʔυ͕ಡΊͳ͍ɻɻɻA͞Μͷίʔυ͕ಡΊͳ͍ɻɻɻC͞Μ A͞Μͷ୲ՕॴͱB͞Μͷ୲Օॴʹಉ͡Α͏ͳमਖ਼Λ͍ͨ͠ͷʹઃܭ͕શ͘ҧ͍ͬͯ͠ɻɻɻ
͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6min
35͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCɾMVVMɾClean ArchitectureɾFluxɾMVIࠓհ͢ΔΞʔΩςΫνϟ
36͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCɾMVVMɾClean ArchitectureɾFluxɾMVIࠓհ͢ΔΞʔΩςΫνϟ
37͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCModelViewControllerΞϓϦέʔγϣϯͷϩδοΫΛ୲͢Δը໘ͷඳըΛ୲͢ΔModel - ViewͷؒʹཱͬͯͦΕͧΕͷೖग़ྗΛநԽ͢Δex) View͔Βड͚औͬͨΫϦοΫΠϕϯτΛɹʮσʔλΛऔಘ͍ͨ͠ʯͱ͍͏ϦΫΤετͱͯ͠ɹ ModelʹૹΔ
38͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCϝϦοτ σϝϦοτModelʹϩδοΫͷॲཧΛͤΔ͜ͱͰɺView͕ංେԽͮ͠Β͘ͳΔController͕ؒʹཱͭ͜ͱʹΑͬͯModelͱView͕ૄ݁߹ʹͳΔ֤෦ΛͲ͏࣮͢Δ͔݁ہͦΕͧΕͷ࣮ऀʹҕͶΒΕ͍ͯΔͲ͜ʹॻ͚͍͍͔ܾΊΒΕ͍ͯͳ͍͜ͱ͕ଟ͍
39͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCɾMVVMɾClean ArchitectureɾFluxɾMVIࠓհ͢ΔΞʔΩςΫνϟ
40͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVVMModelɾViewViewModelMVCͱಉ͡Viewͷঢ়ଶཧɺߋ৽Λߦ͏Viewͷঢ়ଶͱViewModelͷঢ়ଶৗʹಈዲ͞Ε͍ͯͯɺViewModelͷߋ৽͙͢ʹViewʹө͞ΕɺΫϦοΫͳͲͷViewͷΠϕϯτViewModelܦ༝ͰModelʹ͑ΒΕΔ
41͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVVMhttps://qiita.com/rmakiyama/items/779cf6407f70b40e4ee7 ΑΓ
42͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVVMϝϦοτ σϝϦοτViewModelͷঢ়ଶΛߋ৽͢Δ͚ͩͰࣗಈతʹView͕ߋ৽͞ΕΔͨΊɺViewͷঢ়ଶཧ͕Θ͔Γ͍͢ViewModel - Viewͷঢ়ଶΛSyncͤ͞ΔΈ͕ඞཁ(RxʹΑΔঢ়ଶมߋ௨ͳͲ)ViewModel͕ංେ͍͢͠
43͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCɾMVVMɾClean ArchitectureɾFluxɾMVIࠓհ͢ΔΞʔΩςΫνϟ
44͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾClean Architecturehttps://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html ΑΓ
45͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾClean ArchitectureMVCͳͲͷΞʔΩςΫνϟΛϨΠϠʔ͝ͱͷΛ໌֬Խͯ͠࠶ઃܭͨ͠ͷσʔλͷྲྀΕৗʹʮ֎ˠˠ֎ʯͱͳΔΑ͏ʹઃܭ͞Ε͓ͯΓɺUseCase͕σʔλͷྲྀΕͷؒʹཱͬͯϩδοΫΛׂ͢Δ
46͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾClean ArchitectureϝϦοτ σϝϦοτ֤ϨΠϠʔͷ͕໌֬ͳͨΊɺԿΛͲ͜ʹॻ͔͕࣮͘ऀʹΑͬͯมΘΔ͜ͱ͕গͳ͍DDD(υϝΠϯۦಈઃܭ)Λͱʹ͍ͯ͠ΔͨΊɺClean ArchitectureͰྑ͍ίʔυΛॻ͘ʹDDDͷ͕ࣝඞཁʹͳΔUseCase͕ॲཧΛࡉׂ͔͘͢ΔͨΊɺϩδοΫͷ࠶ར༻ੑ͕ߴ·Δ
47͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCɾMVVMɾClean ArchitectureɾFluxɾMVIࠓհ͢ΔΞʔΩςΫνϟ
48͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾFluxhttps://facebook.github.io/flux/ ΑΓ
49͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾFlux ୯ํσʔλϑϩʔͷදతͳΞʔΩςΫνϟΞϓϦέʔγϣϯͷঢ়ଶStoreͷΈʹΑͬͯཧ͞ΕɺͦΕҎ֎Storeͷঢ়ଶΛߋ৽͢ΔͨΊͷϞδϡʔϧঢ়ଶͷߋ৽ඞͣView → Action → Dispatcher → Storeͷॱʹσʔλ͕ྲྀΕΔ͜ͱͰߦΘΕΔ
50͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾFluxϝϦοτ σϝϦοτঢ়ଶ͕Storeʹू͞ΕΔͨΊཧ͕͍͢͠ಉظతͳঢ়ଶߋ৽Λجຊʹ͍ͯ͠ΔͨΊɺ௨৴ͳͲͷඇಉظॲཧͱͷ࿈ܞʹ͕ඞཁΞʔΩςΫνϟϨϕϧͰςετ༰қੑ͕ߟ͑ΒΕ͍ͯΔঢ়ଶͷߋ৽͕Actionͱ݁ͼͭͨ͘ΊͲͷΑ͏ͳঢ়ଶߋ৽͕͋Δ͔ΛҰཡ͍͢͠
51͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVCɾMVVMɾClean ArchitectureɾFluxɾMVIࠓհ͢ΔΞʔΩςΫνϟ
52͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVI
53͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVIFluxͱಉ༷ʹ୯ํσʔλϑϩʔͷΞʔΩςΫνϟIntent, Action, Result, Stateͱ͍͏σʔλͱɺಁաతͳؔͷΈͰ࣮͢Δ
54͍Ζ͍ΖͳΞʔΩςΫνϟͷհ6minɾMVIϝϦοτ σϝϦοτঢ়ଶߋ৽ͷϩδοΫͷࢀরಁաੑ͕୲อ͞Ε͍ͯΔͨΊɺςετ͕ॻ͖͍͢FluxΑΓ֤Ϟδϡʔϧͷׂ͕ࡉԽ͞Ε͍ͯΔͨΊɺ࣮ऀʹΑΔίʔυͷϒϨ͕গͳ͍ϘΠϥʔϓϨʔτ͕ଟ͘ɺ؆୯ͳ࣮Λ͢Δ͚ͩͰଟ͘ͷίʔυΛॻ͘ඞཁ͕͋Δ
·ͱΊ2min
56·ͱΊ2minΞʔΩςΫνϟʹۜͷؙͳ͍దͳΞʔΩςΫνϟʹଇͬͯ։ൃΛߦ͏͜ͱͰɺϓϩάϥϛϯάͷϕετϓϥΫςΟεΛϓϩδΣΫτશମͰकΔ͜ͱ͕Ͱ͖ΔΞʔΩςΫνϟͷઃܭطଘͷΞʔΩςΫνϟͷબʹϕετϓϥΫςΟεΛΔ͜ͱ͕େ
57·ͱΊ2min͋Γ͕ͱ͏͍͟͝·ͨ͠@AbemaTV Hackhttps://twitter.com/itometeamhttps://github.com/itomehttps://medium.com/@itometeam