Slide 1

Slide 1 text

ϨϏϡʔͷ΋΍΋΍ ͳΜͱͳ͘ҧ͏Λු͖ூΓʹ ʮಡΈ΍͍͢ίʔυͷΨΠυϥΠϯʯͷ׆༻๏ Munetoshi Ishikawa

Slide 2

Slide 2 text

͜ͷτʔΫͷ஫ҙ఺ Կ͕ʮಡΈ΍͍͢ʯ͔͸࣌୅ͱίϯςΩετʹΑΔ - ࠓճ঺հ͢Δ಺༰΋ྫ֎Ͱ͸ͳ͍ - ςΫχοΫΑΓ΋ߟ͑ํʹϑΥʔΧε

Slide 3

Slide 3 text

͜ͷτʔΫͰ࢖͏༻ޠ ϨϏϡʔΞ: ϨϏϡʔΛ࣮ࢪ͢Δਓ ϨϏϡʔΠ: ϨϏϡʔΛґཔ͢Δਓ

Slide 4

Slide 4 text

ίʔυϨϏϡʔͷ೉͠͞ ίʔυͷ໰୊఺ΛݴޠԽ͢Δඞཁ͕͋Δ - ʮͳΜͱͳ͘μϝʯͰ͸Ͳ͏मਖ਼͢Ε͹Α͍͔Θ͔Βͳ͍ ͏·͘આ໌Ͱ͖ͳ͍໰୊͸ܰࢹ͞Ε͕ͪ - ʮ·͍͍͋΍ʯͰ approve ͯ͠͠·͏͔΋

Slide 5

Slide 5 text

໰୊ͷݴޠԽ όά͸ʮݟ͚ͭΕ͹ʯݴޠԽ͕؆୯ - ࠶ݱ͢Δ৚݅Λͦͷ··ίϝϯτͱͯ͠ॻ͚͹ྑ͍ ಡΈʹ͘͞ͷݴޠԽ͸೉͍͠ - ʮࣗ෼͕ίʔυΛཧղ͢ΔաఔʯΛཧղ͢Δඞཁ͕͋Δ

Slide 6

Slide 6 text

ݴޠԽͷίπ ໰୊Λ෼ྨ͢Δ - ʮݴޠԽʯͷൣғΛݶఆ͢Δ - ෼ྨ͸֊૚త (ྫ: ໋໊ > Ϋϥεͷ໋໊ > จ๏ > ޠॱ) ෼ྨͱྨܕͷ֬ೝʹຊॻ͕໾ʹཱ͔ͭ΋

Slide 7

Slide 7 text

ॻ੶ʹ͍ͭͯ ಡΈ΍͍͢ίʔυͷΨΠυϥΠϯ - ࣋ଓՄೳͳιϑτ΢ΣΞ։ൃͷͨΊʹ - Oct. 22, 2022. ٕज़ධ࿦ࣾ - ϓϨθϯςʔγϣϯ ʮCode Readabilityʯ͕ϕʔε https://gihyo.jp/book/ 2022/978-4-297-13036-7

Slide 8

Slide 8 text

ϓϨθϯςʔγϣϯʮCode Readabilityʯ https://speakerdeck.com/munetoshi/code-readability ("code readability" Ͱݕࡧ) શ 8 ͔࣌ؒΒͳΔηογϣϯ ʮίʔυϨϏϡʔͰָΛ͍ͨ͠ʯ͕ಈػ ϨϏϡʔͷࢦఠʹ͸ྨܕ͕͋Δ

Slide 9

Slide 9 text

τϐοΫ - 2ষ: ໋໊ - 3ষ: ίϝϯτ - 5ষ: ؔ਺ - 6ষ: ґଘؔ܎

Slide 10

Slide 10 text

τϐοΫ - 2ষ: ໋໊ - 3ষ: ίϝϯτ - 5ষ: ؔ਺ - 6ষ: ґଘؔ܎

Slide 11

