Slide 1

Slide 1 text

ಡΈ΍͍͢ίʔυͷॻ͖ํ

Slide 2

Slide 2 text

ॻ੶ʹ͍ͭͯ ಡΈ΍͍͢ίʔυͷΨΠυϥΠϯ - ࣋ଓՄೳͳιϑτ΢ΣΞ։ൃͷͨΊʹ - 2022೥10݄22೔ग़൛, ٕज़ධ࿦ࣾ https://gihyo.jp/book/ 2022/978-4-297-13036-7

Slide 3

Slide 3 text

ಡΈ΍͍͢ίʔυͷॻ͖ํ ୈ 1 ճ ಋೖͱݪଇ

Slide 4

Slide 4 text

ಡΈ΍͍͢ίʔυͷཁ݅ - ໌֬: flag ΑΓ isVisible - ୯७: !(!isA || !isB) && isB ΑΓ isA && isB - ಠཱੑ͕ߴ͍: ؔ਺, Ϋϥε, Ϟδϡʔϧ... - ߏ଄త: ϑΥʔϚοτ, ґଘؔ܎, ঢ়ଶભҠ... ҰͭͷࢦඪͰ͸ಡΈ΍͢͞ΛଌΕͳ͍ ʮԿ͕ಡΈ΍͍͔͢ʯ͸࣌୅ͱίϯςΩετʹґଘ͢Δ ಋೖͱݪଇ > ಋೖ

Slide 5

Slide 5 text

ಡΈ΍͢͞ͷඞཁੑ ϓϩμΫτͷن໛͕େ͖͘ͳͬͯ΋ ੜ࢈ੑΛҡ࣋͢ΔͨΊ ಋೖͱݪଇ > ಋೖ

Slide 6

Slide 6 text

ϓϩμΫτͷن໛ͱੜ࢈ੑ ։ൃن໛͕େ͖͘ͳΔ → ੜ࢈ੑ্͕͕Γʹ͍͘ ಡΈ΍͢͞: ։ൃΛܧଓ͠΍͘͢͢Δखஈ ಋೖͱݪଇ > ಋೖ

Slide 7

Slide 7 text

ϓϩμΫτͷن໛ͱίʔυͷಡΈ΍͢͞ ن໛͕େ͖͘ͳΔ΄Ͳ ಡΉ࣌ؒ > ॻ࣌ؒ͘ - ػೳ࣮૷࣌ͷطଘίʔυͷཧղ - ؔ࿈։ൃऀʹίʔυϨϏϡʔґཔ - ෳࡶͳόάͷ 1 ߦमਖ਼ ॻ͖΍͢͞ΑΓಡΈ΍͕͢͞ॏཁ ಋೖͱݪଇ > ಋೖ

Slide 8

Slide 8 text

ੜ࢈ੑͷ࠷దԽ νʔϜશମ ˍ ϓϩμΫτण໋શظؒ ͷੜ࢈ੑ͕ॏཁ 5 ෼ͷվળͰଞͷਓͷ 1 ࣌ؒΛٹ͑Δ͔΋ ίϝϯτ΍ςετͷ௥Ճɾͪΐͬͱͨ͠ϦϑΝΫλϦϯά ։ൃऀͷධՁج४ͷมߋ͕ඞཁ͔΋ ୹ظؒͷ࣮૷଎౓ͷΈʹয఺Λͯͯ͸͍͚ͳ͍ ಋೖͱݪଇ > ಋೖ

Slide 9

Slide 9 text

νʔϜͷੜ࢈ੑͱनਓͷδϨϯϚ ݸਓͷੜ࢈ੑ Ͱ࠷దԽ͢Δͱ νʔϜͷੜ࢈ੑ ͸Լ͕ΓಘΔ Bob Alice Hacky Readable Readable Hacky 8 8 10 1 1 10 2 2 ಋೖͱݪଇ > ಋೖ

Slide 10

Slide 10 text

