Slide 1

Slide 1 text

abstract fun ಡΈ΍͍͢ίʔυͷॻ͖ํ(): ୈ 5 ճ fun ؔ਺()

Slide 2

Slide 2 text

લճͷ͓͞Β͍: ঢ়ଶ ಡΈ΍͢͞ɾؤ݈ੑͷͨΊʹঢ়ଶΛ୯७Խ͢Δ - ୯७Խͦͷ΋ͷΛ໨తʹ͠ͳ͍ ඇ௚ަͳؔ܎Λഉআ͢Δ - ؔ਺ʹΑΔஔ͖׵͑ɾ௚࿨ܕ΍ྻڍͷར༻ ঢ়ଶભҠͷઃܭʹؾΛ഑Δ - ෆมɾႈ౳ɾ८ճ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

͜ͷߨٛʹ͓͚Δʮؔ਺ʯͷൣғ - αϒϧʔνϯ - ϓϩγʔδϟ - ϝιου - ίϯϐϡʔςουϓϩύςΟ - ίϯετϥΫλɾΠχγϟϥΠθʔγϣϯϒϩοΫ - ... ؔ਺ > ಋೖ

Slide 5

Slide 5 text

ಡΈ΍͍ؔ͢਺ͱ͸ ৼΔ෣͍͕༧ଌՄೳ - ໊લͱৼΔ෣͍ͷ੔߹ੑ͕͋Δ - Τϥʔέʔε΍੍໿͕গͳ͍ - υΩϡϝϯςʔγϣϯ͕ॻ͖΍͍͢ ؔ਺ > ಋೖ

Slide 6

Slide 6 text

ؔ਺Λ༧ଌՄೳʹ͢ΔͨΊʹ ؔ਺ͷʮ੹೚ʯͱʮྲྀΕʯΛ໌֬ʹ͢Δ ؔ਺ > ಋೖ

Slide 7

Slide 7 text

ࠓճͷ಺༰ ੹೚Λ໌֬ʹ͢Δ - ཁ໿͠ʹ͍ؔ͘਺Λ෼ׂ͢Δ - ίϚϯυͱΫΤϦΛ෼ׂ͢Δ ྲྀΕΛ໌֬ʹ͢Δ - ఆٛࢦ޲ϓϩάϥϛϯάΛߦ͏ - ϋοϐʔύεʹয఺Λ౰ͯΔ - ৚݅Ͱͳ͘ɺର৅Ͱ෼ׂ͢Δ ؔ਺ > ಋೖ

Slide 8

Slide 8 text

ࠓճͷ಺༰ ੹೚Λ໌֬ʹ͢Δ - ཁ໿͠ʹ͍ؔ͘਺Λ෼ׂ͢Δ - ίϚϯυͱΫΤϦΛ෼ׂ͢Δ ྲྀΕΛ໌֬ʹ͢Δ - ఆٛࢦ޲ϓϩάϥϛϯάΛߦ͏ - ϋοϐʔύεʹয఺Λ౰ͯΔ - ৚݅Ͱͳ͘ɺର৅Ͱ෼ׂ͢Δ ؔ਺ > ੹೚ > ཁ໿ʹΑΔ֬ೝ

Slide 9

Slide 9 text

ཁ໿͠ʹ͍ؔ͘਺Λ෼ׂ͢Δ ·ͣ͸ɺؔ਺ͷಈ࡞Λཁ໿ͯ͠ΈΔ ؔ਺ > ੹೚ > ཁ໿ʹΑΔ֬ೝ

Slide 10

Slide 10 text

ؔ਺ͷཁ໿: ྫ 1/2 ໰୊: ͜ͷίʔυΛͲͷΑ͏ʹཁ໿Ͱ͖Δʁ messageView.text = receivedMessageData.contentText senderNameView.text = receivedMessageData.senderName timestampView.text = receivedMessageData.sentTimeText ղ౴ྫ: "ड͚औͬͨϝοηʔδͰදࣔϨΠΞ΢τΛߋ৽͢Δ" ؔ਺ > ੹೚ > ཁ໿ʹΑΔ֬ೝ

Slide 11

Slide 11 text