Slide 11 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ /**ɹA collection of `Foo`, which provides ... */ class FooList(...) { /** True if this list is ordered. */ val ordered: Boolean get() { ... } /** Returns a new instance with reversed order */ fun reversed(): FooList { ... } /** Returns a new mutable `MutableFooList` from the elements. */ fun mutating(): MutableFooList { ... } }

Slide 12

Slide 12 text

໊લ෇͚ͰΑ͋͘Δ໰୊ ࣍ͷͲΕ͔ʹ෼ྨͰ͖Δ͜ͱ͕ଟ͍ - จ๏ - ໊લͷࣔ͢಺༰ - ޠͷબ୒ - ௕͞ ·ͣ͸ͲΕʹ౰ͯ͸·Δ͔Λߟ͑Δ

Slide 13

Slide 13 text

໊લ෇͚ͰΑ͋͘Δ໰୊ ࣍ͷͲΕ͔ʹ෼ྨͰ͖Δ͜ͱ͕ଟ͍ - จ๏ - ໊લͷࣔ͢಺༰ - ޠͷબ୒ - ௕͞ ·ͣ͸ͲΕʹ౰ͯ͸·Δ͔Λߟ͑Δ

Slide 14

Slide 14 text

ࠓճͷ໰୊఺ จ๏: ಈࢺͷ෼ࢺ (...ing, ...ed) ΛҟͳΔҙຯʹ࢖͍ͬͯΔ val ordered: Boolean get() { ... } fun reversed(): FooList { ... } fun mutating(): MutableFooList { ... } - ordered: ৚݅Λຬ͍ͨͯ͠Δ͔Λਅِ஋Ͱࣔ͢ - reversed, mutating: ৚݅Λຬͨ͢৽ͨͳΠϯελϯεΛฦ͢

Slide 15

Slide 15 text

ຊॻͷ׆༻๏ ॻ੶ 2-1 ໋໊ʹ࢖͏จ๏ ϓϩάϥϛϯάݴޠʹΑ໋໊ͬͯͷจ๏͸มΘΓ͏Δ - ڞ௨ͷจ๏: ໊ࢺ(۟)ɾ໋ྩจ - ҟͳΔจ๏: ܗ༰ࢺɾ෭ࢺ etc ࠓճͷ໰୊͸ʮݴޠʹΑͬͯҟͳΔจ๏ʯͷ࢖͍෼͚͕໰୊

Slide 16

Slide 16 text

ঢ়گʹΑͬͯ࢖͍ํ͕มΘΔจ๏ ܗ༰ࢺʢ۟ʣɾಈࢺͷ෼ࢺ: iterable, running, finished ࡾਓশͷಈࢺ΍ॿಈࢺɾٙ໰จ: contains, shouldRun, isFooValid લஔࢺΛ൐͏෭ࢺ۟: toInt, fromString, onClicked ϓϩμΫτͰ࢖༻๏Λ౷Ұ͢΂͖

Slide 17

Slide 17 text

ঢ়گʹΑͬͯ࢖͍ํ͕มΘΔจ๏ ܗ༰ࢺʢ۟ʣɾಈࢺͷ෼ࢺ: iterable, running, finished ࡾਓশͷಈࢺ΍ॿಈࢺɾٙ໰จ: contains, shouldRun, isFooValid લஔࢺΛ൐͏෭ࢺ۟: toInt, fromString, onClicked ϓϩμΫτͰ࢖༻๏Λ౷Ұ͢΂͖

Slide 18

Slide 18 text

ܗ༰ࢺɾ෼ࢺͷ࢖ΘΕํ ঢ়ଶ΍ੑ࣭Λࣔ͢஋ɾܕΛࣔ͢ - Iterable (Java/Kotlin), State.RUNNING ੑ࣭Λຬͨ͢ΠϯελϯεΛฦ͢ - sorted(iterable) (Python), Array.shuffled() (Swift) ੑ࣭Λຬ͍ͨͯ͠Δ͔Λਅِ஋Ͱࣔ͢ - val running: Boolean, fun sorted(): Boolean

