Slide 1

Slide 1 text

/** ಡΈ΍͍͢ίʔυͷॻ͖ํ ୈ 3 ճ */ // ίϝϯτ

Slide 2

Slide 2 text

લճͷ͓͞Β͍: ໋໊ ໊લ͸ਖ਼͔֬ͭઆ໌తʹ - ໊લͷࣔ͢಺༰: ʮ͍ͭɾͩΕʯΑΓʮԿʯ - จ๏: ॏཁͳ୯ޠͷҐஔ - ୯ޠ: ҙຯ͕ڱ͍ɾলུ͠ͳ͍ɾߠఆత

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

ίϝϯτ ίʔυதʹॻ͔ΕΔ஫ऍɾઆ໌ - ௨ৗɺίϯύΠϥ΍ΠϯλϓϦλ͔Β͸ແࢹ͞ΕΔ /** * Explanation of `fooFunction`... */ fun fooFunction(parameter: Parameter /* note of the parameter */) { barFunction() // Explanation of why `barFunction` is called /* A comment with multiple lines. */ ίϝϯτ > ಋೖ

Slide 5

Slide 5 text

ίϝϯτͷ༗༻ੑ - ίʔυΛཧղ͠΍͘͢͢Δ - ϛεΛ๷͙ - ϦϑΝΫλϦϯά͠΍͘͢͢Δ े෼ʹಡΈ΍͍͢ͳΒ͹ίϝϯτ͸ෆཁ (ίʔσΟϯάن໿ʹΑΔ) ίϝϯτ > ಋೖ

Slide 6

Slide 6 text

ίϝϯτͷ༗༻ੑ - ίʔυΛཧղ͠΍͘͢͢Δ - ϛεΛ๷͙ - ϦϑΝΫλϦϯά͠΍͘͢͢Δ े෼ʹಡΈ΍͍͢ͳΒ͹ίϝϯτ͸ෆཁ (ίʔσΟϯάن໿ʹΑΔ) ίϝϯτ > ಋೖ

Slide 7

Slide 7 text

ίϝϯτʹΑΔϦϑΝΫλϦϯά: ྫ /** * Adds a new pair of keyword and the definition to this dictionary, * can be referenced by [getDefinition(String)]. * * If the keyword is already registered, this registration fails. * Then, this returns a boolean representing whether the registration * succeeded. */ fun add(newData: Pair): Boolean ಈ࡞ͷ୯७͞ͷׂʹ௕͍ίϝϯτ͕ඞཁ ίϝϯτ > ಋೖ

Slide 8

Slide 8 text

ίϝϯτʹΑΔϦϑΝΫλϦϯά: ܭը ͳͥίϝϯτ͕௕͘ͳͬͨͷ͔Λߟ͑Δ վળҊ - ؔ਺໊ͷมߋ - ύϥϝʔλͷ෼ׂ - Τϥʔέʔεͷ୯७Խ - ෆཁͳ໭Γ஋ͷ࡟আ ίϝϯτ > ಋೖ

Slide 9

Slide 9 text

ίϝϯτʹΑΔϦϑΝΫλϦϯά: ݁Ռ /** * Adds or overwrites a definition of a given [keyword]. * The registered definition is obtained by [getDefinition(String)]. */ fun registerDefinition(keyword: String, definitionText: String) ಈ࡞ͷ୯७͞ʹݟ߹ͬͨίϝϯτΛॻ͘ ίϝϯτ > ಋೖ

Slide 10

Slide 10 text

୅දతͳίϝϯτͷछྨ - υΩϡϝϯςʔγϣϯ: Ϋϥεɾؔ਺౳ʹॻ͘ܗࣜతͳίϝϯτ /** * A list of pairs of a string keyword and the explanation text. * * ... (details of usage, limitations, etc.)... */ class Dictionary { ... } ίϝϯτ > ಋೖ

Slide 11

Slide 11 text

୅දతͳίϝϯτͷछྨ - υΩϡϝϯςʔγϣϯ: Ϋϥεɾؔ਺౳ʹॻ͘ܗࣜతͳίϝϯτ - ඇܗࣜతͳίϝϯτ: ίʔυதͷ༷ʑͳ৔ॴʹॻ͔ΕΔίϝϯτ // Call `toList` here to create a copied list explicitly. val listSnapshot = list.toList() ίϝϯτ > ಋೖ

Slide 12

Slide 12 text

୅දతͳίϝϯτͷछྨ - υΩϡϝϯςʔγϣϯ: Ϋϥεɾؔ਺౳ʹॻ͘ܗࣜతͳίϝϯτ - ඇܗࣜతͳίϝϯτ: ίʔυதͷ༷ʑͳ৔ॴʹॻ͔ΕΔίϝϯτ - To do ίϝϯτ: // TODO: , // FIXME: ίϝϯτ > ಋೖ

Slide 13

Slide 13 text

୅දతͳίϝϯτͷछྨ - υΩϡϝϯςʔγϣϯ: Ϋϥεɾؔ਺౳ʹॻ͘ܗࣜతͳίϝϯτ - ඇܗࣜతͳίϝϯτ: ίʔυதͷ༷ʑͳ৔ॴʹॻ͔ΕΔίϝϯτ - To do ίϝϯτ: // TODO: , // FIXME: - IDEɾίϯύΠϥɾίʔυੜ੒༻ͷίϝϯτ: // $COVERAGE-IGNORE$ ίϝϯτ > ಋೖ

Slide 14

Slide 14 text

୅දతͳίϝϯτͷछྨ - υΩϡϝϯςʔγϣϯ: Ϋϥεɾؔ਺౳ʹॻ͘ܗࣜతͳίϝϯτ - ඇܗࣜతͳίϝϯτ: ίʔυதͷ༷ʑͳ৔ॴʹॻ͔ΕΔίϝϯτ - To do ίϝϯτ: // TODO: , // FIXME: - IDEɾίϯύΠϥɾίʔυੜ੒༻ͷίϝϯτ: // $COVERAGE-IGNORE$ ίϝϯτ > ಋೖ

Slide 15

Slide 15 text

υΩϡϝϯςʔγϣϯͱඇܗࣜతͳίϝϯτͷ໾ׂ υΩϡϝϯςʔγϣϯ - ίʔυΛ ಡ·ͳͯ͘΋ ཧղͰ͖ΔΑ͏ʹ͢Δ - ʮԿͰ͋Δ͔ɾԿΛ͢Δ͔ʯΛઆ໌͢Δ ඇܗࣜతͳίϝϯτ - ίʔυΛ ಡΉ࣌ʹ ཧղΛॿ͚Δ - ֓ཁɾཧ༝ɾഎܠɾམͱ݀͠Λઆ໌͢Δ ίϝϯτ > ಋೖ

Slide 16

Slide 16 text

ࠓճͷ಺༰ - υΩϡϝϯςʔγϣϯ - ඇܗࣜతͳίϝϯτ ίϝϯτ > ಋೖ

Slide 17

Slide 17 text

ࠓճͷ಺༰ - υΩϡϝϯςʔγϣϯ - ඇܗࣜతͳίϝϯτ ίϝϯτ > υΩϡϝϯςʔγϣϯ

Slide 18

Slide 18 text

υΩϡϝϯςʔγϣϯͷର৅ - Ϋϥε, ΠϯλʔϑΣΠε, ྻڍܕ, ߏ଄ମ, ϓϩτίϧ, τϨΠτ... - ม਺, ϓϩύςΟ, ϑΟʔϧυ, ύϥϝʔλ, ఆ਺... - ؔ਺, ϝιου, खଓ͖, αϒϧʔνϯ... - είʔϓ, ύοέʔδ, Ϟδϡʔϧ, ໊લۭؒ... ίϝϯτ > υΩϡϝϯςʔγϣϯ

Slide 19

Slide 19 text

υΩϡϝϯςʔγϣϯͷϑΥʔϚοτ ίϝϯτͷ։࢝෦෼ - `/**`: Kotlin, Java, Swift and Objective-C - `///`: Swift and Objective-C - `/*!`: Objective-C ֤ υΩϡϝϯςʔγϣϯδΣωϨʔλͷϑΥʔϚοτ Λࢀর ྫ: KDoc, Javadoc, Swift Markup, HeaderDoc, Doxygen ίϝϯτ > υΩϡϝϯςʔγϣϯ

Slide 20

Slide 20 text

υΩϡϝϯςʔγϣϯʹॻ͘಺༰ ·ͣ͸Ξϯνύλʔϯ͔Β ίϝϯτ > υΩϡϝϯςʔγϣϯ

Slide 21

Slide 21 text

Ξϯνύλʔϯ: ࣗಈੜ੒͞ΕͨίϝϯτΛ์ஔ /** * @param keyword * @return */ fun getDescription(keyword: String): String ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 22

Slide 22 text

Ξϯνύλʔϯ: ఆ໊ٛͱಉ͡ /** * Gets the description for a keyword. */ fun getDescription(keyword: String): String ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 23

Slide 23 text

Ξϯνύλʔϯ: ίʔυΛ຋༁͚ͨͩ͠ /** * Calls [doA] if `conditionA` is satisfied. * Otherwise, calls [doB] and if ... */ fun getDescription(keyword: String): String { if (conditionA) { doA() } else { doB() if (...) {...} } ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 24

Slide 24 text

Ξϯνύλʔϯ: ϓϥΠϕʔτϝϯόΛ࢖ͬͯઆ໌ /** * Returns a string stored in a private map [dictionary]. */ fun getDescription(keyword: String): String ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 25

Slide 25 text

Ξϯνύλʔϯ: ཁ໿͕ͳ͍ /** * Throws an exception if the given `keyword` is empty. */ fun getDescription(keyword: String): String ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 26

Slide 26 text

Ξϯνύλʔϯ: ݺͼग़͠ଆʹݴٴ /** * ... * This is called by class [UserProfilePresenter]. */ fun getDescription(keyword: String): String ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 27

Slide 27 text

Ξϯνύλʔϯ͔Βͷڭ܇ υΩϡϝϯςʔγϣϯ͸ඞཁͳͱ͖ʹ͚ͩॻ͘ - Ϋϥε໊ɾؔ਺໊ɾม਺໊Ͱे෼ʹઆ໌Ͱ͖Δ৔߹͸লུ ʮͦΕ͕ԿͰ͋Δ͔ɾԿΛ͢Δ͔ʯΛཁ໿Ͱઆ໌͢Δ - ݺͼग़͠ଆʹݴٴͤͣʹઆ໌ - ࣮૷ͷৄࡉʹ৮Εͣʹઆ໌ ίϝϯτ > υΩϡϝϯςʔγϣϯ > Ξϯνύλʔϯ

Slide 28

Slide 28 text

υΩϡϝϯςʔγϣϯʹॻ͘಺༰ ཁ໿ (ඞਢ) ʮԿͰ͋Δ͔ɾԿΛ͢Δ͔ʯΛઆ໌͢Δ 1 จɾ 1 ϑϨʔζ ৄࡉ (Φϓγϣφϧ) ࢖༻๏΍੍໿౳Λઆ໌͢Δ௥Ճͷจ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ֓ཁ

Slide 29

Slide 29 text

υΩϡϝϯςʔγϣϯʹॻ͘಺༰ ཁ໿ (ඞਢ) ʮԿͰ͋Δ͔ɾԿΛ͢Δ͔ʯΛઆ໌͢Δ 1 จɾ 1 ϑϨʔζ ৄࡉ (Φϓγϣφϧ) ࢖༻๏΍੍໿౳Λઆ໌͢Δ௥Ճͷจ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 30

Slide 30 text

ཁ໿ͷॻ͖ํ ςΫχοΫ - ॏཁͳίʔυΛݟ͚ͭΔ - ίʔυͷڞ௨఺Λݟ͚ͭΔ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 31

Slide 31 text

ཁ໿ͷॻ͖ํ: ॏཁͳίʔυ 1/2 ίʔυͰ ࠷΋ॏཁͳ ߦɾϒϩοΫɾཁૉΛݟ͚ͭΔ if (!user.isValid) return val rawProfileImage = getProfileImage(user.id, ...) val roundProfileImage = applyRoundFilter(rawProfileImage, ...) profileView.setImage(roundProfileImage) ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 32

Slide 32 text

ཁ໿ͷॻ͖ํ: ॏཁͳίʔυ 2/2 ࠷΋ॏཁͳ఺Λॻ͖ɺ ิ଍͢Δ /** * Shows a roundly cut profile image of a given [user]. * ... */ ... profileView.setImage(roundProfileImage) ཁ໿͸໋໊ͷώϯτʹ΋ͳΔ ! ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 33

Slide 33 text

ཁ໿ͷॻ͖ํ: ίʔυͷڞ௨఺ ίʔυͷڞ௨఺Λ୳͠ɺ ந৅Խ͢Δ /** * Updates message layout with a newly received message data. */ fun ...(receivedMessageData: MessageData) { messageView.text = receivedMessageData.contentText senderNameView.text = receivedMessageData.senderName timestampView.text = receivedMessageData.sentTimeText } ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 34

Slide 34 text

ཁ໿ͷϑΥʔϚοτ ඪ४ϥΠϒϥϦɾAPI ͷॻ͖ํʹ४ͣΔ ྫ: Kotlin, Java, Swift, Objective-C - Ϋϥε, ม਺: ໊ࢺ۟ ྫ: "A generic ordered collection of elements."4 - ؔ਺: ࡾਓশ୯਺ͷ ಈࢺ Ͱ࢝·ΔϑϨʔζ ྫ: "Adds a new element at the end of the array."5 5 https://developer.apple.com/documentation/swift/array/3126937-append 4 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/#list ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 35

Slide 35 text

೔ຊޠͷཁ໿ͷϑΥʔϚοτ جຊ͸ӳޠͱಉ͡ - Ϋϥε, ม਺: ओޠΛলུͨ͠ ໊ࢺ ͰऴΘΔจɾମݴࢭΊ ྫ: ʮ...ʹม׵͢ΔΞμϓλͰ͢ɻʯɾʮ...ͷঢ়ଶɻʯ - ؔ਺: ओޠΛলུͨ͠ ಈࢺ ͰऴΘΔจ ྫ: ʮ...Λදࣔ͠·͢ɻʯɾʮ...Λฦ͢ɻʯ ܟମɾৗମ ΛϓϩμΫτ಺Ͱ౷Ұ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ཁ໿

Slide 36

Slide 36 text

υΩϡϝϯςʔγϣϯʹॻ͘಺༰ ཁ໿ (ඞਢ) ʮԿͰ͋Δ͔ɾԿΛ͢Δ͔ʯΛઆ໌͢Δ 1 จɾ 1 ϑϨʔζ ৄࡉ (Φϓγϣφϧ) ࢖༻๏΍੍໿౳Λઆ໌͢Δ௥Ճͷจ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 37

Slide 37 text

υΩϡϝϯςʔγϣϯͷʮৄࡉʯͷ಺༰ - ࢓༷ͱ࢖͍ํ - ؔ਺ͷ໭Γ஋ - ੍໿ͱΤϥʔ - ྫ - ... ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 38

Slide 38 text

υΩϡϝϯςʔγϣϯͷʮৄࡉʯͷ಺༰ - ࢓༷ͱ࢖͍ํ - ؔ਺ͷ໭Γ஋ - ੍໿ͱΤϥʔ - ྫ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 39

Slide 39 text

࢓༷ͱ࢖͍ํ యܕతͳ࢖͍ํ ͱ ظ଴͢Δಈ࡞ ʹ͍ͭͯॻ͘ /** * ... * To update view components such as message text and sender name, * give [MessageData] model object to [bindView]. */ class MessageViewPresenter(messageView: View) ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 40

Slide 40 text

υΩϡϝϯςʔγϣϯͷʮৄࡉʯͷ಺༰ - ࢓༷ͱ࢖͍ํ - ؔ਺ͷ໭Γ஋ - ੍໿ͱΤϥʔ - ྫ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 41

Slide 41 text

ؔ਺ͷ໭Γ஋ 1/2 ໰୊: ҎԼͷؔ਺ͷ໭Γ஋͸ԿΛҙຯ͢Δ? fun setSelectedState(isSelected: Boolean): Boolean ղ౴ྫ: isToggled // ঢ়ଶ͕มԽͨ͠Β true wasSelected // ݺͼग़͠લͷঢ়ଶ isSuccessfullyUpdated // ਖ਼ৗʹऴྃ͢Ε͹ true isSelected // Ҿ਺ `isSelected` Λύεεϧʔ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 42

Slide 42 text

ؔ਺ͷ໭Γ஋ 2/2 ؔ਺໊Ͱ͸આ໌͕ෆे෼ͳ৔߹ɺίϝϯτͰิ଍͢Δ - ؔ਺͕ ঢ়ଶΛมߋ͢Δ ৔߹ - ໭Γ஋ʹ ੍໿͕͋Δ ৔߹ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 43

Slide 43 text

ؔ਺ͷ໭Γ஋ 2/2 ؔ਺໊Ͱ͸આ໌͕ෆे෼ͳ৔߹ɺίϝϯτͰิ଍͢Δ - ؔ਺͕ ঢ়ଶΛมߋ͢Δ ৔߹ - ໭Γ஋ʹ ੍໿͕͋Δ ৔߹ /** * ... * ... returns true if it was selected before this function call. */ fun setSelectedState(isSelected: Boolean): Boolean ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 44

Slide 44 text

ؔ਺ͷ໭Γ஋ 2/2 ؔ਺໊Ͱ͸આ໌͕ෆे෼ͳ৔߹ɺίϝϯτͰิ଍͢Δ - ؔ਺͕ ঢ়ଶΛมߋ͢Δ ৔߹ - ໭Γ஋ʹ ੍໿͕͋Δ ৔߹ /** * ... * The profile ID is non-negative value. */ fun getProfileId(): Int ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 45

Slide 45 text

υΩϡϝϯςʔγϣϯͷʮৄࡉʯͷ಺༰ - ࢓༷ͱ࢖͍ํ - ؔ਺ͷ໭Γ஋ - ੍໿ͱΤϥʔ - ྫ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 46

Slide 46 text

੍໿ͱΤϥʔ ࣄલ৚݅ ΍ ҧ൓࣌ͷಈ࡞ ʹ͍ͭͯίϝϯτ͢Δ - ؔ਺ݺͼग़࣌͠ͷ Ϩγʔόͷ৚݅ - ࣮Ҿ਺ͷ੍໿ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 47

Slide 47 text

੍໿ͱΤϥʔ ࣄલ৚݅ ΍ ҧ൓࣌ͷಈ࡞ ʹ͍ͭͯίϝϯτ͢Δ - ؔ਺ݺͼग़࣌͠ͷ Ϩγʔόͷ৚݅ - ࣮Ҿ਺ͷ੍໿ /** * ... [prepare] must be called before calling [play] or [seek], * or this throws [ResourceNotReadyException]. */ class VideoPlayer(videoPath: String) ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 48

Slide 48 text

੍໿ͱΤϥʔ ࣄલ৚݅ ΍ ҧ൓࣌ͷಈ࡞ ʹ͍ͭͯίϝϯτ͢Δ - ؔ਺ݺͼग़࣌͠ͷ Ϩγʔόͷ৚݅ - ࣮Ҿ਺ͷ੍໿ /** * ... * Returns `null` if the given `position` is out of the array range. */ fun valueAt(position: Int): T? ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 49

Slide 49 text

੍໿ͷྫ - ࣮Ҿ਺΍Ϩγʔόͷঢ়ଶ - ΠϯελϯεͷϥΠϑαΠΫϧ - ݺͼग़࣌͠ͷεϨου - ࠶ೖՄೳੑ - ܭࢉ࣌ؒɾϝϞϦ࢖༻ྔ - ֎෦؀ڥͷঢ়ଶʢωοτϫʔΫɾ෺ཧετϨʔδ౳ʣ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 50

Slide 50 text

υΩϡϝϯςʔγϣϯͷʮৄࡉʯͷ಺༰ - ࢓༷ͱ࢖͍ํ - ؔ਺ͷ໭Γ஋ - ੍໿ͱΤϥʔ - ྫ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 51

Slide 51 text

ྫ ྫΛ࢖ͬͯ࢓༷ͷཧղΛॿ͚Δ - ࢖͍ํͷྫ - ࣮Ҿ਺ͱ໭Γ஋ͷྫ /** * ... For example, this returns `listOf("a", "bc", "", "d")` * for argument `"a, bc ,,d"` */ fun splitByComma(string: String): List {... ίϝϯτ > υΩϡϝϯςʔγϣϯ > ৄࡉ

Slide 52

Slide 52 text

υΩϡϝϯςʔγϣϯ: ·ͱΊ ର৅: Ϋϥεɾؔ਺ɾม਺ɾείʔϓ ಺༰: ཁ໿ (ඞਢ)ɾ ৄࡉ(೚ҙ) ஫ҙ఺: - ໊લͰ͸આ໌͕ෆे෼ͳͱ͖ʹॻ͘ - ݺͼग़͠ଆ΍࣮૷ͷৄࡉʹݴٴ͠ͳ͍ ίϝϯτ > υΩϡϝϯςʔγϣϯ > ·ͱΊ

Slide 53

Slide 53 text

ࠓճͷ಺༰ - υΩϡϝϯςʔγϣϯ - ඇܗࣜతͳίϝϯτ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 54

Slide 54 text

ඇܗࣜతͳίϝϯτ: Kotlin ʹ͓͚Δྫ // Function explanation, which won't appear on KDoc fun function(param /* Parameter explanation */: Param) { // Code block summary someMethod(value) // Reason of a statement newId = param.id + 123 /* Reason of constant value */ + ... ... - ಡΉਓͷॿ͚ʹͳΔ͜ͱͳΒԿͰ΋ॻ͘ - ཁ໿͸ඞਢͰ͸ͳ͍ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 55

Slide 55 text

ඇܗࣜతͳίϝϯτΛඞཁͱ͢Δίʔυ - େ͖ͳίʔυ - ෳࡶɾඇ௚ײతͳίʔυ - ϫʔΫΞϥ΢ϯυΛؚΉίʔυ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 56

Slide 56 text

ඇܗࣜతͳίϝϯτΛඞཁͱ͢Δίʔυ - େ͖ͳίʔυ - ෳࡶɾඇ௚ײతͳίʔυ - ϫʔΫΞϥ΢ϯυΛؚΉίʔυ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 57

Slide 57 text

େ͖ͳίʔυʹର͢Δίϝϯτ ίϝϯτͰ ίʔυͷ·ͱ·Γ Λ࡞Γɺ֓ཁΛઆ໌͢Δ ... val messageKey = ... val messageData = messageCache[messageKey] ... if (messageData == null || ...) { // <- When this satisfies? ... // <- Hard to overview code in a nest } ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 58

Slide 58 text

େ͖ͳίʔυʹର͢Δίϝϯτ ίϝϯτͰ ίʔυͷ·ͱ·Γ Λ࡞Γɺ֓ཁΛઆ໌͢Δ // Get message data cache if it's available val messageKey = ... val messageData = messageCache[messageKey] ... // Load message data from DB if there's no cached data. if (messageData == null || ...) { ... } ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 59

Slide 59 text

ඇܗࣜతͳίϝϯτΛඞཁͱ͢Δίʔυ - େ͖ͳίʔυ - ෳࡶɾඇ௚ײతͳίʔυ - ϫʔΫΞϥ΢ϯυΛؚΉίʔυ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 60

Slide 60 text

ෳࡶɾඇ௚ײతͳίʔυʹର͢Δίϝϯτ ཧղ͕೉͍͠ίʔυͷ֓ཁ΍ཧ༝Λઆ໌͢Δ // // wordReplacementData.reverse() .forEach { (startIndex, endIndex, newText) -> stringBuilder.replace(startIndex, endIndex, newText) } ໰୊: ͳͥ reverse() Λݺͼग़͢ඞཁ͕͋Δʁ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 61

Slide 61 text

ෳࡶɾඇ௚ײతͳίʔυʹର͢Δίϝϯτ ཧղ͕೉͍͠ίʔυͷ֓ཁ΍ཧ༝Λઆ໌͢Δ // Replace texts in the reverse order because `replace()` // affects the following indices. wordReplacementData.reverse() .forEach { (startIndex, endIndex, newText) -> stringBuilder.replace(startIndex, endIndex, newText) } ؒҧͬͨʮϦϑΝΫλϦϯάʯʹΑΔ reverse() ͷ࡟আΛ๷͙ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 62

Slide 62 text

ඇܗࣜతͳίϝϯτΛඞཁͱ͢Δίʔυ - େ͖ͳίʔυ - ෳࡶɾඇ௚ײతͳίʔυ - ϫʔΫΞϥ΢ϯυΛؚΉίʔυ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 63

Slide 63 text

ϫʔΫΞϥ΢ϯυΛؚΉίʔυʹର͢Δίϝϯτ ϫʔΫΞϥ΢ϯυͰԿΛ͢Δ͔ɾͳͥඞཁͳͷ͔Λઆ໌͢Δ // We restore the previous state here // because libraryFunction() may break the receiver state ৄࡉΛ஌ΔͨΊͷϦϯΫΛ௥Ճ͢Δ // To avoid Device-X specific tinting bug (see, ISSUE-123456) ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 64

Slide 64 text

ඇܗࣜతͳίϝϯτ: ·ͱΊ جຊ͸υΩϡϝϯςʔγϣϯͱಉ͡ - ͨͩ͠ɺཁ໿͸ඞਢͰ͸ͳ͍ େ͖ͳɾෳࡶͳɾඇ௚ײతͳίʔυʹରͯ͠આ໌Λ͢Δ - ίʔυͷ·ͱ·Γɾ֓ཁɾཧ༝ɾϦϯΫ ίϝϯτ > ඇܗࣜతͳίϝϯτ

Slide 65

Slide 65 text

·ͱΊ - ίϝϯτ͸ඞཁͳͱ͖ɺඞཁͳ͚ͩॻ͘ - ίϝϯτΛॻ͘લޙͰϦϑΝΫλϦϯάΛߦ͏ - υΩϡϝϯςʔγϣϯ: ཁ໿ (ඞਢ) ɾ ৄࡉ (Φϓγϣφϧ) - ඇܗࣜతͳίϝϯτ: େ͖ͳɾෳࡶͳɾඇ௚ײతͳίʔυͷઆ໌ ίϝϯτ > ·ͱΊ