ՄಡੑΛߴΊΔऔΓ૊Έํ - ஌ࣝ΍ٕज़Λબ୒͢Δ ʢ࢖͏໨తΛݟࣦΘͳ͍ʣ - Ձ஋ͱෳࡶ͞ͷόϥϯε ΛऔΔ - ࣗಈతͳݕূ Λ׆༻͢Δ ʢίϯύΠϥ, ςετ, etc.ʣ - ٞ࿦Λසൟʹߦ͏ ʢϛεͷख໭ΓΛখ͘͢͞Δʣ - ܧଓֶͯ͠श͢Δ ಋೖͱݪଇ > ಋೖ

Slide 11

Slide 11 text

ίʔυͷॻ͖ํͷֶश ࣮૷͢Δ͚ͩͳΒൺֱత؆୯ ಛผͳτϨʔχϯά͸ෆཁ ಡΈ΍͍͢ίʔυΛॻ͘͜ͱ͸೉͍͠ - ߨٛɾॻ੶ɾΦϯϥΠϯࢿྉ - ίʔυϨϏϡʔɾϖΞϓϩάϥϛϯά ಋೖͱݪଇ > ಋೖ

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

ࠓճͷ಺༰ - ಋೖ - ϘʔΠεΧ΢τϧʔϧ - YAGNIɹ - KISSɹ - ୯Ұ੹೚ݪଇ - ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ ಋೖͱݪଇ > ݪଇ

Slide 15

Slide 15 text

ࠓճͷ಺༰ - ಋೖ - ϘʔΠεΧ΢τϧʔϧ - YAGNIɹ - KISSɹ - ୯Ұ੹೚ݪଇ - ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ ಋೖͱݪଇ > ݪଇ

Slide 16

Slide 16 text

ϘʔΠεΧ΢τϧʔϧ Try to leave this world a little better than you found it... — Robert Baden-Powell Robert C. Martin ͕ιϑτ΢ΣΞ։ൃʹద༻1 ίʔυʹมߋΛՃ͑Δͱ͖ɺվળΛࢪ͢ 1 97 Things Every Programmer Should Know: Collective Wisdom from the Experts, Kevlin Henney, 2010 ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 17

Slide 17 text

ϘʔΠεΧ΢τϧʔϧͰ͢΂͖͜ͱ 1/2 - ௥Ճ: ίϝϯτ, ςετ - ࡟আ: ෆཁͳґଘؔ܎, ϝϯό, ঢ়ଶ - ໊લͷมߋ: Ϋϥε, ؔ਺, ม਺ - ෼ׂ: ڊେͳΫϥε, ؔ਺, ωετ, ݺͼग़ؔ͠܎ - ߏ଄Խ: ϑΥʔϚοτ, ґଘؔ܎, ந৅ԽϨΠϠ, ܧঝ֊૚ ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 18

Slide 18 text

ϘʔΠεΧ΢τϧʔϧͰ͢΂͖͜ͱ 2/2 ίʔυΛѱԽͤ͞ͳ͍ (ׂΕ૭ཧ࿦) ྫ: ڊେͳߏ଄ʹཁૉΛ௥Ճ͢΂͖Ͱͳ͍ - ڊେͳΫϥεɾؔ਺ʹ ϝϯόɾจ Λ௥Ճ͠ͳ͍ - ਂ͍ݺͼग़͠ߏ଄ɾܧঝؔ܎ʹ ֊૚ Λ௥Ճ͠ͳ͍ ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 19

Slide 19 text

ϘʔΠεΧ΢τϧʔϧͷద༻ྫ 1/3 ໰୊: ৽͍͠ ViewType ͱͯ͠ Z Λ௥Ճͯ͠Α͍ʁ val viewType: ViewType = ... // An enum type when (viewType) { A -> { view1.isVisible = true view2.text = "Case A" } B -> { view1.isVisible = false view2.text = "Case B" } ... ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 20

Slide 20 text

ϘʔΠεΧ΢τϧʔϧͷద༻ྫ 2/3 ղ౴: ʮͦͷ··Ͱ͸ʯ௥Ճͯ͠͸͍͚ͳ͍ ͢Ͱʹ৚݅෼ذͷߏ଄͕ංେԽ͍ͯ͠ΔͨΊ ղܾҊ: ஋ΛྻڍܕͷϓϩύςΟͱͯ͠நग़ ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 21

Slide 21 text