Slide 19

Slide 19 text

จ๏ͷ࢖͍ํͷܾΊํ ඪ४ϥΠϒϥϦ, API ͷϧʔϧɾσϑΝΫτελϯμʔυʹै͏ - ݴޠ಺Ͱ࢖͍ํ͕ఆ·ͬͯͳ͍͜ͱ΋ʢಛʹྺ࢙ͷ͋Δݴޠʣ ϓϩμΫτͰίʔσΟϯάن໿ΛఆΊΔ

Slide 20

Slide 20 text

ࠓճͷϨϏϡʔίϝϯτྫ val ordered: Boolean get() { ... } fun reversed(): FooList { ... } fun mutating(): MutableFooList { ... } > ໊લΛ࣍ͷΑ͏ʹมߋ͍ͯͩ͘͠͞: ordered -> isSorted, reversed -> toReversedList, mutating -> toMutableList > Kotlin Ͱ͸ɺ৽͍͠ΠϯελϯεΛฦ͢৔߹ʹ໋ྩจ͔෭ࢺΛ ࢖͍ɺਅِ஋Λࣔ͢৔߹ʹٙ໰จͳͲΛ࢖͍·͢ɻ

Slide 21

Slide 21 text

ຊॻͷΧόʔൣғ จ๏ɾ໊લͷࣔ͢಺༰ɾޠͷબ୒ - ޠͷબ୒͸ଟ͘ͷղઆ͕͋Δ - จ๏ͱ໊લͷࣔ͢಺༰ ʮ௕͞ʯ͸Χόʔ֎ - ٞ࿦Λ۩ମԽ͠΍͍͢ (ྫ: User ͱ͍͏઀಄ࣙΛೖΕΔ͔) - ݴޠɾϓϥοτϑΥʔϜʹେ͖͘ґଘ͢Δ

Slide 22

Slide 22 text

τϐοΫ - 2ষ: ໋໊ - 3ষ: ίϝϯτ - 5ষ: ؔ਺ - 6ষ: ґଘؔ܎

Slide 23

Slide 23 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ fun getDescription(keyword: String): String ϨϏϡʔΞ: ޿͘࢖ΘΕΔؔ਺ͳͷͰίϝϯτΛॻ͍ͯԼ͍͞ɻ ྫ͑͹ɺΤοδέʔεͱ͍ͬͨ஫ҙ఺͕͋Δͱࢥ͍·͢ɻ ϨϏϡʔΠ: ॻ͖·ͨ͠ɻ /** * Returns an empty string when the keyword is not registered. */ fun getDescription(keyword: String): String

Slide 24

Slide 24 text

ຊ୊ͷલʹ...ίϝϯτͷΑ͋͘Δޡղ ޡղ: ίϝϯτʹ͸ʮԿʯͰ͸ͳ͘ʮͳͥʯΛॻ͘ ίϝϯτΛॻ͘໨త͸ଟ༷ - ʮͳͥʯͱ͸ݶΒͳ͍ - ίʔυͷཁ໿ʢԿΛ͢Δ͔ʣ΋༗༻

Slide 25

Slide 25 text

ίϝϯτͷ෼ྨ υΩϡϝϯςʔγϣϯ: /** ... */ ౳ - ίʔυΛಡ·ͣʹ ཧղͤ͞Δίϝϯτ - ؔ਺΍Ϋϥεͷઆ໌ ඇܗࣜతͳίϝϯτ: ΠϯϥΠϯίϝϯτ // ... ౳ - ίʔυΛಡΈਐΊΔ ͜ͱΛॿ͚Δίϝϯτ - ཧ༝ɾഎܠɾ஫ҙ఺...ͦͷଞԿͰ΋

Slide 26

Slide 26 text

