Slide 1

Slide 1 text

ಡΈ΍͍͢ίʔυͷॻ͖ํˠୈ 6 ճ ґଘؔ܎ ‐

Slide 2

Slide 2 text

લճͷ͓͞Β͍: ؔ਺ ཁ໿Λॻ͍ͯؔ਺͕ཧղ͠΍͍͔֬͢ೝ͢Δ ؔ਺ͷ੹೚: - ඞཁͳΒ෼ׂ͢Δ - ϝΠϯͷ݁ՌΛฦ͢ͱ͖͸มߋ͠ͳ͍ ؔ਺ͷྲྀΕ: - ఆٛࢦ޲ϓϩάϥϛϯά, ΞʔϦʔϦλʔϯ, ର৅ʹΑΔ෼ׂ

Slide 3

Slide 3 text

ߨٛͷߏ੒ - ಋೖͱݪଇ - ࣗવݴޠ: ໋໊, ίϝϯτ - ܕͷߏ଄: ঢ়ଶ, ؔ਺ - ܕؒͷߏ଄: ґଘؔ܎I, ґଘؔ܎II - ϨϏϡʔ ґଘؔ܎ > ಋೖ

Slide 4

Slide 4 text

ʮґଘؔ܎ʯͱ͸ 1/2 ྫ: Ϋϥε X ͕ Y ʹґଘ͍ͯ͠Δঢ়گ - X ͕ Y ͷΠϯελϯεΛϓϩύςΟͱͯ࣋ͭ͠ - X ͷϝιου͕ Y ΛҾ਺ɾ໭Γ஋ ͱͯ͠࢖͏ - X ͕ Y ͷϝιουΛݺͼग़͢ - X ͕ Y Λܧঝ͢Δ ͓͓Αͦ X தʹʮYʯ͕ग़ݱ 㱺 X ͸ Y ʹґଘ͍ͯ͠Δ ґଘؔ܎ > ಋೖ

Slide 5

Slide 5 text

ʮґଘؔ܎ʯͱ͸ 2/2 ґଘؔ܎͸Ϋϥεಉ࢜ͷΈͰൃੜ͢Δʁ No Πϯελϯεɾؔ਺ɾϞδϡʔϧؒͰ΋ى͖Δ Ұ໨Ͱ͸Θ͔Γʹ͍͘ґଘؔ܎΋͋Δ ґଘؔ܎ > ಋೖ

Slide 6

Slide 6 text

ґଘؔ܎ IɾII ͷ಺༰ ґଘؔ܎ I: - ݁߹౓ ґଘؔ܎ II: - ํ޲ - ॏෳ - ໌ࣔੑ ґଘؔ܎ > ಋೖ

Slide 7

Slide 7 text

ґଘؔ܎ IɾII ͷ಺༰ ґଘؔ܎ I: - ݁߹౓ ґଘؔ܎ II: - ํ޲ - ॏෳ - ໌ࣔੑ ґଘؔ܎ > ݁߹౓

Slide 8

Slide 8 text

݁߹౓ ґଘؔ܎ͷڧ͞Λࣔ͢ई౓ ऑ͍݁߹͕޷·͍͠ ΦϦδφϧͷఆٛ7Ͱ͸ؔ਺ؒͷґଘͷڧ͞Λࣔ͢ ͜ͷϓϨθϯςʔγϣϯͰ͸Ϋϥεؒͷؔ܎ʹ֦ு͢Δ 7 Glenford J. Myers. 1975. Reliable software though composite design. Litton Educational Publishing, Inc. ґଘؔ܎ > ݁߹౓

Slide 9

Slide 9 text

݁߹౓ 2/2 (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Content coupling) (Common coupling) (External coupling) ґଘؔ܎ > ݁߹౓

Slide 10

Slide 10 text

ࠓճͷ಺༰ (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Common coupling) (Content coupling) (External coupling) ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 11

Slide 11 text

಺༰݁߹ ίʔυ಺෦ͷৼΔ෣͍ʹґଘ͢Δؔ܎ - ίʔυͷ಺෦ʹ௚઀δϟϯϓ͢Δ - Ӆṭ͞Εͨঢ়ଶΛ௚઀มߋ͢Δ - ಈ࡞Λ௚઀ॻ͖׵͑Δ ۙ୅తͳϓϩάϥϛϯάݴޠͰ͸༰қʹͰ͖ͳ͍ ͨͩ͠ɺʮࣅͨΑ͏ͳʯৼΔ෣͍͸࡞Εͯ͠·͏ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 12