ϘʔΠεΧ΢τϧʔϧͷద༻ྫ 3/3 1: ϓϩύςΟͱͯ͠ நग़͢Δ enum class ViewType(val isView1Visible: Boolean, val view2Text: String) 2: ϓϩύςΟΛ࢖ͬͯ ৚݅෼ذΛ࡟আ͢Δ view1.isVisible = viewType.isView1Visible view2.text = viewType.view2Text 3: ৽͍͠λΠϓ Z Λ௥Ճ͢Δ ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 22

Slide 22 text

ϘʔΠεΧ΢τϧʔϧͷ஫ҙ఺ ϓϧϦΫΤετ΍ίϛοτΛංେԽͤ͞ͳ͍ - ࣮૷ͷʮલʹʯϦϑΝΫλϦϯά ӨڹൣғΛߟ͑Δ - ϦϑΝΫλϦϯάൣғΛ͋Β͔͡ΊܾΊ͓ͯ͘ - ϦϦʔεϒϥϯνͰ͸ϦϑΝΫλϦϯά͠ͳ͍ ಋೖͱݪଇ > ݪଇ > ϘʔΠεΧ΢τϧʔϧ

Slide 23

Slide 23 text

ࠓճͷ಺༰ - ಋೖ - ϘʔΠεΧ΢τϧʔϧ - YAGNIɹ - KISSɹ - ୯Ұ੹೚ݪଇ - ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ ಋೖͱݪଇ > ݪଇ

Slide 24

Slide 24 text

YAGNI You Aren't Gonna Need It ඞཁͳͱ͖͚࣮ͩ૷͢Δ - ʮকདྷͷͨΊʯͷػೳͷ 90% ͸࢖ΘΕͳ͍ 2 - ߏ଄Λ୯७ʹอͭ = ࢓༷มߋʹରԠ͠΍͍͢ 2 2 http://www.extremeprogramming.org/rules/early.html ಋೖͱݪଇ > ݪଇ > YAGNI

Slide 25

Slide 25 text

YAGNI ʹҧ൓͍ͯ͠Δίʔυ ࢖ΘΕ͍ͯͳ͍ίʔυ - ࢀর͞Ε͍ͯͳ͍Ϋϥεɾؔ਺ɾม਺ - ίϝϯτΞ΢τ͞Εͨίʔυ ա౓ʹ֦ு͞Εͨίʔυ - ࢠΫϥε͕͚̍ͭͩͷந৅Ϋϥε - ఆ਺͔͠౉͞Εͳ͍Ҿ਺ ಋೖͱݪଇ > ݪଇ > YAGNI

Slide 26

Slide 26 text

YAGNI ʹҧ൓͍ͯ͠Δྫ UI ཁૉͷ࠲ඪΫϥεʹʮ୯ҐʯΛ௥Ճ͢Δ class Coordinate(val x: Int, val y: Int, val unitType: UnitType) enum class UnitType { PIXEL, POINT } Coordinate + Coordinate Λఆٛ͠Α͏ͱ͢Δͱෳࡶʹ ࢖ΘΕ͍ͯͳ͍ػೳͷ࣮૷͸ؒҧͬͨઃܭΛҾ͖ى͜͠΍͍͢ ಋೖͱݪଇ > ݪଇ > YAGNI

Slide 27

Slide 27 text

YAGNI ͷ஫ҙ఺ ػೳͷ࣮૷͕য఺ - ઃܭ΍ػೳͷཁ൱ͷٞ࿦͸ԣணͯ͠͸͍͚ͳ͍ ίʔυͷมߋՄೳੑ͕લఏ - ֎෦ެ։͢Δ APIɾϥΠϒϥϦ౳͸ཁݕ౼ - όʔδϣϯʹΑΔߋ৽खஈ͕ඞཁ ಋೖͱݪଇ > ݪଇ > YAGNI

Slide 28

Slide 28 text

ࠓճͷ಺༰ - ಋೖ - ϘʔΠεΧ΢τϧʔϧ - YAGNIɹ - KISSɹ - ୯Ұ੹೚ݪଇ - ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ ಋೖͱݪଇ > ݪଇ

Slide 29

Slide 29 text