ϨϏϡʔ࣌ͷ஫ҙ఺ ίϝϯτͷछྨͰݟํΛม͑Δ υΩϡϝϯςʔγϣϯ - ίʔυΛಡ·ͳͯ͘΋ཧղͰ͖Δ͔͕ॏཁ - ܗࣜ΍Ұ؏ੑ΋؍఺ ඇܗࣜతͳίϝϯτ - ʮߟ͑ࠐΉ͜ͱʯ΍ʮؒҧ͍ʹΑΔมߋʯΛ๷͛Δ͔͕ॏཁ

Slide 27

Slide 27 text

ࠓճͷ໰୊఺ /** * Returns an empty string when the keyword is not registered. */ fun getDescription(keyword: String): String υΩϡϝϯςʔγϣϯͷ໾ׂΛՌ͍ͨͯ͠ͳ͍ - ʮ௨ৗʯԿΛ͢Δ͔͸Θ͔Βͳ͍ - Τοδέʔεʹ͍ͭͯ͸ॻ͔Ε͍ͯΔ

Slide 28

Slide 28 text

ຊॻͷ׆༻๏ 1/2 3-2-1 υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ - 6 ͭͷΞϯνύλʔϯΛ঺հ

Slide 29

Slide 29 text

6 ͭͷΞϯνύλʔϯ 1. ࣗಈੜ੒͞ΕͨυΩϡϝϯςʔγϣϯΛ์ஔ͢Δ 2. એݴͱಉ͡಺༰Λ܁Γฦ͢ 3. ίʔυΛࣗવݴޠʹ຋༁͢Δ 4. ֓ཁΛॻ͔ͳ͍ 5. ࣮૷ͷৄࡉʹݴٴ͢Δ 6. ίʔυΛ࢖͏ଆʹݴٴ͢Δ

Slide 30

Slide 30 text

ຊॻͷ׆༻๏ 2/2 3-2-3 υΩϡϝϯςʔγϣϯͷཁ໿ ʮཁ໿ʯͷॻ͖ํΛ2ͭͷςΫχοΫͱͱ΋ʹ঺հ - ςΫχοΫ1: ॏཁͳίʔυΛݟ͚ͭΔ - ςΫχοΫ2: ίʔυͷڞ௨఺Λݟ͚ͭΔ

Slide 31

Slide 31 text

ࠓճͷϨϏϡʔίϝϯτྫ > ࣍ͷΑ͏ͳυΩϡϝϯςʔγϣϯΛॻ͍͍ͯͩ͘͞ /** * Returns "description" of [keyword] if it's registered by * [registerDescription]. * * This returns an empty string when the keyword is not registered. */ > υΩϡϝϯςʔγϣϯͷ࠷ॳͷҰจͰɺͦͷؔ਺͕ԿΛ͢Δ͔ ΛҰݴͰઆ໌͢Δඞཁ͕͋Γ·͢ɻ

Slide 32

Slide 32 text

ຊॻͷΧόʔൣғ υΩϡϝϯςʔγϣϯɾඇܗࣜతͳίϝϯτͷ྆ํ υΩϡϝϯςʔγϣϯͷൺॏେ - υΩϡϝϯςʔγϣϯͷղઆ͕গͳ͍ - υΩϡϝϯςʔγϣϯͱͯ͠ԿΛॻ΂͖͔͕Θ͔Γʹ͍͘ (ඇܗࣜతͳίϝϯτʹ͸ϨϏϡʔ࣌ͷٙ໰͕ͦͷ··࢖͑Δ)

Slide 33

Slide 33 text

τϐοΫ - 2ষ: ໋໊ - 3ষ: ίϝϯτ - 5ষ: ؔ਺ - 6ষ: ґଘؔ܎

Slide 34

Slide 34 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 1/2 fun getOnlineFollowers(userId: UserId): FollowerModelListResult { return FollowerModelListResult.Followers( if (!userId.isAlias) { followGraphRepository.getFollowers(userId) } else { val originalId = accountRepository.resolveAlias(userId) ?: return FollowerModelListResult.UnknownId followGraphRepository.getFollowers(originalId) }.filter { onlineStatusRepository.isOnline(it.userId) } .toSet() )}

Slide 35