Slide 12 text

಺༰݁߹ͱಉ౳ͷ݁߹ - ෆਖ਼ͳ࢖͍ํͷڐ༰ - ಺෦ͷՄมͳঢ়ଶͷڞ༗ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 13

Slide 13 text

಺༰݁߹ͱಉ౳ͷ݁߹ - ෆਖ਼ͳ࢖͍ํͷڐ༰ - ಺෦ͷՄมͳঢ়ଶͷڞ༗ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 14

Slide 14 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: Α͘ͳ͍ྫ class Caller { fun callCalculator() { calculator.calculate() ... ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 15

Slide 15 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: Α͘ͳ͍ྫ class Caller { fun callCalculator() { calculator.parameter = 42 calculator.calculate() val result = calculator.result ... ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 16

Slide 16 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: Α͘ͳ͍ྫ class Caller { fun callCalculator() { calculator.parameter = 42 calculator.prepare() calculator.calculate() calculator.tearDown() val result = calculator.result ... ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 17

Slide 17 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: Կ͕ʮΑ͘ͳ͍ʯ͔ calculator ͷ࢖͍ํΛؒҧ͍΍͍͢ - prepare()ɾtearDown() Λਖ਼͘͠ݺͿඞཁ͕͋Δ - ஋Λड͚౉͠ʹ parameter/result Λ࢖͏ඞཁ͕͋Δ ࢓༷ͷมߋʹରͯ͠ؤ݈Ͱͳ͍ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 18

Slide 18 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: मਖ਼ํ๏ - ݺͼग़͠ॱͷ੍໿ΛӅ͢ - ஋ͷड͚౉͠ʹҾ਺ɾ໭Γ஋Λ࢖͏ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 19

Slide 19 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: मਖ਼ྫ class Caller { fun callCalculator() { val result = calculator.calculate(42) ... class Calculator { fun calculate(type: Int): Int { prepare() ... tearDown() return ... ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 20

Slide 20 text

ෆਖ਼ͳ࢖͍ํͷڐ༰: ֬ೝ͢΂͖఺ σβΠϯίϯηϓτ΍ݪଇΛա৒ʹద༻͠ͳ͍ - ྫ: ίϚϯυɾΫΤϦ෼཭ͷݪଇ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 21

Slide 21 text

಺༰݁߹ͱಉ౳ͷ݁߹ - ෆਖ਼ͳ࢖͍ํͷڐ༰ - ಺෦ͷՄมͳঢ়ଶͷڞ༗ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 22

Slide 22 text

಺෦ͷՄมͳঢ়ଶͷڞ༗: ʮΑ͘ͳ͍ʯྫ class UserListPresenter(val userList: List) { fun refreshViews() { /* ... */ } class Caller { val userList: MutableList = mutableListOf() val presenter = UserListPresenter(userList) ... fun addUser(newUser: UserData) { userList += newUser presenter.refreshViews() ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 23

Slide 23 text

಺෦ͷՄมͳঢ়ଶͷڞ༗: Կ͕ʮΑ͘ͳ͍ʯ͔ UserListPresenter ͕֎෦ͷՄมͳঢ়ଶʹґଘ͍ͯ͠Δ - ଞͷ userList ͷॴ༗ऀʹΑͬͯҙਤͤͣঢ়ଶ͕ߋ৽͞ΕΔ - userList ͷมߋํ๏ͷ੍໿ʢ௥Ճɾ࡟আ౳ʣʹ੍໿͕ͳ͍ ෆਖ਼ͳঢ়ଶΛ࡞Γ΍͘͢ɺόάͷௐࠪ΋ࠔ೉ - UserListPresenter ͷࢀরͳ͠ʹߋ৽Մೳ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 24

Slide 24 text

಺෦ͷՄมͳঢ়ଶͷڞ༗: मਖ਼ํ๏ - ෆมͳ஋ɾ஋ͷෳ੡ɾίϐʔΦϯϥΠτΛར༻͢Δ - ঢ়ଶΛߋ৽͢ΔͨΊͷΠϯλʔϑΣΠεΛ࡞Δ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 25

Slide 25 text

಺෦ͷՄมͳঢ়ଶͷڞ༗: मਖ਼ྫ class UserListPresenter { val userList: MutableList = mutableListOf() fun addUsers(newUsers: List) { userList += newUsers // Update views with `userList` } (addUsers ͕ΞτϛοΫͳΒ) newUsers ͕ՄมͰ͋ͬͯ΋໰୊ͳ͍ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 26

Slide 26 text

಺෦ͷՄมͳঢ়ଶͷڞ༗: ֬ೝ͢΂͖఺ ঢ়ଶͷॴ༗ऀΛ໌֬ʹ͢Δ ࣮ݱํ๏: - ॴ༗ऀͷΠϯλʔϑΣΠεΛ௨ͯ͠ঢ়ଶΛߋ৽͢Δ - Մมͳঢ়ଶΛ؅ཧ͢ΔΫϥεΛ࡞੒͢Δ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 27

Slide 27 text

಺༰݁߹: ·ͱΊ ಺෦ͷಈ࡞ʹґଘͨ͠ίʔυΛ࡞Βͳ͍ - ʮෆਖ਼ͳ࢖͍ํʯ͕Ͱ͖ͳ͍Α͏ʹ͢Δ - Մมͳঢ়ଶͷॴ༗ऀΛ໌֬ʹ͢Δ ґଘؔ܎ > ݁߹౓ > ಺༰݁߹

Slide 28

Slide 28 text

ࠓճͷ಺༰ (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Common coupling) (External coupling) (Content coupling) ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 29

Slide 29 text

ڞ௨݁߹ɾ֎෦݁߹ ՄมͳάϩʔόϧσʔλΛڞ༗͢Δؔ܎ - άϩʔόϧม਺ʹΑΔ஋ͷड͚౉͠ - Մมͳγϯάϧτϯʹର͢Δґଘ - (ϑΝΠϧγεςϜɾωοτϫʔΫ౳ͷڞ༗Ϧιʔεͷར༻) ڞ௨݁߹: σʔλߏ଄ͷڞ༗, ֎෦݁߹: جຊܕͷ஋ͷڞ༗ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 30

Slide 30 text

ڞ௨݁߹ɾ֎෦݁߹ ՄมͳάϩʔόϧσʔλΛڞ༗͢Δؔ܎ - άϩʔόϧม਺ʹΑΔ஋ͷड͚౉͠ - Մมͳγϯάϧτϯʹର͢Δґଘ - (ϑΝΠϧγεςϜɾωοτϫʔΫ౳ͷڞ༗Ϧιʔεͷར༻) ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 31

Slide 31 text

άϩʔόϧม਺ͷར༻: ʮΑ͘ͳ͍ʯྫ var parameter: Int? = null var result: Int? = null class Calculator { fun calculate() { result = parameter + ... fun callCalculator() { parameter = 42 calculator.calculate() ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 32

Slide 32 text

άϩʔόϧม਺ͷར༻: Կ͕ʮΑ͘ͳ͍ʯ͔ ஋ͱݺͼग़͠ͷؔ܎ੑ੍͕໿͞Εͳ͍ - ಉ࣌ʹෳ਺ճͷݺͼग़͠Λ͢Δ͜ͱͰյΕΔ - ෆਖ਼ͳঢ়ଶΛ࡞Γ΍͍͢ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 33

Slide 33 text

άϩʔόϧม਺ͷར༻: मਖ਼ํ๏ ஋ΛҾ਺΍໭Γ஋Ͱड͚౉͢͠Δ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 34

Slide 34 text

άϩʔόϧม਺ͷར༻: मਖ਼ྫ class Calculator { fun calculate(parameter: Int): Int = parameter + ... fun callCalculator() { val result = calculator.calculate(42) ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 35

Slide 35 text

ڞ௨݁߹ɾ֎෦݁߹ ՄมͳάϩʔόϧσʔλΛڞ༗͢Δؔ܎ - άϩʔόϧม਺ʹΑΔ஋ͷड͚౉͠ - Մมͳγϯάϧτϯʹର͢Δґଘ - (ϑΝΠϧγεςϜɾωοτϫʔΫ౳ͷڞ༗Ϧιʔεͷར༻) ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 36

Slide 36 text

Մมͳγϯάϧτϯͷར༻: ʮΑ͘ͳ͍ʯྫ val USER_DATA_REPOSITORY = UserDataRepository() class UserListUseCase { suspend fun invoke(): List = withContext(...) { val result = USER_DATA_REPOSITORY.query(...) ... ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 37

Slide 37 text

Մมͳγϯάϧτϯͷར༻: Կ͕ʮΑ͘ͳ͍ʯ͔ γϯάϧτϯ͸؅ཧ͕ࠔ೉ - γϯάϧτϯͷϥΠϑαΠΫϧɾείʔϓɾࢀরͷ؅ཧ͕ࠔ೉ - ࢓༷ͷมߋʹର͢Δॊೈੑ͕௿͍ - γϯάϧτϯΛ࢖͏ίʔυͷςετ͕೉͍͠ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 38

Slide 38 text

Մมͳγϯάϧτϯͷར༻: मਖ਼ํ๏ ΠϯελϯεΛίϯετϥΫλύϥϝʔλͱͯ͠౉͢ ( ґଘੑͷ஫ೖ) ίϯετϥΫλΛݺͼग़͢ଆͰΠϯελϯεΛ؅ཧՄೳ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 39

Slide 39 text

Մมͳγϯάϧτϯͷར༻: मਖ਼ྫ class UserListUseCase( val userDataRepository: UserDataRepository ) { suspend fun invoke(): List = withContext(...) { val result = userDataRepository.query(...) ... ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 40

Slide 40 text

ڞ௨݁߹ɾ֎෦݁߹: ิ଍ ΑΓখ͍͞είʔϓʹରͯ͠΋ಉٞ͡࿦Λద༻Մೳ - ϞδϡʔϧɾύοέʔδɾΫϥε... ྫ: ΠϯελϯεϓϩύςΟʹΑΔ஋ͷड͚౉͠Λආ͚Δ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 41

Slide 41 text

Ϋϥε಺ͷڞ௨݁߹ɾ֎෦݁߹: ʮΑ͘ͳ͍ʯྫ class Klass { var parameter: Int? = null fun firstFunction() { parameter = 42 secondFunction() } fun secondFunction() { /* Use `parameter` here... */ } ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 42

Slide 42 text

Ϋϥε಺ͷڞ௨݁߹ɾ֎෦݁߹: मਖ਼ྫ class Klass { fun firstFunction() { val argument = 42 secondFunction(argument) } fun secondFunction(parameter: Int) { /* Use `parameter` here... */ } ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 43

Slide 43 text

ڞ௨݁߹ɾ֎෦݁߹: ·ͱΊ Մมͳγϯάϧτϯ΍άϩʔόϧม਺Λ࢖Θͳ͍ - ؅ཧ΍ςετ͕೉͍͠ɾมߋͷӨڹൣғ͕େ͖͍ ڞ௨݁߹ɾ֎෦݁߹ͷճආํ๏: - ஋ͷड͚౉͠ʹҾ਺΍໭Γ஋Λ࢖͏ - ґଘੑͷ஫ೖΛߦ͏ ґଘؔ܎ > ݁߹౓ > ڞ௨݁߹ɾ֎෦݁߹

Slide 44

Slide 44 text

ࠓճͷ಺༰ (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Content coupling) (Common coupling) (External coupling) ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 45

Slide 45 text

੍ޚ݁߹ ʮԿΛ͢Δ͔ʯΛҾ਺ͰܾΊΔ ιϑτ΢ΣΞ։ൃͰ͸ආ͚ΒΕͳ͍ଆ໘΋͋Δ ؇࿨͢΂੍͖ޚ݁߹΋͋Δ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 46

Slide 46 text

؇࿨͢΂੍͖ޚ݁߹ - ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ - վળҊ - ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ - վળҊ 1 - վળҊ 2 ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 47

Slide 47 text

؇࿨͢΂੍͖ޚ݁߹ - ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ - վળҊ - ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ - վળҊ 1 - վળҊ 2 ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 48

Slide 48 text

ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ: ʮΑ͘ͳ͍ʯྫ fun updateView(isError: Boolean) { if (isError) { resultView.isVisible = true errorView.isVisible = false iconView.image = CROSS_MARK_IMAGE } else { resultView.isVisible = false errorView.isVisible = true iconView.image = CHECK_MARK_IMAGE } } ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 49

Slide 49 text

ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ: Կ͕ʮΑ͘ͳ͍ʯ͔ - ಈ࡞Λཧղ͢ΔͨΊʹ͢΂ͯͷ෼ذΛಡΉඞཁ͕͋Δ - ࣮૷ͷมߋʹରͯ͠ؤ݈Ͱ͸ͳ͍ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 50

Slide 50 text

؇࿨͢΂੍͖ޚ݁߹ - ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ - վળҊ: ૢ࡞ର৅ʹΑΔ෼ׂͷద༻ - ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ - վળҊ 1 - վળҊ 2 ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 51

Slide 51 text

ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ: मਖ਼ํ๏ ৚݅Ͱ͸ͳ͘ɺઌʹૢ࡞ର৅Ͱ෼ׂ͢Δ (લճઆ໌ͨ͠ํ๏) - ੍ޚ݁߹ͷൣғΛখ͘͢͞Δ ৚݅ʹΑͬͯૢ࡞ͷର৅͕มΘΒͳ͍৔߹ʹ༗ޮ - ର৅͕Ұ෦͚ͩҟͳΔ৔߹: updateIf... ౳ͰࠩҟΛٵऩՄ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 52

Slide 52 text

ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ: मਖ਼ྫ fun updateView(isError: Boolean) { if (isError) { resultView.isVisible = true errorView.isVisible = false iconView.image = CROSS_MARK_IMAGE } else { resultView.isVisible = false errorView.isVisible = true iconView.image = CHECK_MARK_IMAGE } } ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 53

Slide 53 text

ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ: मਖ਼ྫ fun updateView(isError: Boolean) { resultView.isVisible = !isError errorView.isVisible = isError iconView.image = getIconImage(isError) } fun getIconImage(isError: Boolean): Image = if (!isError) CHECK_MARK_IMAGE else CROSS_MARK_IMAGE ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 54

Slide 54 text

؇࿨͢΂੍͖ޚ݁߹ - ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ - վળҊ: ૢ࡞ର৅ʹΑΔ෼ׂͷద༻ - ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ - վળҊ 1 - վળҊ 2 ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 55

Slide 55 text

ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ: ʮΑ͘ͳ͍ʯྫ 1/2 sealed class DataType { class UserName(...) : DataType() class BirthDate(...) : DataType() class ProfileImage(...) : DataType() } ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 56

Slide 56 text

ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ: ʮΑ͘ͳ͍ʯྫ 2/2 fun updateUserView(dataType: DataType) = when(dataType) { is DataType.UserName -> { val userName = getUserName(dataType.userId) userNameView.text = userName } is DataType.Birthday -> { val birthDate = ... birthDayView.text = format(birthDate, ...) } is DataType.ProfileImage -> { ... } } ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 57

Slide 57 text

ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ: Կ͕ʮΑ͘ͳ͍ʯ͔ - ͢΂ͯͷ෼ذΛಡ·ͳ͍ͱʮԿΛ͢Δ͔ʯ͕Θ͔Βͳ͍ - ݺͼग़͠ݩͷ৚݅ͱݺͼग़͠ઌͷಈ࡞ͷରԠ෇͚͕༰қͰͳ͍ updateUserView(DataType.ProfileImage(...)) fun updateUserView(dataType: DataType) = when(dataType) { is DataType.UserName -> { ... } // Need to check the condition... is DataType.Birthday -> { ... } is DataType.ProfileImage -> { ... } // Finally found ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 58

Slide 58 text

؇࿨͢΂੍͖ޚ݁߹ - ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ - վળҊ: ૢ࡞ର৅ʹΑΔ෼ׂͷద༻ - ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ - վળҊ 1: ৚݅෼ذͦͷ΋ͷͷ࡟আ - վળҊ 2: ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 59

Slide 59 text

৚݅෼ذͷ࡟আ ৚݅ຖʹؔ਺Λ෼ׂ͢Δ ݺͼग़͠ݩʹΑͬͯ৚͕݅ ੩తʹ ܾ·Δ৔߹ʹ༗ޮ - ੩తʹ͕ܾ·Βͳ͍৔߹ɺݺͼग़͠ݩͰ੍ޚ݁߹͕ൃੜ͢Δ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 60

Slide 60 text

৚݅෼ذͷ࡟আ: ద༻Ͱ͖Δঢ়گྫ ʮݺͼग़͠ݩ͕Ͳ͔͜ʯͰ৚͕ܾ݅·Δ class Caller1 { fun caller1() = presenter.updateUserView(DataType.UserName(...)) } class Caller2 { fun caller2() = presenter.updateUserView(DataType.BirthDate(...)) } ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 61

Slide 61 text

৚݅෼ذͷ࡟আ: վળྫ fun updateUserView(dataType: DataType) = when(dataType) { is DataType.UserName -> { val userName = getUserName(dataType.userId) userNameView.text = userName } is DataType.Birthday -> { val birthDate = ... birthDayView.text = format(birthDate, ...) } is DataType.ProfileImage -> { ... } } ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 62

Slide 62 text

৚݅෼ذͷ࡟আ: վળྫ fun updateUserNameView(...) { val userName = getUserName(...) userNameView.text = userName } fun updateBirthdayView(...) { val birthDate = ... birthDayView.text = format(birthDate, ...) } fun updateProfileImage(...) { ... ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 63

Slide 63 text

؇࿨͢΂੍͖ޚ݁߹ - ෆඞཁʹཻ౓ͷେ͖͍৚݅෼ذ - վળҊ: ૢ࡞ର৅ʹΑΔ෼ׂͷద༻ - ಈ࡞ͷؔ࿈ੑ͕ബ͍৚݅෼ذ - վળҊ 1: ৚݅෼ذͦͷ΋ͷͷ࡟আ - վળҊ 2: ଞͷߏ଄Ͱͷஔ͖׵͑ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 64

Slide 64 text

ଞͷߏ଄Ͱͷஔ͖׵͑ ʮԿΛ͢Δ͔ʯΛܾΊΔΫϥε΍஋Λ࡞Δ ྫ: ετϥςδʔύλʔϯ - ෼ذΛଟ૬ੑ΍ύϥϝʔλͰஔ͖׵͑Δ - ྻڍܕɾந৅ΫϥεɾίʔϧόοΫΦϒδΣΫτ౳Ͱ࣮૷͢Δ - ߏ଄͕ෳࡶʹͳΔͷͰɺଞͷख๏Λ༏ઌ͢Δ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 65

Slide 65 text

ଞͷߏ଄Ͱͷஔ͖׵͑: վળྫ enum class Binder(val viewId: ViewId) { fun updateView(holder: ViewHolder) = setContent(holder.getView(viewId)) abstract fun setContent(view: View) ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 66

Slide 66 text

ଞͷߏ଄Ͱͷஔ͖׵͑: վળྫ enum class Binder(val viewId: ViewId) { USER_NAME(USER_NAME_VIEW_ID) { override fun setContent(...) = ... } BIRTHDAY(BIRTHDAY_VIEW_ID) { override fun setContent(...) = ... ... fun updateView(holder: ViewHolder) = setContent(holder.getView(viewId)) abstract fun setContent(view: View) ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 67

Slide 67 text

ଞͷߏ଄Ͱͷஔ͖׵͑: ஫ҙ఺ ஔ͖׵͑ΔϩδοΫͷൣғΛߟ͑Δ - ൚༻తͳΫϥεʹಛఆػೳͷ࣮૷ΛؚΊͳ͍ - ඞཁͳΒϞσϧͱϩδοΫΛ෼཭͢ΔɾผͷϞσϧΛ༻ҙ͢Δ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 68

Slide 68 text

੍ޚ݁߹: ·ͱΊ ෆඞཁʹେ͖͍ɾಈ࡞ͷؔ࿈ͷബ͍৚݅෼ذΛආ͚Δ ੍ޚ݁߹ͷ؇࿨ํ๏ - ૢ࡞ର৅͕ڞ௨: ର৅ʹΑΔ෼ׂͷద༻ - ৚͕݅੩తʹܾ·Δ: ؔ਺ͷ෼ׂʹΑΔ෼ذͷ࡟আ - ͦΕҎ֎: ετϥςδʔύλʔϯ౳ʹΑΔஔ͖׵͑ ґଘؔ܎ > ݁߹౓ > ੍ޚ݁߹

Slide 69

Slide 69 text

ࠓճͷ಺༰ (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Content coupling) (Common coupling) (External coupling) ґଘؔ܎ > ݁߹౓ > ελϯϓ݁߹

Slide 70

Slide 70 text

ελϯϓ݁߹ Ҿ਺ɾ໭Γ஋Ͱσʔλߏ଄Λड͚౉͢͠Δؔ܎ ࢖Θͳ͍σʔλؚ͕·Ε͍ͯͯ΋ڐ༰͞ΕΔ৔߹΋͋Δ: - ଟ૬ੑΛ࢖͏৔߹΍ετϥςδʔύλʔϯΛ࢖͏৔߹ - Ҿ਺ɾ໭Γ஋Λ୯७Խɾҙຯ෇͚Λ͢Δ৔߹ ґଘؔ܎ > ݁߹౓ > ελϯϓ݁߹

Slide 71

Slide 71 text

ελϯϓ݁߹: ྫ updateUserView(userData) fun updateUserView(userData: UserData) { ґଘؔ܎ > ݁߹౓ > ελϯϓ݁߹

Slide 72

Slide 72 text

ελϯϓ݁߹: ྫ updateUserView(userData) fun updateUserView(userData: UserData) { // Some property of `userData` are used userNameView.text = userData.fullName profileImage.setImageUrl(userData.profileImageUrl) // `userData.mailAddress` and `.phoneNumber` are not used } ґଘؔ܎ > ݁߹౓ > ελϯϓ݁߹

Slide 73

Slide 73 text

ࠓճͷ಺༰ (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Content coupling) (Common coupling) (External coupling) ґଘؔ܎ > ݁߹౓ > σʔλ݁߹

Slide 74

Slide 74 text

σʔλ݁߹ جຊతͳܕͷΈΛҾ਺ɾ໭Γ஋Ͱड͚౉ؔ͢܎8 fun updateUserView(fullName: String, profileImageUrl: String) { userNameView.text = fullName profileImage.setImageUrl(profileImageUrl) } updateUserView(userData.fullName, userData.profileImageUrl) 8 ݫີʹ͸ɺString ͸จࣈͷ഑ྻ/Ϧετͱߟ͑ΒΕΔ ґଘؔ܎ > ݁߹౓ > σʔλ݁߹

Slide 75

Slide 75 text

σʔλ݁߹: ஫ҙ఺ ελϯϓ݁߹ͷํ͕޷·͍͜͠ͱ΋͋Δ - Ҿ਺ͷҙຯ෇͚͕ඞཁͳ৔߹ - ܕݕࠪΛߦ͑Δ৔߹ fun updateUserView(fullName: String, profileImageUrl: String) = ... updateUserView(imageUrl, fullName) // !!! updateUserView(itemName, itemImageUrl) // !!! updateUserView(userA.fullName, userB.imageUrl) // !!! ґଘؔ܎ > ݁߹౓ > σʔλ݁߹

Slide 76

Slide 76 text

ࠓճͷ಺༰ (Message coupling) (Data coupling) (Stamp coupling) (Control coupling) (Content coupling) (Common coupling) (External coupling) ґଘؔ܎ > ݁߹౓ > ϝοηʔδ݁߹

Slide 77

Slide 77 text

ϝοηʔδ݁߹ ؔ਺ΛҾ਺ɾ໭Γ஋ͳ͠Ͱݺͼग़͚ͩ͢ͷؔ܎ - ႈ౳ͳؔ਺ͷݺͼग़͠౳ ʢྫ: Closable.closeʣ - ผͷ৔ॴͰ಺༰݁߹Λੜ͍ͯ͡ΔՄೳੑ͕͋Δ fun notifyUserDataUpdated() { userNameView.text = ... profileImage.setImageUrl(...) } notifyUserDataUpdated() ґଘؔ܎ > ݁߹౓ > ϝοηʔδ݁߹

Slide 78

Slide 78 text

݁߹౓: ·ͱΊ ऑ͍݁߹Λ࢖͏ - ελϯϓ݁߹ɾσʔλ݁߹Λҙࣝͯ͠࢖͏ ஫ҙ͢Δ΂͖݁߹ - ಺༰݁߹: ಺෦ͷৄࡉͳಈ࡞ʹґଘ͢Δؔ܎ - ڞ௨݁߹ɾ֎෦݁߹: Մมͳάϩʔόϧσʔλ࢖͏ؔ܎ - ੍ޚ݁߹: ʮԿΛ͢Δ͔ʯΛҾ਺ͰܾΊΔؔ܎ ґଘؔ܎ > ݁߹౓ > ·ͱΊ