KISS Keep It Simple Stupid — Clarence Leonard "Kelly" Johnson ୯७ͳํ๏ΛબͿ - ՄೳͳݶΓඪ४ͷ࣮૷Λ࢖͏ - ϥΠϒϥϦɾϑϨʔϜϫʔΫɾσβΠϯͷ༻్ΛߜΔ ඒ͍͠ɾ༏խͳίʔυ͕ಡΈ΍͍͢ͱ͸ݶΒͳ͍ ಋೖͱݪଇ > ݪଇ > KISS

Slide 30

Slide 30 text

KISS: Α͘ͳ͍ྫ return userActionLog .groupBy { it.user } .map { it.key to it.value.size } .sortedBy { it.second } .map { it.first } .takeLast(10) Ϩγʔό΍ it ͕Կ͔͸ ͢΂ͯಡ·ͳ͍ͱཧղ͕Ͱ͖ͳ͍ ಋೖͱݪଇ > ݪଇ > KISS

Slide 31

Slide 31 text

KISS: Α͘ͳ͍ྫ return userActionLog .groupBy ... .map ... .sortedBy ... .map ... .takeLast(10) Ϩγʔό΍ it ͕Կ͔͸ ͢΂ͯಡ·ͳ͍ͱཧղ͕Ͱ͖ͳ͍ ಋೖͱݪଇ > ݪଇ > KISS

Slide 32

Slide 32 text

KISS: Α͍ྫ val logCountByUser: Map = userActionLog .groupBy { log -> log.user } .map { (user, logs) -> user to logs.size } val userListSortedByLogCount: List = logCountByUser .sortedBy { (_, messageCount) -> messageCount } .map { (userId, _) -> userId } return userListSortedByLogCount.takeLast(10) ඒ͘͠͸ͳ͍͕ɺཧղ͠΍͍͢ ಋೖͱݪଇ > ݪଇ > KISS

Slide 33

Slide 33 text

KISS: Α͍ྫ val logCountByUser: Map = userActionLog ... ... val userListSortedByLogCount: List = logCountByUser ... ... return userListSortedByLogCount.takeLast(10) ඒ͘͠͸ͳ͍͕ɺཧղ͠΍͍͢ ಋೖͱݪଇ > ݪଇ > KISS

Slide 34

Slide 34 text

ࠓճͷ಺༰ - ಋೖ - ϘʔΠεΧ΢τϧʔϧ - YAGNIɹ - KISSɹ - ୯Ұ੹೚ݪଇ - ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 35

Slide 35 text