Slide 35 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 2/2 ϨϏϡʔΞ: getOnlineFollowers ͷॲཧ͕௥͍ʹ͍͘ͷͰɺϦϑΝ ΫλϦϯά͍ͯͩ͘͠͞ɻ ϨϏϡʔΠ: return FollowerModelListResult.Followers ͕࠷ॳ ʹ͋ΔͷͰɺ͜ͷؔ਺͕ԿΛ͢Δ͔͸໌֬ͩͱࢥ͍·͢ɻ ϨϏϡʔΠ: ·ͨɺҰͭͷࣜͱͯ͠ॻ͘͜ͱͰɺ FollowerModelListResult ͷऔಘҎ֎ʹ͸Կ΋͍ͯ͠ͳ͍͜ͱ΋ ໌֬ʹͳ͍ͬͯ·͢ɻ

Slide 36

Slide 36 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 1/2 (࠶ܝ) fun getOnlineFollowers(userId: UserId): FollowerModelListResult { return FollowerModelListResult.Followers( if (!userId.isAlias) { followGraphRepository.getFollowers(userId) } else { val originalId = accountRepository.toOriginalId(userId) ?: return FollowerModelListResult.UnknownId followGraphRepository.getFollowers(originalId) }.filter { onlineStatusRepository.isOnline(it.userId) } .toSet() )}

Slide 37

Slide 37 text

ؔ਺ʹ͓͚Δ໰୊ ؒҧͬͨ࢖͍ํΛҾ͖ى͜͠΍͍͢ - ܕ҆શੑɾؔ਺ͷ੹೚ɾ໊લɾίϝϯτɾঢ়ଶɾґଘؔ܎... ؔ਺Λ࢖͏ଆͷίʔυ͕ಡΈʹ͍͘ - ؔ਺ͷ੹೚ɾ໊લɾґଘؔ܎ ؔ਺ͷத਎͕ಡΈʹ͍͘ - ؔ਺ͷྲྀΕɾґଘؔ܎

Slide 38

Slide 38 text

ຊॻͷ׆༻๏ 5-2 ؔ਺ͷྲྀΕ ؔ਺͸ࣼΊಡΈͰཧղՄೳͰ͋Δ΂͖ - ৄࡉ෦෼ΛಡΈඈ͹ͤΔ - ॏཁͳίʔυ͕Ͳ͔͕͜Θ͔Δ - ৚݅෼ذΛ໢ཏ͠ͳͯ͘΋Α͍

Slide 39

Slide 39 text

ࠓճͷ໰୊఺ ؔ਺ͷྲྀΕ͕Θ͔Γʹ͍͘ - ৄࡉ෦෼ΛಡΈඈ͹ͤͳ͍ -> 5-2-1 ఆٛࢦ޲ϓϩάϥϛϯά - ॏཁͳίʔυ͕Ͳ͔͜Θ͔Γʹ͍͘ -> 5-2-2 ૣظϦλʔϯ - ৚݅෼ذΛ໢ཏ͠ͳ͚Ε͹ͳΒͳ͍ -> 5-2-3 ର৅ʹΑΔ෼ׂ

Slide 40

Slide 40 text

5-2-1 ఆٛࢦ޲ϓϩάϥϛϯά ໊લͷ͍ͭͨม਺ɾؔ਺Λଟ༻͢ΔϓϩάϥϛϯάελΠϧ ωετɾϦςϥϧɾνΣʔϯΛஔ͖׵͑Δ - આ໌ม਺ɾཁ໿ม਺ΛΑΓҰൠԽͨ֓͠೦ - ϥϜμ΍ແ໊ΦϒδΣΫτͱ͍ͬͨϦςϥϧ΋ର৅ ίʔυͷࠨଆΛݟΕ͹ɺԿΛ͍ͯ͠Δͷ͔͕෼͔ΔΑ͏ʹ͢Δ

Slide 41

Slide 41 text