ؔ਺ͷཁ໿: ྫ 2/2 ໰୊: ͜ͷίʔυΛͲͷΑ͏ʹཁ໿Ͱ͖Δʁ messageView.text = receivedMessageData.contentText doOnTransaction { messageDatabase.insertNewMessage(receivedMessageData) } ճ౴ྫʁ: "ϝοηʔδσʔλΛදࣔͨ͠ ޙʹɺอଘ͢Δ" "ϝοηʔδσʔλΛड͚औͬͨ ࣌ʹɺॲཧΛ͢Δ" ؔ਺ > ੹೚ > ཁ໿ʹΑΔ֬ೝ

Slide 12

Slide 12 text

ؔ਺ͷ੹೚ͱཁ໿ͷؔ܎ ཁ໿͕ॻ͖ʹ͍͘ = ؔ਺ͷ෼ׂ͕ඞཁ͔΋ fun bindMessageViewData(messageData: MessageData) { ... } fun saveMessageDataToDatabase(messageData: MessageData) { ... } ྫ֎: - ଞϨΠϠ/Ϟδϡʔϧʹެ։͞ΕͨΠϯλʔϑΣΠε - ΠϕϯτॲཧͷΤϯτϦʔϙΠϯτ ؔ਺ > ੹೚ > ཁ໿ʹΑΔ֬ೝ

Slide 13

Slide 13 text

ࠓճͷ಺༰ ੹೚Λ໌֬ʹ͢Δ - ཁ໿͠ʹ͍ؔ͘਺Λ෼ׂ͢Δ - ίϚϯυͱΫΤϦΛ෼ׂ͢Δ ྲྀΕΛ໌֬ʹ͢Δ - ఆٛࢦ޲ϓϩάϥϛϯάΛߦ͏ - ϋοϐʔύεʹয఺Λ౰ͯΔ - ৚݅Ͱͳ͘ɺର৅Ͱ෼ׂ͢Δ ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 14

Slide 14 text

ίϚϯυɾΫΤϦ෼཭ͷݪଇ6 ؔ਺ΛʮίϚϯυʯͱʮΫΤϦʯͰ෼ׂ͢Δ - ίϚϯυ: Ϩγʔό΍Ҿ਺Λมߋ͢Δ - ΫΤϦ: มߋΛ൐Θͣʹ໭Γ஋Λฦ͢ 6 Bertrand Meyer. 1988. Object-oriented Software Construction. Prentice-Hall ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 15

Slide 15 text

ίϚϯυɾΫΤϦ෼཭ͷݪଇ: ྫ 1/2 class IntList(vararg elements: Int) { infix fun append(others: IntList): IntList = ... } val a = IntList(1, 2) val b = IntList(3, 4) val c = a append b ໰୊: a, b, c ͷظ଴͞ΕΔ஋͸ʁ ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 16

Slide 16 text

ίϚϯυɾΫΤϦ෼཭ͷݪଇ: ྫ 2/2 val a = IntList(1, 2) val b = IntList(3, 4) val c = a append b ௨ৗظ଴͞ΕΔ݁Ռ: a={1, 2}, b={3, 4}, c={1, 2, 3, 4} Α͘ͳ͍ಈ࡞ͷ݁Ռ: a={1, 2, 3, 4}, b={3, 4}, c={1, 2, 3, 4} append ؔ਺͸໭Γ஋Λ࣋ͭͷͰ a ΍ b Λมߋ͢΂͖Ͱ͸ͳ͍ ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 17

Slide 17 text

ίϚϯυɾΫΤϦ෼཭ͷݪଇ: σϝϦοτ 1/3 ίϚϯυɾΫΤϦͷ෼཭Λ໨తʹͯ͠͸ͳΒͳ͍ - ΑΓڧ͍ґଘؔ܎ͷݪҼʹͳΓ͑Δ ʢ࣍ճͰৄࡉΛઆ໌ʣ - ෆཁͳঢ়ଶͷݪҼʹͳΓ͑Δ ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 18

Slide 18 text