୯Ұϝιου == ୯Ұ੹೚ʁ ϝιουͷ਺Ͱ͸੹೚͸ଌΕͳ͍ class Alviss { // May show a text, may break the device, may launch a rocket, // may ... fun doEverything(state: UniverseState) } ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 36

Slide 36 text

୯Ұ੹೚ݪଇ A class should have only one reason to change. — Robert C. Martin ̎ͭҎ্ͷػೳΛࠞͥͯ͸͍͚ͳ͍ ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 37

Slide 37 text

୯Ұ੹೚ݪଇ: Α͘ͳ͍ྫ 1/2 ਤॻؗͷॻ੶ି͠ग़͠ঢ়ଶ ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 38

Slide 38 text

୯Ұ੹೚ݪଇ: Α͘ͳ͍ྫ 2/2 class LibraryBookRentalData( val bookIds: MutableList, val bookNames: MutableList, val bookIdToRenterNameMap: MutableMap, val bookIdToDueDateMap: MutableMap, ... ) { fun findRenterName(bookName: String): String? fun findDueDate(bookName: String): Date? ... ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 39

Slide 39 text

୯Ұ੹೚ݪଇ: վળҊ 1/2 ΫϥεΛΤϯςΟςΟ͝ͱʹ෼ׂ͢Δ ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 40

Slide 40 text

୯Ұ੹೚ݪଇ: վળҊ 2/2 data class BookData(val id: Int, val name: String, ...) data class UserData(val name: String, ...) class CirculationRecord( val onLoanBookEntries: MutableMap ) { data class Entry(val renter: UserData, val dueDate: Date) ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 41

Slide 41 text

੹೚ͷ෼ׂ ΫϥεΛ෼ׂ͢Δ - ΤϯςΟςΟ͝ͱʹϞσϧΛ෼͚Δ - ϨΠϠ΍ίϯϙʔωϯτ͝ͱʹϩδοΫΛ෼͚Δ - ର৅ͷσʔλܕ͝ͱʹϢʔςΟϦςΟΛ෼͚Δ ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 42

Slide 42 text

੹೚ൣғͷ֬ೝํ๏ Ϋϥε͕͍ͯ͠Δ͜ͱΛྻڍ → ཁ໿Λॻ͘ ෼ׂΛߟྀ͢΂͖ঢ়گ: - ཁ໿Λॻ͘ͷ͕೉͍͠ - ໊લʹൺ΂ͯཁ໿͕ංେʹͳΔ ಋೖͱݪଇ > ݪଇ > ୯Ұ੹೚ݪଇ

Slide 43

Slide 43 text

ࠓճͷ಺༰ - ಋೖ - ϘʔΠεΧ΢τϧʔϧ - YAGNIɹ - KISSɹ - ୯Ұ੹೚ݪଇ - ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ ಋೖͱݪଇ > ݪଇ

Slide 44

Slide 44 text

࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ 1/2 We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. — Structured Programming with go to Statements, Donald Knuth ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 45

Slide 45 text

࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ 2/2 Α͍࠷దԽ: ίʔυΛ୯७ʹ͢Δ࠷దԽ Α͘ͳ͍࠷దԽ: ίʔυΛෳࡶʹ͢Δ࠷దԽ ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 46

Slide 46 text

Α͍࠷దԽͷྫ ࠷దԽલ: val data = arrayList.find { data -> data.key == expectedKey } ࠷దԽޙ: val data = hashMap[expectedKey] ίʔυΛ୯७ʹͭͭ͠ ܭࢉྔΛݮΒ͢ ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 47

Slide 47 text

ίʔυΛෳࡶʹ͢Δ࠷దԽ 1/2 Yet we should not pass up our opportunities in that critical 3% — Donald Knuth ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 48

Slide 48 text

ίʔυΛෳࡶʹ͢Δ࠷దԽ 1/2 - ՄมΦϒδΣΫτͷ࠶ར༻ - Πϯελϯεϓʔϧ - ஗ԆॳظԽ - Ωϟογϡ ϓϥοτϑΥʔϜͷαϙʔτ͔ϓϩϑΝΠϦϯά͕ඞཁ ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 49

Slide 49 text

࠷దԽͷฐ֐ ୯७Խͷ๦͛ʹͳΔ - ΦϓςΟϚΠβͷ΄͏͕ੑೳ͕Α͍͜ͱ΋ Φʔόϔουίετ͕͔͔Δ - Ωϟογϡ: Ωϟογϡϛε཰ ΞΫηε࣌ؒ - ஗ԆॳظԽ: (ಉظతͳ) ΠϯελϯενΣοΫ ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 50

Slide 50 text

࠷దԽͷલʹ ࠷దԽ͕ଥ౰͔࠶֬ೝ ෳࡶ͞ʹݟ߹͏Ձ஋͕͋Δ͔ ϓϩϑΝΠϦϯάɾݟੵ΋ΓΛߦ͏ ࠷దԽର৅ (ܭࢉྔ, ϝϞϦ)ɾ࡟ݮྔɾ࢖༻཰ ಋೖͱݪଇ > ݪଇ > ࣌ظঘૣͳ࠷దԽ͸ॾѱͷࠜݯ

Slide 51

Slide 51 text

·ͱΊ ಡΈ΍͍͢ίʔυ: ੜ࢈ੑΛҡ࣋͢Δखஈ ϘʔΠεΧ΢τϧʔϧ: ίʔυมߋલΑΓಡΈ΍͘͢ YAGNI: ඞཁʹͳͬͨͱ͖ʹॳΊ࣮ͯ૷ KISS: ୯७ͳํ๏Λ࢖͏, ඒ͍͠ != ಡΈ΍͍͢ ୯Ұ੹೚ݪଇ: ੹೚ൣғΛ໌֬ʹ ࣌ظঘૣͳ࠷దԽ: ࠷దԽͷલʹϓϩϑΝΠϦϯάɾݟੵ΋Γ ಋೖͱݪଇ > ·ͱΊ