5-2-2 ૣظϦλʔϯ ϋοϐʔύεͱΞϯϋοϐʔύεΛ໌֬ʹ෼͚Δ - ؔ਺ͷ࠷ॳ͕ΞϯϋοϐʔύεͷॲཧʹͳΔ - ࢒Γͷ෦෼͕ϋοϐʔύεͷॲཧʹͳΔ ૣظϦλʔϯͷ෦෼͸ಡΈඈ͹ͯ͠΋Α͍ܗʹ͢Δ

Slide 42

Slide 42 text

5-2-3 ର৅ʹΑΔ෼ׂ ৚݅Ͱ͸ͳ͘ɺૢ࡞ର৅ʢϨγʔό౳ʣͰίʔυΛ෼ׂ͢Δ ৚݅෼ذͷϘσΟͷείʔϓΛখ͘͢͞Δ - ৚݅෼ذͷ਺͕૿͑Δ͜ͱࣗମ͸໰୊ͳ͍ - ໢ཏੑͷ୲อ (௚࿨ܕ΍ϢχοτςετʹΑΔอূ) ͕ඞཁ ৚݅ຖʹίʔυΛ௥Θͳͯ͘΋ɺಈ࡞Λ೺ѲͰ͖ΔΑ͏ʹ͢Δ

Slide 43

Slide 43 text

ࠓճͷϨϏϡʔίϝϯτྫ 1/4 > ҎԼͷิॿؔ਺Λఆ͍ٛͯͩ͘͠͞ɻ private fun resolveAlias(userId: UserId): UserId? = if (userId.isAlias) accountRepository.toOriginalId(userId) else userId > ͜ͷؔ਺Λ༻͍ͯɺgetOnlineFollowers ΛҎԼͷΑ͏ʹॻ͖׵ ͍͑ͯͩ͘͞ɻ

Slide 44

Slide 44 text

ࠓճͷϨϏϡʔίϝϯτྫ 2/4 fun getOnlineFollowers(userId: UserId): FollowerModelListResult { val originalId = resolveAlias(userId) ?: return FollowerModelListResult.UnknownId val onlineFollowers = followGraphRepository.getFollowers(originalId) .filter { onlineStatusRepository.isOnline(it.userId) } .toSet() return FollowerModelListResult.Followers(onlineFollowers) }

Slide 45

Slide 45 text

ࠓճͷϨϏϡʔίϝϯτྫ 3/4 > ฦ৴͍͍ͯͨͩͨ͠௨Γ Result ͷฦ٫͕͜ͷؔ਺ͷ࠷΋ॏཁͳ ఺Ͱ͋Δ͜ͱ͸͔֬Ͱ͢ɻ > ͔͠͠ɺͦΕࣗମ͸ؔ਺ͷγάωνϟ͔Β΋ಡΈऔΕ·͢ɻ > ؔ਺ΛಡΉࡍ͸ɺͦΕΑΓ΋Ұஈৄࡉͳ෦෼ͰʮԿΛ͍ͯ͠Δ ͔ʯ͕ཧղͰ͖Δඞཁ͕͋Γ·͢ɻ > ͜ͷؔ਺ͷྲྀΕ͸ɺҎԼͷΑ͏ʹͳ͍ͬͯ·͢ɻ

Slide 46

Slide 46 text

ࠓճͷϨϏϡʔίϝϯτྫ 4/4 > 1. ඞཁͳΒ ID ͷΤΠϦΞεΛॲཧ͢Δ > 2. ϑΥϩΞʔΛऔಘ͠ɺΦϯϥΠϯͷ৚݅ͰϑΟϧλ͢Δ > 3. ϑΟϧλͷ݁ՌΛ Result ͱͯ͠ฦ͢ > ্هͷίʔυͰ͸ɺ͜ͷྲྀΕ͕໌֬ʹͳΔΑ͏ʹ͠·ͨ͠ɻ

Slide 47

Slide 47 text

τϐοΫ - 2ষ: ໋໊ - 3ষ: ίϝϯτ - 5ষ: ؔ਺ - 6ষ: ґଘؔ܎

