oh-my-oop 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MCP_STRUCTURE.md +301 -0
- package/README.md +167 -0
- package/SCOPE.md +27 -0
- package/dist/application/discovery.d.ts +133 -0
- package/dist/application/discovery.js +62 -0
- package/dist/application/discovery.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/collaborators.d.ts +2 -0
- package/dist/domain/collaborators.js +26 -0
- package/dist/domain/collaborators.js.map +1 -0
- package/dist/domain/ids.d.ts +4 -0
- package/dist/domain/ids.js +23 -0
- package/dist/domain/ids.js.map +1 -0
- package/dist/domain/model.d.ts +71 -0
- package/dist/domain/model.js +2 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/schemas.d.ts +213 -0
- package/dist/domain/schemas.js +79 -0
- package/dist/domain/schemas.js.map +1 -0
- package/dist/domain/stereotypes.d.ts +7 -0
- package/dist/domain/stereotypes.js +65 -0
- package/dist/domain/stereotypes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/io/classStore.d.ts +9 -0
- package/dist/io/classStore.js +39 -0
- package/dist/io/classStore.js.map +1 -0
- package/dist/io/collaborationStore.d.ts +7 -0
- package/dist/io/collaborationStore.js +32 -0
- package/dist/io/collaborationStore.js.map +1 -0
- package/dist/io/design.d.ts +3 -0
- package/dist/io/design.js +22 -0
- package/dist/io/design.js.map +1 -0
- package/dist/io/designIndex.d.ts +6 -0
- package/dist/io/designIndex.js +49 -0
- package/dist/io/designIndex.js.map +1 -0
- package/dist/io/frontmatter.d.ts +8 -0
- package/dist/io/frontmatter.js +31 -0
- package/dist/io/frontmatter.js.map +1 -0
- package/dist/io/history.d.ts +10 -0
- package/dist/io/history.js +38 -0
- package/dist/io/history.js.map +1 -0
- package/dist/io/useCaseStore.d.ts +8 -0
- package/dist/io/useCaseStore.js +36 -0
- package/dist/io/useCaseStore.js.map +1 -0
- package/dist/io/workspace.d.ts +14 -0
- package/dist/io/workspace.js +82 -0
- package/dist/io/workspace.js.map +1 -0
- package/dist/oop/commands.d.ts +446 -0
- package/dist/oop/commands.js +319 -0
- package/dist/oop/commands.js.map +1 -0
- package/dist/oop/conformance.d.ts +16 -0
- package/dist/oop/conformance.js +30 -0
- package/dist/oop/conformance.js.map +1 -0
- package/dist/prompts/discovery.d.ts +2 -0
- package/dist/prompts/discovery.js +41 -0
- package/dist/prompts/discovery.js.map +1 -0
- package/dist/prompts/imagineWithoutController.d.ts +2 -0
- package/dist/prompts/imagineWithoutController.js +75 -0
- package/dist/prompts/imagineWithoutController.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/phasePressureTest.d.ts +2 -0
- package/dist/prompts/phasePressureTest.js +69 -0
- package/dist/prompts/phasePressureTest.js.map +1 -0
- package/dist/prompts/rddIntro.d.ts +2 -0
- package/dist/prompts/rddIntro.js +53 -0
- package/dist/prompts/rddIntro.js.map +1 -0
- package/dist/prompts/review.d.ts +2 -0
- package/dist/prompts/review.js +45 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
- package/dist/prompts/stateMachineIntrospect.js +80 -0
- package/dist/prompts/stateMachineIntrospect.js.map +1 -0
- package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
- package/dist/prompts/tellDontAskRephrase.js +66 -0
- package/dist/prompts/tellDontAskRephrase.js.map +1 -0
- package/dist/render/diff.d.ts +21 -0
- package/dist/render/diff.js +84 -0
- package/dist/render/diff.js.map +1 -0
- package/dist/render/mermaid.d.ts +24 -0
- package/dist/render/mermaid.js +53 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/sideBySide.d.ts +14 -0
- package/dist/render/sideBySide.js +91 -0
- package/dist/render/sideBySide.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.js +349 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/alternatives.d.ts +2 -0
- package/dist/tools/alternatives.js +9 -0
- package/dist/tools/alternatives.js.map +1 -0
- package/dist/tools/classes.d.ts +2 -0
- package/dist/tools/classes.js +13 -0
- package/dist/tools/classes.js.map +1 -0
- package/dist/tools/collaborations.d.ts +2 -0
- package/dist/tools/collaborations.js +8 -0
- package/dist/tools/collaborations.js.map +1 -0
- package/dist/tools/compare.d.ts +2 -0
- package/dist/tools/compare.js +9 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/conformance.d.ts +3 -0
- package/dist/tools/conformance.js +11 -0
- package/dist/tools/conformance.js.map +1 -0
- package/dist/tools/diagram.d.ts +2 -0
- package/dist/tools/diagram.js +9 -0
- package/dist/tools/diagram.js.map +1 -0
- package/dist/tools/discovery.d.ts +2 -0
- package/dist/tools/discovery.js +23 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +2 -0
- package/dist/tools/init.js +9 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/oop.d.ts +9 -0
- package/dist/tools/oop.js +26 -0
- package/dist/tools/oop.js.map +1 -0
- package/dist/tools/responsibilities.d.ts +2 -0
- package/dist/tools/responsibilities.js +13 -0
- package/dist/tools/responsibilities.js.map +1 -0
- package/dist/tools/state.d.ts +2 -0
- package/dist/tools/state.js +8 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/useCases.d.ts +2 -0
- package/dist/tools/useCases.js +18 -0
- package/dist/tools/useCases.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -0
- package/dist/tools/validate.js +9 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tradeoff/engine.d.ts +61 -0
- package/dist/tradeoff/engine.js +171 -0
- package/dist/tradeoff/engine.js.map +1 -0
- package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
- package/dist/tradeoff/heuristics/classSplit.js +94 -0
- package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
- package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
- package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
- package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collectionShape.js +113 -0
- package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
- package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
- package/dist/tradeoff/heuristics/errorHandling.js +110 -0
- package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
- package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
- package/dist/tradeoff/templates.d.ts +2 -0
- package/dist/tradeoff/templates.js +33 -0
- package/dist/tradeoff/templates.js.map +1 -0
- package/dist/util/log.d.ts +1 -0
- package/dist/util/log.js +7 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/mcp.d.ts +4 -0
- package/dist/util/mcp.js +18 -0
- package/dist/util/mcp.js.map +1 -0
- package/dist/validate/cohesion.d.ts +3 -0
- package/dist/validate/cohesion.js +88 -0
- package/dist/validate/cohesion.js.map +1 -0
- package/dist/validate/collectionWrapper.d.ts +3 -0
- package/dist/validate/collectionWrapper.js +131 -0
- package/dist/validate/collectionWrapper.js.map +1 -0
- package/dist/validate/coupling.d.ts +3 -0
- package/dist/validate/coupling.js +47 -0
- package/dist/validate/coupling.js.map +1 -0
- package/dist/validate/cycle.d.ts +3 -0
- package/dist/validate/cycle.js +101 -0
- package/dist/validate/cycle.js.map +1 -0
- package/dist/validate/dataDuplication.d.ts +3 -0
- package/dist/validate/dataDuplication.js +150 -0
- package/dist/validate/dataDuplication.js.map +1 -0
- package/dist/validate/dependencyDirection.d.ts +3 -0
- package/dist/validate/dependencyDirection.js +106 -0
- package/dist/validate/dependencyDirection.js.map +1 -0
- package/dist/validate/dualUseKnowing.d.ts +3 -0
- package/dist/validate/dualUseKnowing.js +137 -0
- package/dist/validate/dualUseKnowing.js.map +1 -0
- package/dist/validate/emptyObjectFill.d.ts +3 -0
- package/dist/validate/emptyObjectFill.js +119 -0
- package/dist/validate/emptyObjectFill.js.map +1 -0
- package/dist/validate/findings.d.ts +22 -0
- package/dist/validate/findings.js +12 -0
- package/dist/validate/findings.js.map +1 -0
- package/dist/validate/functionDecompositionExcess.d.ts +3 -0
- package/dist/validate/functionDecompositionExcess.js +120 -0
- package/dist/validate/functionDecompositionExcess.js.map +1 -0
- package/dist/validate/functionNotObject.d.ts +3 -0
- package/dist/validate/functionNotObject.js +80 -0
- package/dist/validate/functionNotObject.js.map +1 -0
- package/dist/validate/godObject.d.ts +6 -0
- package/dist/validate/godObject.js +76 -0
- package/dist/validate/godObject.js.map +1 -0
- package/dist/validate/presentationInDomain.d.ts +3 -0
- package/dist/validate/presentationInDomain.js +57 -0
- package/dist/validate/presentationInDomain.js.map +1 -0
- package/dist/validate/primitiveWrapper.d.ts +3 -0
- package/dist/validate/primitiveWrapper.js +106 -0
- package/dist/validate/primitiveWrapper.js.map +1 -0
- package/dist/validate/rules.d.ts +24 -0
- package/dist/validate/rules.js +269 -0
- package/dist/validate/rules.js.map +1 -0
- package/dist/validate/singletonStatefulHolder.d.ts +3 -0
- package/dist/validate/singletonStatefulHolder.js +128 -0
- package/dist/validate/singletonStatefulHolder.js.map +1 -0
- package/dist/validate/strategyAsymmetry.d.ts +3 -0
- package/dist/validate/strategyAsymmetry.js +131 -0
- package/dist/validate/strategyAsymmetry.js.map +1 -0
- package/dist/validate/testability.d.ts +5 -0
- package/dist/validate/testability.js +157 -0
- package/dist/validate/testability.js.map +1 -0
- package/dist/validate/vagueName.d.ts +3 -0
- package/dist/validate/vagueName.js +136 -0
- package/dist/validate/vagueName.js.map +1 -0
- package/dist/validate/validationLocation.d.ts +3 -0
- package/dist/validate/validationLocation.js +120 -0
- package/dist/validate/validationLocation.js.map +1 -0
- package/lessons/STYLE_GUIDE.md +304 -0
- package/lessons/woowacourse-kotlin-blackjack/2chang5/33-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +293 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/52-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +106 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/9-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/14-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +182 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/37-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +122 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/12-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +117 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/38-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +291 -0
- package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/119-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +251 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/137-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +459 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/100-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/82-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +303 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/71-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +134 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/96-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +323 -0
- package/lessons/woowacourse-kotlin-blackjack/JoYehyun99/66-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +210 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/101-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +191 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/80-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/108-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +516 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/133-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +541 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/22-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/48-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/16-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +228 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/54-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +227 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/76-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +203 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/105-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +162 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/64-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/18-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/36-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +769 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/19-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +226 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/59-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +193 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/70-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/98-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/123-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +277 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/150-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/26-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +259 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/43-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +189 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/109-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +351 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/149-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +147 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/121-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +168 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/153-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +116 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/126-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +680 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/142-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +739 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/116-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/147-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +244 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/78-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +232 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/88-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +137 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/112-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/148-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +240 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/102-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +146 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/69-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/118-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +397 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/141-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +215 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/106-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +395 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/134-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/62-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +230 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/89-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +169 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/110-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/132-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +573 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/103-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/81-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +301 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/21-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +613 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/35-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +691 -0
- package/lessons/woowacourse-kotlin-blackjack/hyunji1203/13-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/79-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +153 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/85-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +318 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/128-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/135-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/28-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +346 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/49-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +360 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/30-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +152 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/42-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +213 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/73-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +247 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/87-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +900 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/125-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +248 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/151-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +243 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/63-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +281 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/92-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +283 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/113-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +348 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/140-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/61-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +270 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/93-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +465 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/107-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +296 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/145-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +316 -0
- package/lessons/woowacourse-kotlin-blackjack/ki960213/11-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/72-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +458 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/97-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +225 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/68-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/94-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +158 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/65-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +252 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/90-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +460 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/32-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/46-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +285 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/122-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +177 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/144-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +155 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/130-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/143-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +678 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/114-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +262 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/131-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +498 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/77-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +287 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/91-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +280 -0
- package/lessons/woowacourse-kotlin-blackjack/no1msh/31-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/24-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +302 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/58-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +391 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/111-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/136-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +540 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/117-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +819 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/139-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/20-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +258 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/41-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +171 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/34-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +289 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/8-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/17-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/50-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +145 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/23-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/39-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/129-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +726 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/138-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +845 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/67-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +220 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/99-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +229 -0
- package/lessons/woowacourse-kotlin-blackjack/s9hn/10-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +284 -0
- package/lessons/woowacourse-kotlin-blackjack/sh1mj1/75-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/74-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/95-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/15-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +132 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/47-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/29-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/51-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/115-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/154-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +298 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/25-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +235 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/53-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +130 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/124-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +486 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/152-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +482 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/120-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +194 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/146-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +444 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
- package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
- package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
- package/lessons/woowacourse-racingcar/2chang5/33-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/2chang5/75-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/CFalws/85-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Choisehyeon/46-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/DYGames/49-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/40-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +64 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/57-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/137-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/170-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Hevton/106-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
- package/lessons/woowacourse-racingcar/Hogu59/108-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Hogu59/125-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/111-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/88-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/127-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/90-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/133-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/159-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
- package/lessons/woowacourse-racingcar/README.md +69 -0
- package/lessons/woowacourse-racingcar/RightHennessy/51-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/RightHennessy/58-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/RunaNam/81-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/37-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/66-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/Songusika/84-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/114-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/96-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
- package/lessons/woowacourse-racingcar/aprilgom/97-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/awesomeo184/23-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/35-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/59-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/briandr97/54-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
- package/lessons/woowacourse-racingcar/chaehyuns/99-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/chanho0908/147-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/chanho0908/160-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/chws0508/45-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/chws0508/73-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/cucumber99/132-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/cucumber99/177-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/devfeijoa/146-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/doabletuple/149-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/doabletuple/175-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/donghyun81/154-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/dpcks0509/103-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/dpcks0509/112-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/drunkenhw/82-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/etama123/145-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/gaeun5744/93-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/gahyunkim/134-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/gahyunkim/164-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/giovannijunseokim/140-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/haeum808/101-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
- package/lessons/woowacourse-racingcar/hwannow/141-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/hwannow/157-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/hxeyexn/109-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/hxeyexn/128-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/hyemdooly/50-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/hyemdooly/68-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/hyunji1203/29-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/hyunji1203/60-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/ii2001/102-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/ii2001/122-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/ijh1298/144-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/injoon2019/24-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/inseonyun/44-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/inseonyun/76-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/ippnsj/36-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/ippnsj/67-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/110-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/89-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/jinuemong/104-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/jinuemong/117-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/jiyuneel/142-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/junjange/113-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +41 -0
- package/lessons/woowacourse-racingcar/junjange/87-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/junseo511/148-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/junseo511/165-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/ki960213/32-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/ki960213/63-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/kimhm0728/100-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/105-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/kmkim2689/123-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/kmkim2689/92-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/krrong/34-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +63 -0
- package/lessons/woowacourse-racingcar/m6z1/150-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/m6z1/156-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +40 -0
- package/lessons/woowacourse-racingcar/medAndro/153-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/moondev03/135-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/moondev03/161-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/murjune/121-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/murjune/95-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/no1msh/43-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/no1msh/69-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/otter66/48-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/otter66/77-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/oungsi2000/152-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/oungsi2000/187-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/143-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/158-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/pingu244/38-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/pingu244/62-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/re4rk/28-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/re4rk/55-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/42-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/74-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/rhthrhrl0/31-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/rosemin928/138-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rosemin928/171-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +38 -0
- package/lessons/woowacourse-racingcar/s6m1n/120-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/s6m1n/91-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/s9hn/53-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/s9hn/78-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/sh1mj1/107-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sh1mj1/115-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/songpink/119-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/songpink/98-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sujin9/52-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/sujin9/61-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/47-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/64-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/tobae-time/151-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/tobae-time/167-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/whk06061/41-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/wondroid-world/136-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/wondroid-world/166-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/yrsel/139-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/yujamint/83-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/package.json +46 -0
- package/skills/oh-my-oop/SKILL.md +39 -0
|
@@ -0,0 +1,819 @@
|
|
|
1
|
+
# PR #117 — [블랙잭 1단계] 제이 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@parkjiminnnn](https://github.com/parkjiminnnn)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/117
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** [@woowahan-dino](https://github.com/woowahan-dino) (디노) — **신규 reviewer — 13번째**
|
|
7
|
+
- **라인 코멘트:** 25 스레드 — *현실 메타포 정합 (카드뭉치에서 카드 꺼내 플레이어 받는다) + 함수 vs 필드 vs computed property (`get()=`) 학생 자가 의문 + Ace 합산 수학적 풀이 + 외부글 (수학 공식) + Kotlin `by` delegation + Iterable 구현 + 함수형 프로그래밍 학습 미션 어휘 + 테스트 하드코드 검증 + `isHit` → `canHit` 이름 vs 의미 + ViewMapper 분리 + drawCount 2역할 분리 + 자식 한정 `protected`*
|
|
8
|
+
- **신규 reviewee** (2025년 코호트 — 3번째 코호트 합류 — 2023, 2024, 2025).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 의문 + 셀프 체크리스트 + 집중 리뷰 영역 명시
|
|
13
|
+
|
|
14
|
+
PR 본문 구조:
|
|
15
|
+
- **셀프 체크리스트 7항목** (정상 동작 / 테스트 / 피드백 반영 / 코딩 스타일 / 린트 / 프로그래밍 요구사항 / README).
|
|
16
|
+
- **집중 리뷰 영역 명시** *"객체의 역할에 맞게 잘 분리했는지 봐주세요!"* + *"변수명이나 함수명이 적절한가요?"*.
|
|
17
|
+
- **코드 리뷰 커뮤니케이션 자가 의문** — `Get 함수 vs val 필드` 학생 자가 의문 (디노 답변 → Thread 5·14·18 등 multi-thread 후속 토론).
|
|
18
|
+
|
|
19
|
+
→ **체계화된 PR 본문 모범 (2025 코호트 신규 스타일)** — *셀프 체크리스트 = CI 자가 점검 + 학생 자가 의문 명시*. PR #14·#106·#80·#82·#107·#46·#91·#11·#13·#18·#73 의 *자가 의문 PR 본문* 패턴 강화.
|
|
20
|
+
|
|
21
|
+
학생 자가 의문 인용:
|
|
22
|
+
|
|
23
|
+
> *"아래 코드의 Get 함수들을 필드로 선언하는게 나을지 함수로 선언하는게 더 나을지 궁금해요 디노! 저는 함수로 하는게 맞는 것 같아용..*
|
|
24
|
+
> ```kotlin
|
|
25
|
+
> fun getInitialCards(): Cards { ... }
|
|
26
|
+
> fun getCardsCount() = allCards.size
|
|
27
|
+
> ```"
|
|
28
|
+
|
|
29
|
+
reviewer 후속 (Thread 3·5·14·18):
|
|
30
|
+
|
|
31
|
+
- *property val vs computed property 양가성*.
|
|
32
|
+
- *`val cardScore: Int = cardRank.score` (즉시 초기화) vs `get() = cardRank.score` (매 호출 계산) 트레이드오프*.
|
|
33
|
+
|
|
34
|
+
→ **MCP 룰 `property-val-vs-computed-property` 후보** — *Kotlin val 즉시 초기화 vs get() 매 호출 트레이드오프*.
|
|
35
|
+
|
|
36
|
+
### 2. `data class Card(private val cardRank, private val shape)` + 3 속성 — value object
|
|
37
|
+
|
|
38
|
+
```kotlin
|
|
39
|
+
data class Card(private val cardRank: CardRank, private val shape: Shape) {
|
|
40
|
+
val cardScore: Int = cardRank.score
|
|
41
|
+
val cardName: Pair<String, String> = cardRank.name to shape.name
|
|
42
|
+
val isAceCard: Boolean = cardRank == CardRank.ACE
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
→ **`isAceCard: Boolean = cardRank == CardRank.ACE`** = reviewer 권유 (Thread 2) *자가 적용 완료*.
|
|
47
|
+
|
|
48
|
+
다만 **`cardName: Pair<String, String>` 누수** = *Pair 튜플 = 도메인 어휘 누수* (PR #36 (boogi-woogi *`List<Pair<String, Int>>` 뷰가 도메인을 너무 잘 알고 있다*) 결).
|
|
49
|
+
|
|
50
|
+
### 3. `enum class CardRank(val score: Int)` + Ace 11 기본
|
|
51
|
+
|
|
52
|
+
```kotlin
|
|
53
|
+
enum class CardRank(val score: Int) {
|
|
54
|
+
ACE(11),
|
|
55
|
+
KING(10), QUEEN(10), JACK(10),
|
|
56
|
+
TWO(2), THREE(3), ..., TEN(10),
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
→ **Ace 11 기본 + while 차감 보정** (`ScoreCalculator.calculateTotalCardScore`) — PR #20·#64·#110·#28·#125·#147·#82 의 *Ace 11 기본 + while 차감 안티패턴* 결.
|
|
61
|
+
|
|
62
|
+
다만 *수학적 풀이 (reviewer Thread 23 후속 권유)* 로 *while 제거 완료* — `totalCardScore - ACE_MINUS_VALUE * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / ACE_MINUS_VALUE + 1)`. **MCP 룰 `ace-bonus-mathematical-vs-iterative` 후보**.
|
|
63
|
+
|
|
64
|
+
### 4. `Players` Kotlin `by` delegation 자가 적용
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
class Players(private val players: List<Player>) : List<Player> by players {
|
|
68
|
+
val names: List<String> = players.map { player -> player.name }
|
|
69
|
+
val cardNames: List<List<Pair<String, String>>>
|
|
70
|
+
get() = players.map { player -> player.cardNames }
|
|
71
|
+
...
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
→ **Kotlin `by` delegation 활용** — reviewer (Thread 8) *Kotlin delegation 권유 외부글* (kotlinlang.org/docs/delegation.html) → 학생 자가 적용.
|
|
76
|
+
|
|
77
|
+
다만 **delegation = §PR #21 의 *일급 컬렉션 위임 = 나쁜 습관* 반대 시점**:
|
|
78
|
+
|
|
79
|
+
PR #21 (galcyurio) 의 *위임 = 컬렉션처럼 쓰는 나쁜 습관* vs PR #117 (woowahan-dino) 의 *delegation 어휘 권유*. **2 reviewer 의 *반대 시점***.
|
|
80
|
+
|
|
81
|
+
#### 4.1. *2 가지 트레이드오프*
|
|
82
|
+
|
|
83
|
+
| 안 | 장점 | 단점 |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `by` delegation (현재) | *Kotlin 어휘 + List 메서드 자동 제공 (forEach/map/filter)* | *Tell-Don't-Ask 위반 위험 (List 처럼 사용) + 도메인 메시지 가시성 ↓* |
|
|
86
|
+
| 일급 컬렉션 + 도메인 메시지만 | *Tell-Don't-Ask 정공 + 도메인 의도 명확* | *List 메서드 X (외부 호출 시 불편)* |
|
|
87
|
+
|
|
88
|
+
→ **2 reviewer 메타 어휘 = MCP `oop_propose_alternatives` 핵심 가치 합류 (개인 의견 분리)**.
|
|
89
|
+
|
|
90
|
+
PR #21 (galcyurio) + PR #117 (woowahan-dino) — *delegation 정공 토론*.
|
|
91
|
+
|
|
92
|
+
### 5. `protected fun addCard(card: Card)` 자식 한정 가시성 자가 적용
|
|
93
|
+
|
|
94
|
+
```kotlin
|
|
95
|
+
abstract class Participant(private val cards: Cards) {
|
|
96
|
+
...
|
|
97
|
+
protected fun addCard(card: Card) {
|
|
98
|
+
handCards.add(card)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
→ reviewer (Thread 16) *"지금은 addCard() 함수가 자식 클래스에서만 사용하도록 되어있는데 자식 클래스에서만 접근가능하도록 접근제어자를 추가해보면 어떨까요?"* → 학생 자가 적용. **`protected` 가시성 = 자식 한정 + 외부 호출 차단**. PR #87 결.
|
|
104
|
+
|
|
105
|
+
### 6. `ScoreCalculator.adjustAceScore` 수학적 풀이 — while 제거
|
|
106
|
+
|
|
107
|
+
```kotlin
|
|
108
|
+
private fun adjustAceScore(totalCardScore: Int, aceCount: Int) =
|
|
109
|
+
totalCardScore - ACE_MINUS_VALUE * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / ACE_MINUS_VALUE + 1)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
→ **`while` 반복 → 수학적 단일 식 변환** (reviewer Thread 23 권유 → 학생 자가 적용).
|
|
113
|
+
|
|
114
|
+
#### 6.1. *수학 공식 도출*
|
|
115
|
+
|
|
116
|
+
- Ace 11→1 = -10 점.
|
|
117
|
+
- 초과 점수 = `totalCardScore - BLACKJACK_SCORE` (양수).
|
|
118
|
+
- 필요한 -10 회수 = `초과 / 10 + 1` (1 부터 시작 = +1).
|
|
119
|
+
- 다만 최대 -10 회수 = `aceCount` (Ace 개수 한정) → `coerceAtMost(aceCount)`.
|
|
120
|
+
|
|
121
|
+
→ **MCP 룰 `iterative-loop-vs-math-formula` 강화** — *반복문 의존 vs 수학적 단일 식*. 외부글 동반.
|
|
122
|
+
|
|
123
|
+
PR #87 (mutableMap → fold) 결의 *명령형 vs 함수형/수학적* 어휘 합류.
|
|
124
|
+
|
|
125
|
+
### 7. 모든 25 스레드 학생 자가 답변 + 커밋 SHA 첨부
|
|
126
|
+
|
|
127
|
+
25 스레드 전부 학생이 *반영 커밋 링크 (`https://github.com/woowacourse/kotlin-blackjack/pull/117/commits/<sha>`)* 첨부.
|
|
128
|
+
|
|
129
|
+
→ **학생 자가 학습 가시화 모범 = 학습 가시화 정점**. PR #124·#128·#135·#108·#133·#136·#137·#148·#151·#146·#147·#88·#36·#87 결.
|
|
130
|
+
|
|
131
|
+
### 추가 칭찬
|
|
132
|
+
|
|
133
|
+
- *Thread 5*: *"너무 좋습니다 👍 저는 여기서 get함수보다 val로 선언해서 가져와도 좋다고 봐요"* — *학생 자가 의문 + reviewer confederate*.
|
|
134
|
+
|
|
135
|
+
## 못한 점 (설계 관점)
|
|
136
|
+
|
|
137
|
+
### 1. `createCardRank` 함수명 vs 실제 반환 — 이름·반환 불일치
|
|
138
|
+
|
|
139
|
+
reviewer (Thread 1):
|
|
140
|
+
|
|
141
|
+
> *"createCardRank 라는 함수명을 봤을 때는 CardRank를 만들어서 반환하는 느낌인데 함수 구현부는 그렇지 않네요. 적절한 함수명으로 변경하거나, cards를 전달하지 않고 `List<Card>`를 반환하는 형태로 변경해보면 어떨까요?"*
|
|
142
|
+
|
|
143
|
+
학생: *"함수명을 변경했습니당 🫠"*
|
|
144
|
+
|
|
145
|
+
→ **함수 이름·반환 의미 불일치** — PR #36 (boogi-woogi `decideAceValue` 1 or 11 예상 vs 실제 추가 점수) 결 강화.
|
|
146
|
+
|
|
147
|
+
**MCP 룰 `function-name-vs-return-semantic-mismatch` 강화** 누적 3+ PR (#36·#117·#21).
|
|
148
|
+
|
|
149
|
+
### 2. `cardName.contains("A")` vs `cardRank == CardRank.ACE` — Stringly-typed 회피
|
|
150
|
+
|
|
151
|
+
reviewer (Thread 2):
|
|
152
|
+
|
|
153
|
+
> *"cardName에 'A'가 포함되어 있는 것 보다 cardRank가 ACE인지 확인하면 어떨까요??*
|
|
154
|
+
> ```
|
|
155
|
+
> fun isAceCard(): Boolean = cardRank == CardRank.ACE
|
|
156
|
+
> ```"
|
|
157
|
+
|
|
158
|
+
학생: *"굳이 문자열 값을 비교하지 않고 cardRank에 담겨 있는 값을 통해 비교하는게 더 좋을 것 같네용"*
|
|
159
|
+
|
|
160
|
+
→ **Stringly-typed vs enum 비교** — *문자열 검색 = 오타 위험 + 의미 누수* vs *enum 비교 = 컴파일러 강제*.
|
|
161
|
+
|
|
162
|
+
**MCP 룰 `stringly-typed-vs-enum-comparison` 후보** — *문자열 contains vs enum equality*.
|
|
163
|
+
|
|
164
|
+
PR #20·#28·#125·#147·#65·#92 결의 *enum의 UI value* 안티패턴 변형 (UI 값 검색).
|
|
165
|
+
|
|
166
|
+
### 3. `val cardScore: Int = cardRank.score` vs `get() = cardRank.score` — property val vs computed property
|
|
167
|
+
|
|
168
|
+
reviewer (Thread 3):
|
|
169
|
+
|
|
170
|
+
> *"`val cardScore: Int = cardRank.score`*
|
|
171
|
+
> *로 하는 것과*
|
|
172
|
+
> *`val cardScore: Int`*
|
|
173
|
+
> *` get() = cardRank.score`*
|
|
174
|
+
> *로 하는 것은 어떤차이가 있을까요?*
|
|
175
|
+
>
|
|
176
|
+
> *이 코드에서는 어떤게 더 적합할지 한번 고민해보면 좋을 것 같아요"*
|
|
177
|
+
|
|
178
|
+
학생: *"score값을 매번 초기화해줄 필요없이 한번만 해도 된다고 생각하기 때문에 이렇게 하는게 맞는 것 같아요!"*
|
|
179
|
+
|
|
180
|
+
reviewer 후속 (Thread 14): *"함수보다 field로 사용하면 더 좋을 것 같네요"*
|
|
181
|
+
reviewer 후속 (Thread 18): *"카드를 추가할 때 마다 새로운 값을 가져와야 한다면 `get() =` 을 사용하면 됩니다."*
|
|
182
|
+
|
|
183
|
+
→ **Kotlin property 3 가지 형태**:
|
|
184
|
+
|
|
185
|
+
| 안 | 의미 | 적합 시점 |
|
|
186
|
+
|---|---|---|
|
|
187
|
+
| `val cardScore: Int = cardRank.score` | *인스턴스 생성 시 한 번 초기화 + 불변* | *값이 인스턴스 생애 동안 변하지 않을 때* (현재 Card 의 cardScore) |
|
|
188
|
+
| `val cardScore: Int get() = cardRank.score` | *매 호출 시 계산 + 항상 최신* | *값이 변할 수 있을 때 / 의존성이 mutable* |
|
|
189
|
+
| `fun getCardScore(): Int = cardRank.score` | *매 호출 시 계산 + 함수 의도 명시* | *부작용 가능 / 인자 필요 / 명령형 동작* |
|
|
190
|
+
|
|
191
|
+
#### 3.1. *Kotlin 어휘 정공*
|
|
192
|
+
|
|
193
|
+
PR 본문 자가 의문 (Get 함수 vs val) → reviewer 다회 답변 (Thread 3·5·14·18) → 학생 multi-step 자가 학습.
|
|
194
|
+
|
|
195
|
+
**MCP 룰 `property-val-vs-computed-property` 후보** — *Kotlin property 3 형태 트레이드오프*.
|
|
196
|
+
|
|
197
|
+
### 4. `distinct()` vs `toSet()` — 함수 의도 양가
|
|
198
|
+
|
|
199
|
+
reviewer (Thread 4):
|
|
200
|
+
|
|
201
|
+
> *"distinct() 함수가 어떻게 구현되어 있는지 한번 보시고 distinct()대신 다른 함수를 쓰도록 변경해보면 좋을 것 같습니다. 아니면 제이는 여기서 distinct()를 사용하신 이유가 중복제거 외에 다른 의미도 있었을까요?"*
|
|
202
|
+
|
|
203
|
+
학생: *"중복제거 말고는 다른 의미는 없었어요..😅"*
|
|
204
|
+
|
|
205
|
+
→ **`distinct()` vs `toSet()` 의미 비교**:
|
|
206
|
+
|
|
207
|
+
| 함수 | 의도 | 비용 |
|
|
208
|
+
|---|---|---|
|
|
209
|
+
| `distinct()` | *순서 보존 + 중복 제거 (List 유지)* | *O(n) + HashSet 보조 자료구조 내부* |
|
|
210
|
+
| `toSet()` | *순서 X + 중복 자가 X* | *O(n) + HashSet* |
|
|
211
|
+
|
|
212
|
+
학생의 *카드 중복 invariant 검증* 용도 = *순서 보존 불필요* → `toSet()` 적합.
|
|
213
|
+
|
|
214
|
+
```kotlin
|
|
215
|
+
// AS-IS
|
|
216
|
+
require(allCards.distinct().size == getCardsCount())
|
|
217
|
+
// TO-BE
|
|
218
|
+
require(allCards.toSet().size == totalCount)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**MCP 룰 `distinct-vs-toSet-intent` 후보** — *함수 의도 = 순서 보존 여부*.
|
|
222
|
+
|
|
223
|
+
### 5. `getCardsCount` → `cardsCount` — Cards 클래스 내 *count* 어휘
|
|
224
|
+
|
|
225
|
+
reviewer (Thread 5):
|
|
226
|
+
|
|
227
|
+
> *"저는 여기서 get함수보다 val로 선언해서 가져와도 좋다고 봐요. getCardsCount보다 cardsCount가 더 좋아보이고 이미 class 이름이 Cards니까 count만 해도 되지 않을까 싶습니다. 제이가 제 피드백이 괜찮다고 생각하시면 다른 것들도 같이 반영해봐도 좋을 것 같습니다~"*
|
|
228
|
+
|
|
229
|
+
학생: *"카드를 추가할 때마다 초기화 해줘야 해서 val로 선언하면 안될 것 같네용..🥲 함수명만 수정하겠습니당"*
|
|
230
|
+
|
|
231
|
+
reviewer 후속 (Thread 18): *"카드를 추가할 때 마다 새로운 값을 가져와야 한다면 `get() =` 을 사용하면 됩니다."*
|
|
232
|
+
|
|
233
|
+
→ **클래스 명 = 의도 일부 → 멤버 명 중복 회피** (`Cards.cardsCount` vs `Cards.count` vs `Cards.totalCount`). 학생 최종 `totalCount` 자가 적용.
|
|
234
|
+
|
|
235
|
+
**MCP 룰 `member-name-includes-class-name` 후보** — *Cards.cardsCount = 클래스 이름 중복*.
|
|
236
|
+
|
|
237
|
+
### 6. `isHit` → `canHit` — 이름 의미 정확성
|
|
238
|
+
|
|
239
|
+
reviewer (Thread 6):
|
|
240
|
+
|
|
241
|
+
> *"함수를 사용하는 곳을 보니 **hit이 가능할 때 카드를 받는다** 인 것 같아요. isHit이라는 것 Hit이냐? 라는 의미라 적절한 이름은 아니라고 생각합니다. Hit이 가능한지? 라는 의미로 canHit 정도로 하면 어떨까요?"*
|
|
242
|
+
|
|
243
|
+
학생: *"좋은데요? 가시죠!!"*
|
|
244
|
+
|
|
245
|
+
→ **이름 의미 정확성** — *isHit (지금 Hit이다) vs canHit (Hit 가능하다)* 의 도메인 의미 차이.
|
|
246
|
+
|
|
247
|
+
**MCP 룰 `is-vs-can-prefix-semantics` 후보** — *is-prefix (현재 상태) vs can-prefix (가능 여부) 의미 구분*. PR #21 (Player.isHit() = !isBust()) 결의 *Hit 자동 시점 vs 사용자 선택* 변형.
|
|
248
|
+
|
|
249
|
+
### 7. `16` 매직 넘버 → 상수
|
|
250
|
+
|
|
251
|
+
reviewer (Thread 7):
|
|
252
|
+
|
|
253
|
+
> *"여기서 16이 어떤 의미인지 상수로 빼서 관리하면 어떨까요??"*
|
|
254
|
+
|
|
255
|
+
학생 자가 적용: `private const val DEALER_HIT_LIMIT = 16`.
|
|
256
|
+
|
|
257
|
+
→ **매직 넘버 회피 + 도메인 의미 어휘** (Dealer hit 한계 = 16). PR #20·#28·#125·#125·#147·#65·#92·#36 결.
|
|
258
|
+
|
|
259
|
+
### 8. `score = calculateCardScore() - cards.aceCount() + cards.aceCount()` inline 정리 — 동치 표현 회피
|
|
260
|
+
|
|
261
|
+
reviewer (Thread 10):
|
|
262
|
+
|
|
263
|
+
> *"score를 만들기 위해 호출하는 함수들을 전부 inline처리하면 이렇게 되네요*
|
|
264
|
+
> *`var score = calculateCardScore() - cards.aceCount() + cards.aceCount()`*
|
|
265
|
+
> *cards.aceCount를 빼고 더해서 사실상 calculateCardScore()만 해도 되겠네요"*
|
|
266
|
+
|
|
267
|
+
→ **함수 합성 후 동치 식 = 추상화 의도 누수** — *Score = score - aceCount + aceCount = score*. **추상화가 동작 의도를 가리는 안티패턴**.
|
|
268
|
+
|
|
269
|
+
#### 8.1. *함수 합성 시 동치 검증*
|
|
270
|
+
|
|
271
|
+
학생 초기 코드:
|
|
272
|
+
```kotlin
|
|
273
|
+
fun calculate(cards: Cards): Int {
|
|
274
|
+
var score = calculateCardScore(cards)
|
|
275
|
+
score = subtractAceCount(score, cards)
|
|
276
|
+
score = addAceCount(score, cards)
|
|
277
|
+
return score
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
→ *함수 3 단계 분리 → inline 시 `score - aceCount + aceCount = score` 자명*. **함수 분리가 *추상화 의도 X*** = *함수 분리 비용만 발생*.
|
|
282
|
+
|
|
283
|
+
**MCP 룰 `function-decomposition-creates-identity` 후보** — *함수 분리가 inline 후 동치 = 추상화 의도 X*. PR #36·#46·#39 (function-decomposition-excess) 결 강화.
|
|
284
|
+
|
|
285
|
+
### 9. 반복문 의존 vs 수학적 풀이 — Ace 합산 + 외부글
|
|
286
|
+
|
|
287
|
+
reviewer (Thread 11):
|
|
288
|
+
|
|
289
|
+
> *"개발을 하다보면 가끔 반복문에 너무 의존하게 될 때가 있습니다. 우리가 만약에 1부터 10까지 합을 구한다고 하면 1부터 10까지 반복문을 돌리는 것을 먼저 떠올리게 됩니다. 하지만 그것보다 더 좋은 수학적인 방법이 존재합니다. 이 로직도 꼭 반복문을 돌려야하는지? 수학적으로 풀 수 없는지? 를 생각해보면 좋을 것 같습니다.*
|
|
290
|
+
> *https://leebaro.tistory.com/entry/1%EB%B6%80%ED%84%B0-10%EA%B9%8C%EC%A7%80-%EC%88%AB%EC%9E%90%EB%A5%BC-%ED%95%A9%ED%95%98%EB%8A%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98"*
|
|
291
|
+
|
|
292
|
+
학생 자가 한계 인정:
|
|
293
|
+
|
|
294
|
+
> *"가지고 있는 ace카드의 개수만큼 반복문으로 카드를 힛하는 턴마다의 카드의 총합을 계산해서 ace카드의 점수를 유동적으로 바꿀 수 있다고 생각을 합니다.. 근데 반복문을 사용하지 않고 수학적인 방법으로만 턴마다 카드 점수의 총합을 유동적으로 계산하는건 어떻게 해야 할지 도저히 감이 안 잡히는데 힌트를 조금만 더 주실 수 있을까요?🥺"*
|
|
295
|
+
|
|
296
|
+
reviewer 후속 (Thread 23 — 힌트):
|
|
297
|
+
|
|
298
|
+
> *"이렇게 하면 while 없이 계산해서 넣을 수 있겠네요*
|
|
299
|
+
> ```kotlin
|
|
300
|
+
> val totalCardScore = cards.scores().sum()
|
|
301
|
+
> val aceCount = cards.aceCount()
|
|
302
|
+
> return if (totalCardScore > BLACKJACK_SCORE && aceCount > 0) {
|
|
303
|
+
> totalCardScore - 10 * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / 10 + 1)
|
|
304
|
+
> } else {
|
|
305
|
+
> totalCardScore
|
|
306
|
+
> }
|
|
307
|
+
> ```"
|
|
308
|
+
|
|
309
|
+
학생: *"감사합니당. if문으로 조건을 나눌 생각을 못했네요😅"*
|
|
310
|
+
|
|
311
|
+
→ **반복문 의존 vs 수학적 풀이 + 외부글 + 학생 자가 힌트 요청 + reviewer 후속 답변**:
|
|
312
|
+
|
|
313
|
+
#### 9.1. *3 가지 학습 시점*
|
|
314
|
+
|
|
315
|
+
1. **반복문 의존 안티패턴 인식** — *Ace = 1↔11 분기 = while 도는 반사적 반응*.
|
|
316
|
+
2. **수학적 풀이 = `초과 / 10 + 1` (단일 식)** — `coerceAtMost(aceCount)` 활용.
|
|
317
|
+
3. **외부글 + 학생 자가 힌트 요청 = 학생 학습 적극성** — *reviewer 답변 제공*.
|
|
318
|
+
|
|
319
|
+
**MCP 룰 `iterative-loop-vs-math-formula` 강화** ⭐⭐. PR #87 (mutableMap → fold) 결과 같은 *명령형 vs 함수형/수학적* 어휘 합류.
|
|
320
|
+
|
|
321
|
+
### 10. `model = domain vs view` — ViewMapper 분리 + Cards.isDisplayName 확장함수
|
|
322
|
+
|
|
323
|
+
reviewer (Thread 12):
|
|
324
|
+
|
|
325
|
+
> *"미션을 하고 있는 프로젝트에서 model이라는게 domain관점인지 view관점인지가 중요할 것 같아요. domain 관점에서는 title이라는 view 관점의 값들이 들어있는게 맞을까? 라는 의문을 가져보면 어떨까요?*
|
|
326
|
+
>
|
|
327
|
+
> ***ViewMapper나 Cards.isDisplayName()과 같은 확장함수를 사용하는 방식*** *도 괜찮은 방법 입니다."*
|
|
328
|
+
|
|
329
|
+
학생 자가 적용 (4 commit):
|
|
330
|
+
- *ViewMapper 클래스 생성*.
|
|
331
|
+
- *카드이름의 출력방식 변경 함수 생성*.
|
|
332
|
+
- *title 프로퍼티 제거*.
|
|
333
|
+
- *반환 타입 변경*.
|
|
334
|
+
|
|
335
|
+
→ **Model → View 의존성 분리 = MVC 절대 원칙** + **ViewMapper / 확장함수 2 가지 안**:
|
|
336
|
+
|
|
337
|
+
#### 10.1. *3 가지 대안*
|
|
338
|
+
|
|
339
|
+
| 안 | 장점 | 단점 |
|
|
340
|
+
|---|---|---|
|
|
341
|
+
| Model 안 UI 메서드 (학생 초안 *title* 프로퍼티) | *카드 자가 표현 보유 + 호출 간결* | *Model → View 결합 + MVC 위반* |
|
|
342
|
+
| `ViewMapper` 별도 클래스 (학생 자가 적용) | *변환 책임 명확 + Model 순수* | *클래스 ↑ + 매핑 보일러플레이트* |
|
|
343
|
+
| `Cards.isDisplayName()` 확장함수 (reviewer 권유) | *Kotlin 어휘 + Model 순수 + 호출 간결* | *확장함수 검색성 ↓ + import 누수* |
|
|
344
|
+
|
|
345
|
+
**MCP 룰 `view-mapper-vs-extension-function` 후보** — *Model→View 분리 방법 트레이드오프*. PR #21·#87·#88·#80·#76 결 강화.
|
|
346
|
+
|
|
347
|
+
### 11. 현실 메타포 정합 — *카드뭉치에서 카드 꺼내 플레이어 받는다*
|
|
348
|
+
|
|
349
|
+
reviewer (Thread 13):
|
|
350
|
+
|
|
351
|
+
> *"이 동작에 대해서 생각해볼 필요가 있을 것 같아요. 현실에서는 카드뭉치에서 카드 한장을 꺼내서 플레이어가 받는다 라는 동작인데 이 코드를 보면 플레이어가 카드뭉치를 받고 거기서 카드를 받는 동작으로 보여요. 이 부분을 개선해보면 어떨까요?"*
|
|
352
|
+
|
|
353
|
+
학생 자가 적용: *"뽑은 카드를 받는 기능으로 변경"*.
|
|
354
|
+
|
|
355
|
+
→ **현실 메타포 정합 = 책임 분배 단계의 핵심**:
|
|
356
|
+
|
|
357
|
+
#### 11.1. *3 가지 책임 분배 안*
|
|
358
|
+
|
|
359
|
+
| 안 | 메타포 | 책임 |
|
|
360
|
+
|---|---|---|
|
|
361
|
+
| `player.receiveCards(deck)` (학생 초안) | *플레이어가 카드덱을 받음 → 거기서 카드 받음* | *플레이어 ↔ 카드덱 양방향 + 메타포 X* |
|
|
362
|
+
| `deck.dealTo(player)` | *카드덱이 분배자 = 플레이어에게 카드 줌* | *카드덱이 분배 책임 (카지노 메타포)* |
|
|
363
|
+
| `player.receive(drawnCard: Card)` (학생 자가 적용) | *플레이어가 *이미 뽑힌 카드 1장* 받음* | *현실 정공 (딜러가 뽑아서 줌)* |
|
|
364
|
+
|
|
365
|
+
→ **현실 메타포 = 객체 책임 분배 핵심 어휘** = **MCP `oh-my-oop` 핵심 가치**. PR #31 (no1msh *발급기 그 자체에게는 돈이 필요하지 않다*) 결 + PR #21 (CardPicker = 가상 객체) 결.
|
|
366
|
+
|
|
367
|
+
**MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ — *현실에서 누가 이 일을 하는가*. 누적 8+ PR.
|
|
368
|
+
|
|
369
|
+
### 12. MutableList 회피 — 함수형 프로그래밍 학습 미션 어휘
|
|
370
|
+
|
|
371
|
+
reviewer (Thread 15):
|
|
372
|
+
|
|
373
|
+
> *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까 MutableList를 만들지 않고 기존에 있는 List나 Array를 사용해서 만들어 보도록 해볼까요? Iterable 확장함수로 여러 함수들이 제공되고 있으니 적절한 함수들을 찾아서 변경해보면 좋을 것 같아요. addCardsByRank()함수도 제거할 수 있을 것 같습니다."*
|
|
374
|
+
|
|
375
|
+
→ **함수형 프로그래밍 학습 미션 어휘 = 의도 명시**:
|
|
376
|
+
|
|
377
|
+
#### 12.1. *학습 의도 = 미션의 본질*
|
|
378
|
+
|
|
379
|
+
reviewer 가 *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까"* 명시 = *학습 목표 의식*. **학생 자가 학습 가시화 어휘**. PR #91·#107·#147·#22·#73·#76·#80·#82·#11·#13 결.
|
|
380
|
+
|
|
381
|
+
#### 12.2. *Iterable 확장함수 (flatMap, map, fold) 권유*
|
|
382
|
+
|
|
383
|
+
학생 초안:
|
|
384
|
+
```kotlin
|
|
385
|
+
fun createCards(): MutableList<Card> {
|
|
386
|
+
val cards = mutableListOf<Card>()
|
|
387
|
+
CardRank.values().forEach { rank -> addCardsByRank(cards, rank) }
|
|
388
|
+
return cards
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
수정 후:
|
|
393
|
+
```kotlin
|
|
394
|
+
fun createCards(): List<Card> =
|
|
395
|
+
CardRank.values().flatMap { rank -> Shape.values().map { shape -> Card(rank, shape) } }
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
PR #21 (CardPackGenerator buildList 4 단계 중첩) 결 + PR #87 (mutableMap → fold) 결 동일 *명령형 vs 함수형* 어휘.
|
|
399
|
+
|
|
400
|
+
**MCP 룰 `mutable-list-vs-functional-pipeline` 후보** — *MutableList 회피 + Iterable 확장함수*.
|
|
401
|
+
|
|
402
|
+
### 13. `drawCount()` 함수 = 2 역할 — count 가져옴 + 카드 뽑음
|
|
403
|
+
|
|
404
|
+
reviewer (Thread 19):
|
|
405
|
+
|
|
406
|
+
> *"drawCount라는 함수가 한가지의 역할만 하지는 않는 것 같아요.*
|
|
407
|
+
>
|
|
408
|
+
> *drawCount만 보면 카드를 뽑은 개수를 가져오는 것으로 느껴지는데 내부에서는 실제로 카드를 뽑을 수 있으면 카드를 뽑는 역할도 하고 있어요. 함수를 분리해볼 수 있지 않을까요?"*
|
|
409
|
+
|
|
410
|
+
학생 자가 적용: *drawCount() 로직 분리*.
|
|
411
|
+
|
|
412
|
+
→ **함수 단일 책임 위반 (SRP)** — *조회 (count 가져옴) + 부작용 (카드 뽑음) 양가*. **CQS (Command-Query Separation) 위반**.
|
|
413
|
+
|
|
414
|
+
#### 13.1. *2 가지 학습*
|
|
415
|
+
|
|
416
|
+
#### 13.1.1. *CQS 원칙*
|
|
417
|
+
|
|
418
|
+
*Command (부작용) vs Query (조회) 분리* = 메서드 1 = 1 역할.
|
|
419
|
+
|
|
420
|
+
학생 코드:
|
|
421
|
+
```kotlin
|
|
422
|
+
fun drawCount(drawnCard: Card): Int {
|
|
423
|
+
var drawCount = DEFAULT_DRAW_COUNT
|
|
424
|
+
drawCount += addDraws(drawnCard) // ← 카드 뽑음 (Command)
|
|
425
|
+
return drawCount // ← count 반환 (Query)
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
→ **Command + Query 양가**. **MCP 룰 `command-query-separation` 후보**.
|
|
430
|
+
|
|
431
|
+
#### 13.1.2. *이름 의미 누수*
|
|
432
|
+
|
|
433
|
+
`drawCount` 이름 = *Query (count 가져옴)* 시사 → *실제는 Command + Query*. PR #36 (decideAceValue 명명·반환 불일치) 결 + Thread 1 (createCardRank) 결.
|
|
434
|
+
|
|
435
|
+
### 14. `enum` 으로 처리 가능 — GameResultDecider
|
|
436
|
+
|
|
437
|
+
reviewer (Thread 20):
|
|
438
|
+
|
|
439
|
+
> *"이것들은 enum으로 처리 할 수 있지 않을까요?"*
|
|
440
|
+
|
|
441
|
+
학생 자가 적용: *VictoryStatus enum 생성 + mapToVictoryStatus 변환*.
|
|
442
|
+
|
|
443
|
+
→ **상수/문자열 → enum 변환** — *컴파일러 강제 + 의미 명시*. PR #20·#28·#125·#147·#65·#92 결.
|
|
444
|
+
|
|
445
|
+
### 15. 테스트 = 하드코드 검증 (CardRank/Shape 변경 안전)
|
|
446
|
+
|
|
447
|
+
reviewer (Thread 22):
|
|
448
|
+
|
|
449
|
+
> *"만약 CardRank나 Shape가 어떤 값이 빠지거나 새로운 값이 추가되면 검증하기 어려울 것 같습니다. 보통 테스트 코드에서는 이렇게 코드를 만드는 것보단 하드코드 된 것으로 검증하는게 좋습니다."*
|
|
450
|
+
|
|
451
|
+
학생 자가 적용.
|
|
452
|
+
|
|
453
|
+
→ **테스트 = 하드코드 검증 정공**:
|
|
454
|
+
|
|
455
|
+
#### 15.1. *Production 코드 의존 X*
|
|
456
|
+
|
|
457
|
+
학생 초기 테스트:
|
|
458
|
+
```kotlin
|
|
459
|
+
@Test fun `카드 생성 테스트`() {
|
|
460
|
+
val cards = CardsGenerator().createCardPack()
|
|
461
|
+
assertEquals(CardRank.values().size * Shape.values().size, cards.totalCount)
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
→ *`CardRank.values().size * Shape.values().size = 13 * 4 = 52`* — *production 코드 의존*. CardRank 추가 시 *테스트 같이 변경됨* → 회귀 감지 X.
|
|
466
|
+
|
|
467
|
+
수정 후:
|
|
468
|
+
```kotlin
|
|
469
|
+
@Test fun `카드 생성 테스트`() {
|
|
470
|
+
val cards = CardsGenerator().createCardPack()
|
|
471
|
+
assertEquals(52, cards.totalCount) // ← 하드코드
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
→ *CardRank 가 13 미만이 되면 테스트 실패 = 회귀 감지*.
|
|
476
|
+
|
|
477
|
+
**MCP 룰 `test-hardcoded-vs-production-derived` 강화** — *테스트 = 하드코드 검증 정공*. 누적 3+ PR (#99·#26·#117).
|
|
478
|
+
|
|
479
|
+
PR #87 (테스트 = 객체 설계 명세서) 결 + PR #21 (테스트 본문 = 필요한 정보) 결 + PR #26 (테스트 = 명세서) 결 합류.
|
|
480
|
+
|
|
481
|
+
### 16. `Players.kt` `val` 자가 적용 권유 — Iterable 구현 시
|
|
482
|
+
|
|
483
|
+
reviewer (Thread 9 + 21):
|
|
484
|
+
|
|
485
|
+
> *"Players 클리스가 Iterable<Player> 이기 때문에 players를 val로 선언하지 않아도 되는 것으로 보입니다."*
|
|
486
|
+
> *"여기도 val로 해볼 수 있겠네요"*
|
|
487
|
+
|
|
488
|
+
→ **Iterable 구현 시 backing list val 불필요** — *delegation 의 의도 명확 → 별도 list 보관 X*.
|
|
489
|
+
|
|
490
|
+
다만 학생 최종 코드 (`class Players(private val players: List<Player>) : List<Player> by players`) = *delegation source 는 여전히 보관* → reviewer 의 권유 ≠ list 제거 = *names/cardNames/scores 같은 *Players 추가 속성*만 val 화*.
|
|
491
|
+
|
|
492
|
+
**MCP 룰 `delegation-source-val-redundancy` 후보** — *delegation source list 보관 의도 점검*.
|
|
493
|
+
|
|
494
|
+
### 17. `showPlayerResult` 파라미터 비대칭 — playersNames 만 외부 전달
|
|
495
|
+
|
|
496
|
+
reviewer (Thread 17):
|
|
497
|
+
|
|
498
|
+
> *"updatedPlayerCardsNames, playersTotalScore 는 players에서 가져오는데 showPlayerResult로 전달되는 playersNames만 함수 외부에서 파라미터로 전달하는 이유가 있나요?"*
|
|
499
|
+
|
|
500
|
+
학생 자가 적용: *showPlayerResult 인자 제거*.
|
|
501
|
+
|
|
502
|
+
→ **함수 인자 일관성 = 객체 가져오는 자리 통일** — *3 인자 중 1 만 외부 전달 = 일관성 X*. **MCP 룰 `function-parameter-asymmetry` 후보**.
|
|
503
|
+
|
|
504
|
+
### 18. `addDraws()` `Dealer.turn()` 의 `canHit()` 중복 호출
|
|
505
|
+
|
|
506
|
+
reviewer (Thread 25):
|
|
507
|
+
|
|
508
|
+
> *"turn()함수에서 canHit()을 호출하고 있기 때문에 addDraws()함수에 있는 while에서는 canHIt()를 호출하지 않아도 될 것 같네요"*
|
|
509
|
+
|
|
510
|
+
학생 코드:
|
|
511
|
+
```kotlin
|
|
512
|
+
override fun turn(drawnCard: Card): Boolean {
|
|
513
|
+
if (canHit()) { addCard(drawnCard); return true }
|
|
514
|
+
return false
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
private fun addDraws(drawnCard: Card): Int {
|
|
518
|
+
var count = DEFAULT_DRAW_COUNT
|
|
519
|
+
while (canHit() && turn(drawnCard)) count++ // ← canHit 중복 호출
|
|
520
|
+
return count
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
→ **canHit 중복 호출** — *while 조건과 turn 내부 모두 canHit 호출* = *2 회 평가*. **MCP 룰 `redundant-guard-condition` 후보**.
|
|
525
|
+
|
|
526
|
+
### 19. `Players` Cards 와 함수 내부 처리 — Controller god-object 예방
|
|
527
|
+
|
|
528
|
+
reviewer (Thread 24):
|
|
529
|
+
|
|
530
|
+
> *"여기도 Players와 Cards를 넘겨서 함수 내부에서 처리 해볼 수 있겠네요"*
|
|
531
|
+
|
|
532
|
+
→ **Controller 가 Players/Cards 외부에서 처리 → Tell-Don't-Ask 위반**. *Players/Cards 가 자가 처리 + 결과만 반환*. PR #87·#36·#28·#92·#48 결.
|
|
533
|
+
|
|
534
|
+
### 20. `Players.toList()` (학생 자가 적용한 일급 컬렉션) — delegation 합류 vs Tell-Don't-Ask
|
|
535
|
+
|
|
536
|
+
§4 참조. PR #21 (galcyurio *delegation = 컬렉션처럼 쓰는 나쁜 습관*) 와 PR #117 (woowahan-dino *delegation 정공*) 의 *반대 시점*.
|
|
537
|
+
|
|
538
|
+
→ **MCP `oop_propose_alternatives` 핵심 가치 합류 정점** — *reviewer 별 의견 차이 인정*.
|
|
539
|
+
|
|
540
|
+
### 21. `Cards.kt` `allCards.toMutableList()` + `allCards.removeAll()` — mutable 누수
|
|
541
|
+
|
|
542
|
+
```kotlin
|
|
543
|
+
class Cards(allCards: List<Card>) {
|
|
544
|
+
val allCards: MutableList<Card> = allCards.toMutableList()
|
|
545
|
+
...
|
|
546
|
+
fun initialCards(): Cards {
|
|
547
|
+
val initialCards = allCards.take(INITIAL_CARD_COUNT)
|
|
548
|
+
allCards.removeAll(initialCards)
|
|
549
|
+
return Cards(initialCards)
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
→ **`val allCards: MutableList<Card>` public 노출** = *외부에서 변경 가능* + *`removeAll` 자가 변경*. **canonical mutable leak**.
|
|
555
|
+
|
|
556
|
+
대안: `private val _cards: MutableList<Card>` + `val cards: List<Card> get() = _cards.toList()` (backing property). PR #18·#36·#21 결.
|
|
557
|
+
|
|
558
|
+
**MCP 룰 `mutable-list-public-exposure` 강화** — 누적 5+ PR.
|
|
559
|
+
|
|
560
|
+
### 22. `GameResultDecider` Tell-Don't-Ask — Dealer/Player score 직접 비교
|
|
561
|
+
|
|
562
|
+
```kotlin
|
|
563
|
+
class GameResultDecider(private val dealer: Dealer, private val players: Players) {
|
|
564
|
+
fun compareWinOrLose(): GameOutput {
|
|
565
|
+
...
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
private fun comparePlayerResult(playerScore: Int): VictoryStatus =
|
|
569
|
+
when {
|
|
570
|
+
dealer.currentScore > BLACKJACK_SCORE -> VictoryStatus.WIN
|
|
571
|
+
playerScore > BLACKJACK_SCORE -> VictoryStatus.LOSE
|
|
572
|
+
else -> compareScores(playerScore)
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
→ **Decider 객체 + Dealer/Player score 외부 꺼내서 비교** = *Tell-Don't-Ask 위반*. PR #87·#36·#28·#92·#48 결.
|
|
578
|
+
|
|
579
|
+
대안: **`Player.compareWith(dealer): VictoryStatus`** 또는 **State 다형성** (PR #93·#136·#152·#98·#87 결).
|
|
580
|
+
|
|
581
|
+
다만 학생의 *GameResultDecider 분리* = *비교 책임 단일 위치* (vs Player.compareWith 가 *Player ↔ Dealer 양방향 결합*).
|
|
582
|
+
|
|
583
|
+
**MCP 룰 `decider-vs-tell-dont-ask` 후보**.
|
|
584
|
+
|
|
585
|
+
### 23. `currentScore` 매 호출 시 `ScoreCalculator(cards).calculateTotalCardScore()` 신규 인스턴스
|
|
586
|
+
|
|
587
|
+
```kotlin
|
|
588
|
+
abstract class Participant(private val cards: Cards) {
|
|
589
|
+
...
|
|
590
|
+
val currentScore: Int
|
|
591
|
+
get() = ScoreCalculator(cards).calculateTotalCardScore()
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
→ **매 호출 시 `ScoreCalculator` 신규 인스턴스 + 계산** = *비용 ↑*. *ScoreCalculator 가 stateless (cards 만 멤버)* → *companion object 정적 메서드* 대안.
|
|
596
|
+
|
|
597
|
+
대안:
|
|
598
|
+
```kotlin
|
|
599
|
+
object ScoreCalculator {
|
|
600
|
+
fun calculateTotalCardScore(cards: Cards): Int = ...
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// 호출
|
|
604
|
+
val currentScore: Int get() = ScoreCalculator.calculateTotalCardScore(cards)
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
**MCP 룰 `stateless-class-vs-companion-object` 후보** — *stateless 클래스 인스턴스화 vs companion object 정적*. PR #20·#28·#125 결.
|
|
608
|
+
|
|
609
|
+
### 24. `Dealer.turn` 반환 boolean 의미 + `Player.turn` 반환 boolean 의미 — 역방향
|
|
610
|
+
|
|
611
|
+
```kotlin
|
|
612
|
+
// Dealer
|
|
613
|
+
override fun turn(drawnCard: Card): Boolean {
|
|
614
|
+
if (canHit()) { addCard(drawnCard); return true }
|
|
615
|
+
return false
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Player
|
|
619
|
+
override fun turn(drawnCard: Card): Boolean {
|
|
620
|
+
if (canHit()) { addCard(drawnCard); return false } // ← Dealer 와 반대
|
|
621
|
+
return true
|
|
622
|
+
}
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
→ **`turn()` 반환 의미 Dealer/Player 역방향** — *Dealer.turn = true (hit 함) / Player.turn = false (hit 함)*.
|
|
626
|
+
|
|
627
|
+
도메인 의미:
|
|
628
|
+
- Dealer: *turn() = true → 계속 hit (16 이하 동안)*.
|
|
629
|
+
- Player: *turn() = true → 종료 (carry, hit 안 함)*.
|
|
630
|
+
|
|
631
|
+
→ **이름·의미 양가** → 사용자 (Controller) 가 *Dealer.turn 인지 Player.turn 인지에 따라 분기 의미 반대*.
|
|
632
|
+
|
|
633
|
+
**MCP 룰 `method-return-semantic-asymmetry-between-subclasses` 후보** — *부모 추상 메서드 반환 의미 자식 별 역방향*.
|
|
634
|
+
|
|
635
|
+
### 25. `Card.cardName: Pair<String, String>` — Tuple 누수
|
|
636
|
+
|
|
637
|
+
```kotlin
|
|
638
|
+
val cardName: Pair<String, String> = cardRank.name to shape.name
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
→ **Tuple `Pair<String, String>` 도메인 어휘 누수** — *(rank, shape) 짝 = 도메인 객체로 표현 권유*. PR #36 (boogi-woogi *`List<Pair<String, Int>>` 뷰가 도메인을 너무 잘 알고 있다*) 결.
|
|
642
|
+
|
|
643
|
+
대안:
|
|
644
|
+
- `data class CardName(val rank: String, val shape: String)`.
|
|
645
|
+
- `fun displayName(): String` (UI 변환 책임 명확).
|
|
646
|
+
- View 가 `Card` 받아서 *card.cardRank.name + card.shape.name* 자가 처리.
|
|
647
|
+
|
|
648
|
+
reviewer 명시 X — 다만 *Thread 12 (Model = domain vs view)* 와 결합.
|
|
649
|
+
|
|
650
|
+
**MCP 룰 `tuple-leak-vs-domain-dto` 강화** — 누적 3+ PR (#36·#87·#117).
|
|
651
|
+
|
|
652
|
+
## 리뷰어 의견 요지
|
|
653
|
+
|
|
654
|
+
- **현실 메타포 정합** — *카드뭉치에서 카드 꺼내 플레이어 받는다* (Thread 13). *책임 분배 메타포 핵심*.
|
|
655
|
+
- **이름·의미 정확성** — *createCardRank* (CardRank 반환 X), *isHit* → *canHit*, *drawCount* 2 역할.
|
|
656
|
+
- **property val vs computed property** — *학생 자가 의문 + reviewer 다회 답변 (Thread 3·5·14·18)*.
|
|
657
|
+
- **Kotlin delegation 권유** — *외부글 (kotlinlang.org) 동반*. PR #21 (galcyurio *위임 = 나쁜 습관*) 와 **반대 시점**.
|
|
658
|
+
- **함수형 프로그래밍 학습 미션 어휘** — *MutableList 회피 + Iterable 확장함수*. *학습 의도 의식*.
|
|
659
|
+
- **반복문 의존 vs 수학적 풀이** — *외부글 (leebaro 1부터 10까지 합) + 학생 자가 힌트 요청 + reviewer 후속 답변*.
|
|
660
|
+
- **Stringly-typed → enum 비교** — *cardName.contains("A") → cardRank == ACE*.
|
|
661
|
+
- **함수 합성 동치 = 추상화 의도 X** — *score - aceCount + aceCount = score*.
|
|
662
|
+
- **테스트 = 하드코드 검증** — *production 코드 의존 X = 회귀 감지*.
|
|
663
|
+
- **함수 인자 일관성** — *playersNames 만 외부 전달 = 비대칭*.
|
|
664
|
+
- **canHit 중복 호출** — *while 조건과 turn 내부 모두 호출*.
|
|
665
|
+
- **`protected` 자식 한정 가시성** — *addCard 외부 호출 차단*.
|
|
666
|
+
- **Model = domain vs view 의문 + ViewMapper / 확장함수 2 안** — *MVC 절대 원칙*.
|
|
667
|
+
- **enum 변환 권유** — *상수/문자열 → 컴파일러 강제*.
|
|
668
|
+
- **distinct() vs toSet() 의도** — *순서 보존 여부*.
|
|
669
|
+
- **클래스 이름과 멤버 이름 중복** — *Cards.cardsCount → Cards.count*.
|
|
670
|
+
- **수정 후 칭찬** — *반영 후 commit 링크 첨부 모범*.
|
|
671
|
+
|
|
672
|
+
## 대표 인용
|
|
673
|
+
|
|
674
|
+
> [woowahan-dino]
|
|
675
|
+
> *"이 동작에 대해서 생각해볼 필요가 있을 것 같아요. 현실에서는 카드뭉치에서 카드 한장을 꺼내서 플레이어가 받는다 라는 동작인데 이 코드를 보면 플레이어가 카드뭉치를 받고 거기서 카드를 받는 동작으로 보여요. 이 부분을 개선해보면 어떨까요?"*
|
|
676
|
+
|
|
677
|
+
→ **현실 메타포 정합 어휘** — *MCP `oh-my-oop` 핵심 가치 (책임 분배 단계)*. PR #31·#21 결.
|
|
678
|
+
|
|
679
|
+
> [woowahan-dino]
|
|
680
|
+
> *"개발을 하다보면 가끔 반복문에 너무 의존하게 될 때가 있습니다. 우리가 만약에 1부터 10까지 합을 구한다고 하면 1부터 10까지 반복문을 돌리는 것을 먼저 떠올리게 됩니다. 하지만 그것보다 더 좋은 수학적인 방법이 존재합니다."*
|
|
681
|
+
|
|
682
|
+
→ **반복문 의존 vs 수학적 풀이** 어휘. 외부글 동반.
|
|
683
|
+
|
|
684
|
+
> [parkjiminnnn 자가 답변]
|
|
685
|
+
> *"가지고 있는 ace카드의 개수만큼 반복문으로 카드를 힛하는 턴마다의 카드의 총합을 계산해서 ace카드의 점수를 유동적으로 바꿀 수 있다고 생각을 합니다.. 근데 반복문을 사용하지 않고 수학적인 방법으로만 턴마다 카드 점수의 총합을 유동적으로 계산하는건 어떻게 해야 할지 도저히 감이 안 잡히는데 힌트를 조금만 더 주실 수 있을까요?🥺"*
|
|
686
|
+
|
|
687
|
+
→ **학생 자가 한계 인정 + 자가 힌트 요청** — *학습 적극성*. PR #95·#98·#46·#73·#36·#87 결.
|
|
688
|
+
|
|
689
|
+
> [woowahan-dino]
|
|
690
|
+
> *"미션을 하고 있는 프로젝트에서 model이라는게 domain관점인지 view관점인지가 중요할 것 같아요. domain 관점에서는 title이라는 view 관점의 값들이 들어있는게 맞을까? 라는 의문을 가져보면 어떨까요?"*
|
|
691
|
+
|
|
692
|
+
→ **Model = domain vs view 의문 어휘** — *MVC 절대 원칙*.
|
|
693
|
+
|
|
694
|
+
> [woowahan-dino]
|
|
695
|
+
> *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까 MutableList를 만들지 않고 기존에 있는 List나 Array를 사용해서 만들어 보도록 해볼까요?"*
|
|
696
|
+
|
|
697
|
+
→ **학습 의도 의식 어휘** — *미션의 학습 목표 의식*.
|
|
698
|
+
|
|
699
|
+
> [woowahan-dino]
|
|
700
|
+
> *"drawCount만 보면 카드를 뽑은 개수를 가져오는 것으로 느껴지는데 내부에서는 실제로 카드를 뽑을 수 있으면 카드를 뽑는 역할도 하고 있어요. 함수를 분리해볼 수 있지 않을까요?"*
|
|
701
|
+
|
|
702
|
+
→ **CQS (Command-Query Separation) 어휘**.
|
|
703
|
+
|
|
704
|
+
> [parkjiminnnn 자가 답변]
|
|
705
|
+
> *"카드를 추가할 때마다 초기화 해줘야 해서 val로 선언하면 안될 것 같네용..🥲 함수명만 수정하겠습니당"*
|
|
706
|
+
|
|
707
|
+
→ **학생 자가 부분 적용 + 부분 거절** — *val 으로 변환 거절 + 함수명만 적용*. **MCP `oop_propose_alternatives` 핵심 가치 (학생 자가 선택)** 합류.
|
|
708
|
+
|
|
709
|
+
reviewer 후속 (Thread 18):
|
|
710
|
+
|
|
711
|
+
> *"카드를 추가할 때 마다 새로운 값을 가져와야 한다면 `get() =` 을 사용하면 됩니다."*
|
|
712
|
+
|
|
713
|
+
→ **reviewer 후속 답변 = 학생 자가 거절 이유 인정 + 대안 제시** — *3 가지 property 형태 안내*. **양방향 reviewer/학생 토론 정공**.
|
|
714
|
+
|
|
715
|
+
## 얻은 교훈 (보편)
|
|
716
|
+
|
|
717
|
+
1. **현실 메타포 정합 = 책임 분배 핵심** — *카드뭉치에서 카드 꺼내 플레이어 받는다* 같은 현실 동작 매핑. **MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ (누적 8+ PR).
|
|
718
|
+
|
|
719
|
+
2. **이름·의미 정확성 (함수 명명)** — *createCardRank/isHit/drawCount = 이름 vs 실제 동작 불일치*. **MCP 룰 `function-name-vs-return-semantic-mismatch` 강화** 누적 3+ PR.
|
|
720
|
+
|
|
721
|
+
3. **property val vs computed property (`get()=`)** — *Kotlin 3 형태 (val 즉시 / get() 매 호출 / fun 명령형) 트레이드오프*. **MCP 룰 `property-val-vs-computed-property` 후보**.
|
|
722
|
+
|
|
723
|
+
4. **Kotlin `by` delegation 권유 (PR #21 반대 시점)** — *delegation = Kotlin 어휘 정공* vs *PR #21 reviewer = 컬렉션처럼 쓰는 나쁜 습관*. **2 reviewer 의 반대 시점 = MCP `oop_propose_alternatives` 핵심 가치 합류 정점**.
|
|
724
|
+
|
|
725
|
+
5. **반복문 의존 vs 수학적 풀이** — *Ace 1↔11 = while vs 단일 식*. 외부글 동반. **MCP 룰 `iterative-loop-vs-math-formula` 강화** ⭐⭐.
|
|
726
|
+
|
|
727
|
+
6. **함수 합성 동치 = 추상화 의도 X** — *score - aceCount + aceCount = score = 함수 분리 비용만*. **MCP 룰 `function-decomposition-creates-identity` 후보**.
|
|
728
|
+
|
|
729
|
+
7. **CQS (Command-Query Separation)** — *drawCount = count 가져옴 + 카드 뽑음 = 2 역할*. **MCP 룰 `command-query-separation` 후보**.
|
|
730
|
+
|
|
731
|
+
8. **Stringly-typed → enum 비교** — *cardName.contains("A") → cardRank == ACE*. **MCP 룰 `stringly-typed-vs-enum-comparison` 후보**.
|
|
732
|
+
|
|
733
|
+
9. **테스트 = 하드코드 검증 (production 코드 의존 X)** — *CardRank.values().size 의존 → 52 하드코드*. **MCP 룰 `test-hardcoded-vs-production-derived` 강화** 누적 3+ PR.
|
|
734
|
+
|
|
735
|
+
10. **함수형 프로그래밍 학습 미션 어휘 (학습 목표 의식)** — *MutableList 회피 + Iterable 확장함수*. *학습 의도 의식*. **MCP 룰 `mutable-list-vs-functional-pipeline` 후보**.
|
|
736
|
+
|
|
737
|
+
11. **Model = domain vs view (MVC 절대 원칙)** + **ViewMapper / 확장함수 2 안** — PR #21·#87 결 강화. **MCP 룰 `model-view-dependency-direction` 강화** ⭐⭐⭐.
|
|
738
|
+
|
|
739
|
+
12. **`distinct()` vs `toSet()` 의도 = 순서 보존 여부** — **MCP 룰 `distinct-vs-toSet-intent` 후보**.
|
|
740
|
+
|
|
741
|
+
13. **학생 자가 한계 인정 + 자가 힌트 요청** — *학습 적극성 모범*. *학습 = 시간 두고 반복* 어휘. PR #36·#87·#95·#98·#46·#73 결.
|
|
742
|
+
|
|
743
|
+
14. **모든 25 스레드 학생 자가 답변 + 커밋 SHA 첨부** — *학생 자가 학습 가시화 정점*.
|
|
744
|
+
|
|
745
|
+
15. **셀프 체크리스트 PR 본문 (2025 코호트 스타일)** — *체계화된 PR 본문 + 집중 리뷰 영역 명시*.
|
|
746
|
+
|
|
747
|
+
16. **`protected` 자식 한정 가시성** — *Kotlin 어휘*. PR #87 결.
|
|
748
|
+
|
|
749
|
+
17. **함수 인자 일관성** — *3 인자 중 1 만 외부 전달 = 비대칭*. **MCP 룰 `function-parameter-asymmetry` 후보**.
|
|
750
|
+
|
|
751
|
+
18. **canHit 중복 호출 (Guard 중복)** — **MCP 룰 `redundant-guard-condition` 후보**.
|
|
752
|
+
|
|
753
|
+
19. **클래스 이름과 멤버 이름 중복** — *Cards.cardsCount → Cards.count*. **MCP 룰 `member-name-includes-class-name` 후보**.
|
|
754
|
+
|
|
755
|
+
20. **stateless 클래스 인스턴스화 vs companion object 정적** — *ScoreCalculator(cards) vs ScoreCalculator.calculate(cards)*. **MCP 룰 `stateless-class-vs-companion-object` 후보**.
|
|
756
|
+
|
|
757
|
+
21. **부모 추상 메서드 반환 의미 자식 별 역방향** — *Dealer.turn = true (hit) vs Player.turn = true (종료)*. **MCP 룰 `method-return-semantic-asymmetry-between-subclasses` 후보**.
|
|
758
|
+
|
|
759
|
+
22. **mutable 컬렉션 public 노출 (val MutableList)** — *backing property + 방어적 복사 정공*. **MCP 룰 `mutable-list-public-exposure` 강화** 누적 5+ PR.
|
|
760
|
+
|
|
761
|
+
23. **양방향 reviewer/학생 토론 + 부분 거절 + reviewer 후속 답변** — *학생 자가 거절 이유 인정 + reviewer 대안 제시*. 누적 8+ PR.
|
|
762
|
+
|
|
763
|
+
## 얻은 교훈 (도메인)
|
|
764
|
+
|
|
765
|
+
1. **Ace 11 기본 + 수학적 단일 식** — `totalCardScore - 10 * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / 10 + 1)`. **MCP 룰 `ace-bonus-mathematical-vs-iterative` 후보**.
|
|
766
|
+
|
|
767
|
+
2. **현실 메타포 = 카드뭉치에서 카드 꺼내서 플레이어 받는다** — *Player.receive(drawnCard: Card)* 정공.
|
|
768
|
+
|
|
769
|
+
3. **Dealer 16 이하 자동 hit** — `DEALER_HIT_LIMIT = 16`. 블랙잭 표준 룰.
|
|
770
|
+
|
|
771
|
+
4. **카드 중복 invariant + `toSet()` 검증** — *distinct() vs toSet() 의도 점검*.
|
|
772
|
+
|
|
773
|
+
5. **VictoryStatus enum (WIN/LOSE/DRAW)** — *상수/문자열 → enum 변환*. PR #20·#28·#125 결.
|
|
774
|
+
|
|
775
|
+
6. **`compareScores` `abs(BLACKJACK_SCORE - score)`** — *21에 가장 가까운 자가 승리 (블랙잭 룰 정확성)*. 다만 *블랙잭 표준 = bust 즉시 lose + 동점은 dealer 승*.
|
|
776
|
+
|
|
777
|
+
→ **블랙잭 룰 와전 시점** — *abs 기반 비교* ≠ *21 정확 vs 21 미만 비교*. 학생 자가 점검 필요. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 9+ PR.
|
|
778
|
+
|
|
779
|
+
## MCP 룰 후보 신규 + 강화 (PR #117)
|
|
780
|
+
|
|
781
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
782
|
+
|---|---|---|
|
|
783
|
+
| `metaphor-fidelity-locator` | 강화 | 8+ ⭐⭐⭐ |
|
|
784
|
+
| `function-name-vs-return-semantic-mismatch` | 강화 | 3+ (#36·#117·#21) |
|
|
785
|
+
| `property-val-vs-computed-property` | 신규 | 1 (#117) — Kotlin 어휘 |
|
|
786
|
+
| `iterative-loop-vs-math-formula` | 강화 | 2+ (#117·#87) ⭐⭐ |
|
|
787
|
+
| `function-decomposition-creates-identity` | 신규 | 1 (#117) |
|
|
788
|
+
| `command-query-separation` | 신규 | 1 (#117) |
|
|
789
|
+
| `stringly-typed-vs-enum-comparison` | 신규 | 1 (#117) |
|
|
790
|
+
| `test-hardcoded-vs-production-derived` | 강화 | 3+ (#99·#26·#117) |
|
|
791
|
+
| `mutable-list-vs-functional-pipeline` | 신규 | 1 (#117) |
|
|
792
|
+
| `model-view-dependency-direction` | 강화 | 9+ ⭐⭐⭐ |
|
|
793
|
+
| `distinct-vs-toSet-intent` | 신규 | 1 (#117) |
|
|
794
|
+
| `function-parameter-asymmetry` | 신규 | 1 (#117) |
|
|
795
|
+
| `redundant-guard-condition` | 신규 | 1 (#117) |
|
|
796
|
+
| `member-name-includes-class-name` | 신규 | 1 (#117) |
|
|
797
|
+
| `stateless-class-vs-companion-object` | 신규 | 1 (#117) |
|
|
798
|
+
| `method-return-semantic-asymmetry-between-subclasses` | 신규 | 1 (#117) |
|
|
799
|
+
| `mutable-list-public-exposure` | 강화 | 5+ |
|
|
800
|
+
| `tuple-leak-vs-domain-dto` | 강화 | 3+ (#36·#87·#117) |
|
|
801
|
+
| `is-vs-can-prefix-semantics` | 신규 | 2+ (#117·#21) |
|
|
802
|
+
| `delegation-source-val-redundancy` | 신규 | 1 (#117) |
|
|
803
|
+
| `view-mapper-vs-extension-function` | 신규 | 1 (#117) |
|
|
804
|
+
| `decider-vs-tell-dont-ask` | 신규 | 1 (#117) |
|
|
805
|
+
| `ace-bonus-mathematical-vs-iterative` | 신규 | 1 (#117) — 도메인 특수 |
|
|
806
|
+
| `blackjack-rule-fidelity-comparison` | 강화 | 9+ ⭐⭐⭐ |
|
|
807
|
+
|
|
808
|
+
## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점)
|
|
809
|
+
|
|
810
|
+
- ***woowahan-dino (디노) = 13번째 reviewer*** — *MCP 핵심 가치 어휘 합류*.
|
|
811
|
+
- ***현실 메타포 정합 어휘*** — woowahan-dino PR #117 — *"카드뭉치에서 카드 꺼내 플레이어 받는다"* — **MCP `oh-my-oop` 핵심 가치 (책임 분배 단계)**. PR #31·#21 결.
|
|
812
|
+
- ***학습 의도 의식 어휘*** — woowahan-dino PR #117 — *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까"* — *미션의 학습 목표 의식*.
|
|
813
|
+
- ***반복문 의존 vs 수학적 풀이*** — woowahan-dino PR #117 — *외부글 + 학생 자가 힌트 요청 + reviewer 후속 답변* 3 단계 학습 시점.
|
|
814
|
+
- ***Model = domain vs view 의문 어휘*** — woowahan-dino PR #117 — *MVC 절대 원칙*.
|
|
815
|
+
- ***학생 자가 부분 거절 + reviewer 후속 답변*** — parkjiminnnn / woowahan-dino — *학생 자가 거절 + reviewer 대안 제시* = **양방향 토론 정공**. PR #137·#151·#133·#146·#147·#87 결.
|
|
816
|
+
- ***모든 25 스레드 학생 자가 답변 + 커밋 SHA 첨부*** — parkjiminnnn — *학습 가시화 정점*.
|
|
817
|
+
- ***2025 코호트 스타일 (셀프 체크리스트 + 집중 리뷰 영역 명시)*** — *체계화된 PR 본문 + CI 자가 점검*. **2023·2024·2025 코호트 3 시기 합류**.
|
|
818
|
+
|
|
819
|
+
→ **13 reviewer 누적 (말리빈/잭슨/페로로/지훈/krrong/vagabond95/BeokBeok/KwonDae/galcyurio/ghojeong/woowahan-leah/두루/woowahan-dino)** — *MCP `oh-my-oop` 핵심 가치 어휘 완전 합류 정점*.
|