ίϚϯυɾΫΤϦ෼཭ͷݪଇ: σϝϦοτ 2/3 Α͘ͳ͍ίʔυͷྫ class UserDataStore { private var latestOperationResult: Result = NO_OPERATION // Command fun saveUserData(userData: UserData) = ... // Query val wasLatestOperationSuccessful: Boolean get() = ... } latestOperationResult ͕όάͷݪҼʹͳΔ ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 19

Slide 19 text

ίϚϯυɾΫΤϦ෼཭ͷݪଇ: σϝϦοτ 3/3 Α͍ίʔυͷྫ class UserDataRequester { /** * Saves a given user data to ... * Then, returns true if the operation successful, otherwise false. */ fun saveUserData(userData: UserData): Boolean = ... } ࠷ޙͷঢ়ଶΛฦ͢͜ͱͰɺอଘͷඞཁ͕ͳ͘ͳΔ ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

Slide 20

Slide 20 text

ίϚϯυɾΫΤϦͷ෼཭Λ͢Δ৚݅ ʮϝΠϯͷʯ݁ՌΛฦ͢ͱ͖͸มߋ͠ͳ͍ = ʮαϒͷʯ݁ՌΛฦ͢ͱ͖͸มߋΛ൐ͬͯΑ͍ - ϝΠϯͷ݁Ռ: ม׵ɾܭࢉ݁Ռ, ৽͍͠Πϯελϯε ... - αϒͷ݁Ռ: Τϥʔ஋, มߋͷϝλσʔλʢετΞͨ͠αΠζʣ... (υΩϡϝϯςʔγϣϯ͕ඞਢ) σϑΝΫτελϯμʔυͱͳ͍ͬͯΔΠϯλʔϑΣΠε΋Մ ྫ: Queue.poll(): E, Iterator.next(): E ؔ਺ > ੹೚ > ίϚϯυͱΫΤϦ

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

ఆٛࢦ޲ϓϩάϥϛϯά 1/2 Definition-based programming ໊લͷ͍ͭͨม਺΍ؔ਺Λଟ༻͢ΔϓϩάϥϛϯάελΠϧ ໨త: - ಡΈඈ͹ͤΔίʔυΛ໌֬ʹ͢Δ - ߴ͍ந৅౓Λ༩͑Δ - ಡΈฦ͠ΛݮΒ͢ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 26

Slide 26 text

ఆٛࢦ޲ϓϩάϥϛϯά 2/2 ಡΈʹ͍͘ཁૉΛ ໊લͷ͍ͭͨม਺΍ؔ਺ Ͱஔ͖׵͑Δ ಡΈʹ͍͘ཁૉ: - ωετ (Ҿ਺ɾؔ਺ɾΫϥεɾ੍ޚߏ଄) - ແ໊ؔ਺ɾΦϒδΣΫτϦςϥϧ - ϝιουνΣΠϯ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 27

Slide 27 text

Ҿ਺ͷωετ: ໰୊఺ 1/2 ໰୊: ͳͥҎԼͷίʔυ͸ಡΈʹ͍͘ʁ showDialogOnError( presenter.updateSelfProfileView( repository.queryUserModel(userId) ) ) ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 28

Slide 28 text

Ҿ਺ͷωετ: ໰୊఺ 2/2 ղ౴: - ॏཁͳؔ਺ݺͼग़͕͠ωετͷ಺ଆʹ͋Δ - ͢΂ͯͷ໭Γ஋Λཧղ͠ͳ͍ͱಈ࡞͕Θ͔Βͳ͍ - ίʔυͷྲྀΕ͕ٯʢԼ͔Β্ʣʹͳ͍ͬͯΔ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 29

Slide 29 text

Ҿ਺ͷωετ: मਖ਼ํ๏ ໭Γ஋ʹ ໊લͷ͍ͭͨϩʔΧϧม਺ Λ࢖͏ val userModel = repository.queryUserModel(userId) val viewUpdateResult = presenter.updateSelfProfileView(UserModel) showDialogOnError(viewUpdateResult) ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 30

Slide 30 text

ϥϜμΛ࢖͏ϝιουνΣΠϯ: ໰୊఺ 1/2 ໰୊: ͜ͷίʔυͷಡΈʹ͍͘఺͸ʁ return queryTeamMemberIds(teamId) .map { memberId -> ... // Convert to UserModel ... } .filter { val userStatus = ... userStatus.isOnline } .map { it.emailAddress } ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 31

Slide 31 text

ϥϜμΛ࢖͏ϝιουνΣΠϯ: ໰୊఺ 2/2 ղ౴: ҎԼͷ 2 ͭΛཧղ͠ͳ͍ͱಈ࡞͕Θ͔Βͳ͍ - ֤ϝιουݺͼग़͠ͷϨγʔό (= ֤ݺͼग़͠ͷ໭Γ஋) - ϥϜμͷಈ࡞ͷৄࡉ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 32

Slide 32 text

ϥϜμΛ࢖͏ϝιουνΣΠϯ: मਖ਼ํ๏ 1/2 Ҋ1: ໊લͷ͍ͭͨϩʔΧϧม਺ ͰνΣΠϯΛ෼ׂ͢Δ val teamMembers = queryTeamMemberIds(teamId).map { ... ... } val onlineTeamMembers = teamMembers.filter { ... ... } return onlineTeamMembers.map { it.emailAddress } ϥϜμ͕௕͍ͱɺྲྀΕ͕ಡΈʹ͍͘Մೳੑ΋ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 33

Slide 33 text

ϥϜμΛ࢖͏ϝιουνΣΠϯ: मਖ਼ํ๏ 2/2 Ҋ2: ໊લͷ͍ͭͨϓϥΠϕʔτؔ਺ ͰϥϜμΛஔ͖׵͑Δ return queryTeamMemberIds(teamId) .map(::toUserModel) .filter(::isOnline) .map { it.emailAddress } ... private fun toUserModel(userId: UserId): UserModel { ... } private fun isOnline(userModel: UserModel): Boolean { ... } ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 34

Slide 34 text

ఆٛࢦ޲ϓϩάϥϛϯά: མͱ݀͠ நग़ʹΑͬͯίʔυ͕ಡΈʹ͘͘ͳΔ͜ͱ΋ - ෆཁͳঢ়ଶ - ա৒ʹڧ͍ґଘؔ܎ ʢ࣍ճͰৄࡉΛઆ໌ʣ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 35

Slide 35 text

நग़ͷམͱ݀͠: ΦϦδφϧͷίʔυ val userNameTextView: View = ... val profileImageView: View = ... init { // Complex userNameTextView initialization code userNameTextView... // Complex profileImageView initialization code profileImageView... } init ϒϩοΫ͕ංେԽͨͨ͠Ίநग़͢Δ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 36

Slide 36 text

நग़ͷམͱ݀͠: ؒҧͬͨमਖ਼ํ๏ var userNameTextView: View? = null var profileImageView: View? = null init { initializeUserNameTextView() initializeProfileImageView() } private fun initializeUserNameTextView() { userNameTextView = ... private fun initializeProfileImageView() { profileImageView = ... ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 37

Slide 37 text

நग़ͷམͱ݀͠: Կ͕ؒҧ͍͔ͬͯͨ - ෆཁͳՄมੑɾnullable - ෳ਺ճ initialize... ͕ݺ͹ΕΔՄೳੑ - ؔ਺໊ initialize... ͷᐆດੑ நग़͞ΕΔίʔυͷൣғΛ࠷దԽ͢Δ ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 38

Slide 38 text

நग़ͷམͱ݀͠: ਖ਼͍͠मਖ਼ํ๏ Ϗϡʔͷੜ੒ɾॳظԽ෦෼ͷΈΛநग़͢Δ val userNameTextView: View = createUserNameTextView() val profileImageView: View = createProfileImageView() private fun createUserNameTextView(): TextView = ... private fun createProfileImageView(): ImageView = ... ؔ਺ > ྲྀΕ > ఆٛࢦ޲ϓϩάϥϛϯά

Slide 39

Slide 39 text

ࠓճͷ಺༰ ੹೚Λ໌֬ʹ͢Δ - ཁ໿͠ʹ͍ؔ͘਺Λ෼ׂ͢Δ - ίϚϯυͱΫΤϦΛ෼ׂ͢Δ ྲྀΕΛ໌֬ʹ͢Δ - ఆٛࢦ޲ϓϩάϥϛϯάΛߦ͏ - ϋοϐʔύεʹয఺Λ౰ͯΔ - ৚݅Ͱͳ͘ɺର৅Ͱ෼ׂ͢Δ ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 40

Slide 40 text

ϋοϐʔύεͱΞϯϋοϐʔύε ϋοϐʔύε: ؔ਺ͷओͳ໨తΛୡ੒͢Δέʔε Ξϯϋοϐʔύε: ؔ਺ͷओͳ໨తΛୡ੒ͤͣʹऴྃ͢Δέʔε ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 41

Slide 41 text

ϋοϐʔύεͱΞϯϋοϐʔύε: ྫ String.toIntOrNull() ϋοϐʔύε: ੔਺Λฦ͢ e.g, "-1234", "0", "+001", "-2147483648" Ξϯϋοϐʔύε: null Λฦ͢ e.g., "--0", "text", "", "2147483648", "1.0" ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 42

Slide 42 text

ؔ਺ͷྲྀΕͱϋοϐʔύεɾΞϯϋοϐʔύε ઌʹΞϯϋοϐʔύεΛআ֎͠ɺϋοϐʔύεʹয఺Λ͋ͯΔ ʮΞʔϦʔϦλʔϯʯΛద༻͢Δ ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 43

Slide 43 text

ΞʔϦʔϦλʔϯ: Α͘ͳ͍ྫ if (isNetworkAvailable()) { val queryResult = queryToServer() if (queryResult.isValid) { // Do something with queryResult... } else { showInvalidResponseDialog() } } else { showNetworkUnavailableDialog() } ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 44

Slide 44 text

ΞʔϦʔϦλʔϯ: Կ͕ʮΑ͘ͳ͍ʯ͔ ෆ໌ྎ - Ͳ͜ʹॏཁͳίʔυ͕͋Δ͔͕Θ͔Γʹ͍͘ - Τϥʔ৚݅ͱͦͷॲཧͷؔ࿈ੑ͕Θ͔Γʹ͍͘ ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 45

Slide 45 text

ΞʔϦʔϦλʔϯ: Α͍ྫ if (!isNetworkAvailable()) { showNetworkUnavailableDialog() return } val queryResult = queryToServer() if (!queryResult.isValid) { showInvalidResponseDialog() return } // Do something with queryResult... ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 46

Slide 46 text

ΞʔϦʔϦλʔϯ: ஫ҙ఺ 1/2 when ΍ switch ͷҰ෦ͷ෼ذͰͷϦλʔϯΛආ͚Δ ΞʔϦʔϦλʔϯࣗମ΍ͦͷ৚݅Λݟམͱ͢Մೳੑ͕͋Δ val messageText = when (type) { FOO -> "this is FOO" BAR -> "this is BAR" null -> return } ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 47

Slide 47 text

ΞʔϦʔϦλʔϯ: ஫ҙ఺ 1/2 when ΍ switch ͷҰ෦ͷ෼ذͰͷϦλʔϯΛආ͚Δ ΞʔϦʔϦλʔϯࣗମ΍ͦͷ৚݅Λݟམͱ͢Մೳੑ͕͋Δ if (type == null) { return } val messageText = when (type) { FOO -> "this is FOO" BAR -> "this is BAR" } ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 48

Slide 48 text

ΞʔϦʔϦλʔϯ: ஫ҙ఺ 2/2 ෆཁͳΞϯϋοϐʔύεΛ࡞Βͳ͍Α͏ʹ͢Δ యܕతͳྫ: ۭͷίϨΫγϣϯʹର͢Δ૸ࠪ if (list.isEmpty) { return listOf() } return list .filter { ... } .map { ... } ؔ਺ > ྲྀΕ > ϋοϐʔύεʹয఺Λ౰ͯΔ

Slide 49

Slide 49 text

ࠓճͷ಺༰ ੹೚Λ໌֬ʹ͢Δ - ཁ໿͠ʹ͍ؔ͘਺Λ෼ׂ͢Δ - ίϚϯυͱΫΤϦΛ෼ׂ͢Δ ྲྀΕΛ໌֬ʹ͢Δ - ఆٛࢦ޲ϓϩάϥϛϯάΛߦ͏ - ϋοϐʔύεʹয఺Λ౰ͯΔ - ৚݅Ͱͳ͘ɺର৅Ͱ෼ׂ͢Δ ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 50

Slide 50 text

ؔ਺Λ෼ׂ͢Δ࣠ 1/2 ؔ਺Λ෼ׂ͢Δͱ͖ɺෳ਺ͷ෼͚ํ͕͋Δ ྫ: ΞΧ΢ϯτͷঢ়ଶΛදࣔ͢Δ - ৚݅: ΞΧ΢ϯτͷλΠϓ (premium, free) - ର৅: දࣔ͢ΔϏϡʔ (background, icon) ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 51

Slide 51 text

ؔ਺Λ෼ׂ͢Δ࣠ 2/2 ໰୊: ͲͪΒͷ࣠Ͱؔ਺Λ෼ׂ͢Δ΂͖ʁ Condition Object Premium account Free account Background color Account icon Red Gray “Twemoji” ©Twitter, Inc and other contributors (Licensed under CC-BY 4.0) https://twemoji.twitter.com/ ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 52

Slide 52 text

৚݅Ͱ෼ׂͨ͠৔߹ʢΑ͘ͳ͍ྫʣ fun bindViewData(accountType: AccountType) { when (accountType) { PREMIUM -> updateViewsForPremium() FREE -> updateViewsForFree() } } private fun updateViewsForPremium() { backgroundView.color = PREMIUM_BACKGROUND_COLOR accountTypeIcon.image = resources.getImage(PREMIUM_IMAGE_ID) } ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 53

Slide 53 text

৚݅ʹΑΔ෼ׂ͕ͳͥʮΑ͘ͳ͍ʯ͔ 1/2 യવͱͨ͠ཁ໿͔͠ॻ͚ͳ͍ /** * Updates views depending whether the account type is free or premium. */ ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 54

Slide 54 text

৚݅ʹΑΔ෼ׂ͕ͳͥʮΑ͘ͳ͍ʯ͔ 2/2 ৚݅ͱର৅ͷ૊Έ߹Θͤͷ໢ཏੑΛอূͰ͖ͳ͍ when (accountType) { PREMIUM -> updateViewsForPremium() FREE -> updateViewsForFree() BUSINESS -> updateViewsForBusiness() } private fun updateViewsForBusiness() { backgroundView.color = PREMIUM_BACKGROUND_COLOR // [BUG] Forgot to update the account icon ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 55

Slide 55 text

ର৅ʹΑΔ෼ׂ: Α͍ྫ 1/2 fun bindViewData(accountType: AccountType) { updateBackgroundViewColor(accountType) updateAccountTypeImage(accountType) } private fun updateBackgroundViewColor(accountType: AccountType) { backgroundView.color = when (accountType) { PREMIUM -> PREMIUM_BACKGROUND_COLOR FREE -> FREE_BACKGROUND_COLOR } } ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 56

Slide 56 text

ର৅ʹΑΔ෼ׂ: Α͍ྫ 2/2 ۩ମతͳཁ໿͕ॻ͖΍͍͢ /** * Updates background color and icon according to a given account type. */ ৚݅ͱର৅ͷ૊Έ߹Θͤͷ໢ཏੑΛอূͰ͖Δ ߋͳΔϦϑΝΫλϦϯάΛద༻Ͱ͖Δ ྫ: நग़ͨؔ͠਺Λࢀরಁաʹ͢Δ ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 57

Slide 57 text

ର৅ʹΑΔ෼ׂ: ߋͳΔϦϑΝΫλϦϯά fun bindViewData(accountType: AccountType) { backgroundView.color = getBackgroundColorInt(accountType) accountTypeIcon.image = getAccountTypeIconImage(accountType) } private fun getBackgroundColorInt(accountType: AccountType): Int = when (accountType) { PREMIUM -> PREMIUM_BACKGROUND_COLOR FREE -> FREE_BACKGROUND_COLOR } ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 58

Slide 58 text

ΞʔϦʔϦλʔϯ VS ର৅ʹΑΔ෼ׂ ʮΞʔϦʔϦλʔϯʯ͸ʮ৚݅ʹΑΔ෼ׂʯͰ͸ʁ ઓུ 1: - ΞϯϋοϐʔύεΛϋοϐʔύεʹؚΊΔ ઓུ 2: - ઌʹΞʔϦʔϦλʔϯΛద༻͢Δ - ࢒ͬͨϋοϐʔύεʹରͯ͠ର৅ʹΑΔ෼ׂΛద༻͢Δ ؔ਺ > ྲྀΕ > ର৅ʹΑΔ෼ׂ

Slide 59

Slide 59 text

ྲྀΕΛ໌֬ʹ͢Δ: ·ͱΊ ఆٛࢦ޲ϓϩάϥϛϯάΛߦ͏: ωετɾνΣΠϯɾϦςϥϧʹ໊લΛ͚ͭΔ ϋοϐʔύεʹয఺Λ౰ͯΔ: ΞʔϦʔϦλʔϯΛద༻͢Δ ৚݅Ͱͳ͘ɺର৅Ͱ෼ׂ͢Δ: ର৅͝ͱʹؔ਺΍ίʔυϒϩοΫΛͭ͘Δ ؔ਺ > ྲྀΕ > ·ͱΊ

Slide 60

Slide 60 text

·ͱΊ ཁ໿Λॻ͍ͯؔ਺͕ཧղ͠΍͍͔֬͢ೝ͢Δ ؔ਺ͷ੹೚: - ඞཁͳΒ෼ׂ͢Δ - ϝΠϯͷ݁ՌΛฦ͢ͱ͖͸มߋ͠ͳ͍ ؔ਺ͷྲྀΕ: - ͳͳΊಡΈͰ͖ΔΑ͏ʹ͢Δ ؔ਺ > ·ͱΊ