Slide 48

Slide 48 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 1/3 // // // class UserNameProvider { fun getName(userId: String): String = ... } class AccountScreenPresenter( val userNameProvider: UserNameProvider, ... ) { ... }

Slide 49

Slide 49 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 2/3 interface StringProvider { fun getValue(parameter: String): String } class UserNameProvider : StringProvider { override fun getValue(parameter: String): String = ... } class AccountScreenPresenter( val userNameProvider: StringProvider, ... ) { ... }

Slide 50

Slide 50 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 3/3 ϨϏϡʔΞ: StringProvider ͸ෆཁͳͷͰ࡟আ͍ͯͩ͘͠͞ɻ ϨϏϡʔΠ: ґଘؔ܎͸ऑ͘͢Δͷ͕޷·͍͠ͱݴΘΕ͍ͯ·͢ɻ ϨϏϡʔΠ: StringProvider Λఆٛ͢Δ͜ͱͰɺ UserNameProvider ʹର͢ΔґଘΛऑΊΔ͜ͱ͕Ͱ͖ΔͷͰɺ͜Ε ͸࢒͍ͨ͠Ͱ͢ɻ ϨϏϡʔΠ: ·ͨɺґଘੑͷٯసͷ๏ଇʹ΋Ԋͬͨઃܭʹͳ͍ͬͯ Δͱࢥ͍·͢ɻ

Slide 51

Slide 51 text

ͲΜͳϨϏϡʔίϝϯτΛॻ͘ʁ 2/3 (࠶ܝ) interface StringProvider { fun getValue(parameter: String): String } class UserNameProvider : StringProvider { override fun getValue(parameter: String): String = ... } class AccountScreenPresenter( val userNameProvider: StringProvider, ... ) { ... }

Slide 52

Slide 52 text

ґଘؔ܎ͷ஫ҙ఺ ґଘͷڧ͞ʢ݁߹౓ʣҎ֎ͷੑ࣭ʹ΋஫໨ ண໨͢Δ΂͖ੑ࣭Λ෼ྨ͢Δ - 6-2 ґଘͷڧ͞ʢ݁߹౓ʣ - 6-3 ґଘͷํ޲ - 6-4 ґଘͷॏෳ - 6-5 ґଘͷ໌ࣔੑ

Slide 53

Slide 53 text

6-5 ґଘͷ໌ࣔੑ - ໌ࣔతͳґଘ: Ϋϥεఆ͔ٛΒ ಡΈऔΕΔ ґଘؔ܎ - ҉໧తͳґଘ: ΫϥεఆٛͰ͸ ಡΈऔΕͳ͍ ґଘؔ܎ ڧ͞ʢ݁߹౓ʣͱ໌ࣔੑ͸ผ - ऑ͍ && ໌ࣔతͳґଘؔ܎͕޷·͍͠ - ʮऑͨͭ͘͠΋Γ͕ɺ҉໧తʹͳ͚ͬͨͩʯΛආ͚Δ

Slide 54

Slide 54 text

ຊॻͷ׆༻๏ 6-5-1 Ξϯνύλʔϯ1: ա౓ͳந৅Խ ա౓ͳந৅ԽΛආ͚Δ΂͖ཧ༝ΛҾ༻ - ಈ࡞ͷྲྀΕ͕௥͍ʹ͘͘ͳΔ - ݫີੑ͕ࣦΘΕΔ

Slide 55

Slide 55 text

ࠓճͷϨϏϡʔίϝϯτྫ > StringProvider Λఆٛͯ͠΋ɺґଘͷڧ͞͸มΘΓ·ͤΜɻ > σʔλ݁߹ͱ͍͏ɺجຊతͳσʔλΛड͚౉͢͠Δڧ͞Ͱ͢ɻ > ҰํͰɺStringProvider ΛҾ਺ͷܕʹ͢Δ͜ͱͰɺ > UserNameProvider ΁ͷґଘ͕҉໧తʹͳ͍ͬͯ·͢ɻ > UserNameProvider ΠϯελϯεΛظ଴͍ͯ͠Δͷʹɺ > ࣮ࡍʹ͸ଞͷࢠΫϥεͷΠϯελϯε͕౉ͤͯ͠·͍·͢ɻ > ...

Slide 56

Slide 56 text

τϐοΫ - 2ষ: ໋໊ - 3ষ: ίϝϯτ - 5ষ: ؔ਺ - 6ষ: ґଘؔ܎

Slide 57

Slide 57 text

ิ଍ 1/2 ॻ੶ʹ΋ॻ͍͍ͯͳ͍ ϨϏϡʔίϝϯτͷςΫχοΫ

Slide 58

Slide 58 text

ϨϏϡʔίϝϯτͷςΫχοΫ ઌʹʮԿΛ͢Δ͔ʯΛॻ͖ɺޙʹʮཧ༝ʯΛॻ͘ ޙஔ because ! : B ͸ C ͱॻ͘΄͏͕ྑ͍ɻͦͷཧ༝͸ A ͩɻ ! : A ͳͷͰ B ͸ C ͱॻ͘΄͏͕ྑ͍ɻ

Slide 59

Slide 59 text

ʮԿΛ͢Δ͔ʯΛઌʹॻ͍ͨྫ > ҎԼͷΑ͏ʹυΩϡϝϯςʔγϣϯΛॻ͍͍ͯͩ͘͞ɻ /** ... */ > ͜ͷυΩϡϝϯςʔγϣϯͰɺ...ͱ͍͏৘ใΛิ଍͠·͢ɻ > ͜͏͢Δ͜ͱͰɺ...ͱ͍͏ϛεΛ๷͙͜ͱ͕Ͱ͖·͢ɻ ίϝϯτͷझࢫΛ࠷ॳʹཧղ͠ɺͦͷޙཧ༝ͷݕূ͕Ͱ͖Δ

Slide 60

Slide 60 text

ʮཧ༝ʯΛઌʹॻ͍ͨྫ > ࠓͷঢ়ଶͰ͸ ...ͱ͍͏ϛε͕ى͖Δ͔΋͠Ε·ͤΜɻ > ͦͷͨΊɺ...ͱ͍͏৘ใΛิ଍͢Δඞཁ͕͋Γ·͢ɻ > ҎԼͷΑ͏ʹυΩϡϝϯςʔγϣϯΛॻ͍͍ͯͩ͘͞ɻ /** ... */ ࠷ޙ·ͰಡΜͰझࢫΛཧղ͔ͯ͠Βɺཧ༝ͷ֬ೝΛ࠶౓ߦ͏

Slide 61

Slide 61 text

ิ଍ 2/2 ʮCode Readabilityʯͷ ϓϨθϯςʔγϣϯʹ͍ͭͯ

Slide 62

Slide 62 text

ʮCode ReadabilityʯͷϓϨθϯςʔγϣϯʹ͍ͭͯ 1. (࠷େ) 8࣌ؒͷϓϨθϯςʔγϣϯΛ࣮ࢪՄೳ - ͓ؾܰʹ Twitter: @mntsh ʹ͝࿈བྷ͍ͩ͘͞ 2. ۙ೔Ξοϓσʔτ༧ఆ - ࠓ݄தʹެ։͍ͨ͠...

Slide 63

Slide 63 text

·ͱΊ

Slide 64

Slide 64 text

·ͱΊ ϨϏϡʔʹ͓͍ͯ ໰୊఺ͷݴޠԽ͸೉͍͠ - ͍͖ͳΓݴޠԽ͠Α͏ͱͤͣɺ·ͣ͸෼ྨ͢Δ ʮಡΈ΍͍͢ίʔυͷΨΠυϥΠϯʯ͕׆༻Ͱ͖Δ͔΋ - ෼ྨ΍ྨࣅࣄྫͷ֬ೝ - ղܾख๏΍ͦͷཧ༝ͷ֬ೝ