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,769 @@
|
|
|
1
|
+
# PR #36 — [블랙잭 2단계] 우기 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@boogi-woogi](https://github.com/boogi-woogi)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/36
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** [@woowahan-leah](https://github.com/woowahan-leah) (1단계 #18 동일 reviewer — *2 PR 누적 = 학생-reviewer 페어 안정*)
|
|
7
|
+
- **라인 코멘트:** 24 스레드 — *Tell-Don't-Ask 2단계 재발 (PlayerGameResults `value` 외부 조작) + sealed class 학습 깊이 (학생 자가 답변 + reviewer 후속 confederate) + nullable enum 3안 트레이드오프 + backing property + data class 융합 대안 + decideAceValue 명명·실제 반환 불일치 + Domain/View 비용 메타포*
|
|
8
|
+
- **양 단계 완성 reviewee** (1단계 #18 batch 18 분석 완료 + 2단계 #36 = batch 19 추가).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 인식 — 컨트롤러 도메인 로직 분리 의식
|
|
13
|
+
|
|
14
|
+
PR 본문: *"2단계 미션을 진행하면서는 컨트롤러에 존재하는 도메인 로직들을 분리하는 것을 중점적으로 생각했습니다."*
|
|
15
|
+
|
|
16
|
+
→ **학생 자가 *과제 인식*** + *1단계 #18 reviewer 권고 (Tell-Don't-Ask) → 2단계 자가 적용 의지*. PR #76·#82·#107·#46·#91·#11·#13·#80·#106·#14 결의 *PR 본문 자가 의문* 패턴 + *2단계 자가 적용 의지* 결합.
|
|
17
|
+
|
|
18
|
+
### 2. `sealed class CardsState` Running(score) + object BlackJack/Bust — 학생 자가 학습 깊이
|
|
19
|
+
|
|
20
|
+
```kotlin
|
|
21
|
+
sealed class CardsState {
|
|
22
|
+
object BlackJack : CardsState()
|
|
23
|
+
data class Running(val score: Int) : CardsState()
|
|
24
|
+
object Bust : CardsState()
|
|
25
|
+
companion object {
|
|
26
|
+
private const val BLACKJACK_SCORE = 21
|
|
27
|
+
fun valueOf(score: Int, isInitialDraw: Boolean = false): CardsState = when {
|
|
28
|
+
score > BLACKJACK_SCORE -> Bust
|
|
29
|
+
score == BLACKJACK_SCORE && isInitialDraw -> BlackJack
|
|
30
|
+
else -> Running(score)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
학생 자가 답변 (PR #36, line 코멘트):
|
|
37
|
+
|
|
38
|
+
> *"sealed 클래스를 사용해야하는 근거에 대해서 생각해보았습니다. enum class는 해당 class에 속하는 instance가 모두 같은 프로퍼티를 갖고 같은 형식으로 이루어져야 하기 때문에 Running 상태일때만 필요한 score를 처리하기가 어렵다고 생각했습니다. sealed 클래스를 사용하면서 굳이 다른 정보가 필요하지 않은 BlackJack과 Bust는 object를 선언하였고 Running과 같이 같은 Running 상태라도 score가 다를 수 있기 때문에 data class로 선언하였습니다. 그리고 이 score 값을 CardsState를 받는 쪽에서 이용할 수 있게 만들었습니다. sealed 클래스 사용 경험이 거의 없어서 이러한 상황에서의 사용이 적절했는지 잘 모르겠습니다! (미션 끝나고 sealed 클래스에 대해서 다시 꼭 정리하겠습니다)"*
|
|
39
|
+
|
|
40
|
+
reviewer (woowahan-leah) 후속 confederate:
|
|
41
|
+
|
|
42
|
+
> *"sealed class에 대해 잘 고민해보고 적절한 사용 시점을 잘 정리해주셨네요 👍 이외에도 함수나 프로퍼티를 가질 수 있다는 것이 sealed class의 강력한 속성이라고 생각해요. 추가로 CardsState가 직접 일할 수 있게 다음과 같이 확장도 가능해보입니다.*
|
|
43
|
+
>
|
|
44
|
+
> ```kotlin
|
|
45
|
+
> sealed class CardsState {
|
|
46
|
+
> ...
|
|
47
|
+
> companion object {
|
|
48
|
+
> fun 내가 이제 무슨 state인지 판단해줘(score: Int) {
|
|
49
|
+
> if (score > BLACKJACK_SCORE) return Bust()
|
|
50
|
+
> }
|
|
51
|
+
> }
|
|
52
|
+
> }
|
|
53
|
+
> ```
|
|
54
|
+
>
|
|
55
|
+
> *이래야 진정으로 '직접 본인의 상태를 판단하는 객체'가 될 수 있지 않을까요? 고민해보고 이번 단계에 적용해보면 어떨까요? 어려움이 있다면 저와 페어 프로그래밍해봐도 좋습니다!"*
|
|
56
|
+
|
|
57
|
+
→ **양방향 메타 학습**:
|
|
58
|
+
- 학생: *sealed 자가 추론 (enum vs sealed 멤버 데이터 차이)* → object 무 데이터 / data class 데이터 → reviewer 일치 확인.
|
|
59
|
+
- reviewer 후속: *자식들에게도 책임 부여 = 상태 패턴* (현재 valueOf companion object 만 일하고 자식은 데이터 컨테이너).
|
|
60
|
+
- 페어 프로그래밍 권유 = *reviewer가 학습 가시화*.
|
|
61
|
+
|
|
62
|
+
PR #98 (chaehyuns 2단계 *상태 패턴 자가 의문*) / PR #93 (junjange 2단계 *State.compareTo 다형성*) / PR #136 (whk06061 *State 자식 책임 부여*) 결의 *상태 패턴 도입 시점*.
|
|
63
|
+
|
|
64
|
+
### 3. `enum class GameResult` + `BLACKJACK_WIN(1.5)` 멤버 — 블랙잭 룰 정확성
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
enum class GameResult(val profitRate: Double) {
|
|
68
|
+
BLACKJACK_WIN(1.5),
|
|
69
|
+
WIN(1.0),
|
|
70
|
+
LOSE(-1.0),
|
|
71
|
+
DRAW(0.0);
|
|
72
|
+
|
|
73
|
+
operator fun not(): GameResult = when (this) {
|
|
74
|
+
BLACKJACK_WIN -> LOSE
|
|
75
|
+
WIN -> LOSE
|
|
76
|
+
LOSE -> WIN
|
|
77
|
+
DRAW -> DRAW
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
→ **블랙잭 1.5배 정확성** — `BlackjackWin` 별도 결과 멤버 (vs *Win + isBlackjack 분기*). PR #93·#136·#152·#133·#88·#147 결 *블랙잭 1.5배 분기*.
|
|
83
|
+
|
|
84
|
+
**`operator fun not()` 활용** = *결과 반전 도메인 의미* — `!GameResult.WIN = LOSE`, `!ProfitMoney = -ProfitMoney`. **Kotlin 어휘 깊은 자가 활용** — *딜러 결과 = !플레이어 합계* (`return !playersTotalProfitMoney`). PR #137 (HamBeomJoon *operator overloading*) / PR #133 (Money operator plus) 결.
|
|
85
|
+
|
|
86
|
+
reviewer 칭찬: *"profitRate를 GameResult 내부에 캡슐화 👍"* + *"PlayerGameResult 객체가 일하도록 👍"* + *"Case를 나누어 엔티티를 작게 유지한 점은 좋았습니다 👍"*.
|
|
87
|
+
|
|
88
|
+
### 4. `@JvmInline value class` 3종 — PlayerName/BattingMoney/ProfitMoney
|
|
89
|
+
|
|
90
|
+
```kotlin
|
|
91
|
+
@JvmInline value class PlayerName(val value: String) {
|
|
92
|
+
init { require(value.isNotEmpty()) { NAME_LENGTH_ERROR } }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@JvmInline value class BattingMoney(val value: Int) {
|
|
96
|
+
init { require(value > 0) { BATTING_MONEY_EXCEPTION } }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@JvmInline value class ProfitMoney(val value: Int) {
|
|
100
|
+
operator fun not(): ProfitMoney = ProfitMoney(-value)
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
→ **value class 3종 자가 적용** + *각각 invariant 명시* (이름 길이 ≥1, 베팅 ≥1, 수익 부호 반전). reviewer (1단계 외부 글) *"오프라인에서 질문해주신 것처럼 이러한 유효성 검사 로직 캡슐화도 원시값 래핑의 중요한 목적 중 하나입니다!"* — *오프라인 페어 학습* 이어진 자가 적용. PR #82·#76·#107·#106 결.
|
|
105
|
+
|
|
106
|
+
### 5. `BlackJackCase` / `BustCase` / `RunningCase` — 케이스 분기 작은 enum
|
|
107
|
+
|
|
108
|
+
```kotlin
|
|
109
|
+
enum class BlackJackCase(val gameResult: GameResult) {
|
|
110
|
+
WIN(GameResult.BLACKJACK_WIN),
|
|
111
|
+
DRAW(GameResult.DRAW);
|
|
112
|
+
companion object {
|
|
113
|
+
fun valueOf(dealerCardsState: CardsState): BlackJackCase = when (dealerCardsState) {
|
|
114
|
+
is CardsState.BlackJack -> DRAW
|
|
115
|
+
else -> WIN
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
→ **작은 enum 3개로 (`GameResult.valueOf` 책임 분할)** *플레이어 상태별 분기*. PR #99 (s6m1n 2단계 *WIN/LOSE × 블랙잭/일반 곱집합*) 결의 *반대 시점* — *상태별 enum 분리 = 곱집합 평탄화*.
|
|
122
|
+
|
|
123
|
+
reviewer 칭찬: *"Case를 나누어 엔티티를 작게 유지한 점은 좋았습니다 👍"* + *"조건 활용하여 케이스 판별 👍"* (BustCase).
|
|
124
|
+
|
|
125
|
+
### 6. 추가 칭찬 (단순)
|
|
126
|
+
|
|
127
|
+
- **`CardNumber` 캡슐화 👍** — *value class 변환 아니지만 enum + companion 함수*.
|
|
128
|
+
- **외부에서 state를 수정할 수 없도록 접근 제어자 설정 👍** (`Cards._cards: MutableList` + `cards: List` getter).
|
|
129
|
+
- **Bust 로 잘 바꿔주셨습니다 😆** (1단계 → 2단계 명명 개선).
|
|
130
|
+
- **숫자가 아닌 입력 불허 창의적 구현 👍** (`requestAdditionalDraw` `requestPlayersName` 등 입력 변환).
|
|
131
|
+
- **PlayerGameResult 객체가 일하도록 👍** (`PlayerGameResult.of(player, otherCardsState)` 정적 팩토리).
|
|
132
|
+
|
|
133
|
+
## 못한 점 (설계 관점)
|
|
134
|
+
|
|
135
|
+
### 1. `BlackJackReferee` 의 `playerProfitResult` 값 외부 조작 — Tell-Don't-Ask 2단계 재발
|
|
136
|
+
|
|
137
|
+
reviewer:
|
|
138
|
+
|
|
139
|
+
> *"playerProfitResult값을 외부에서 꺼내서 조작하기보다 직접 메세지를 던져 요청하면 어떨까요? 다른 곳에서도 이렇게 메세지를 던져 구현해야 할 필요가 있는 곳이 없는지 점검해보세요! 상황에 따라 일급 컬렉션 사용이 필요할 수 있습니다. 참고: https://jojoldu.tistory.com/412"*
|
|
140
|
+
|
|
141
|
+
→ **Tell-Don't-Ask 2단계 재발** — *1단계 #18 reviewer 권고 (DrawState.POSSIBLE 외부 판단 X)* → *2단계 자가 적용 의지에도 다른 자리 (BlackJackReferee.playerProfitResult) 에 재발*.
|
|
142
|
+
|
|
143
|
+
**3 가지 학습**:
|
|
144
|
+
|
|
145
|
+
#### 1.1. *일급 컬렉션 자가 적용*
|
|
146
|
+
|
|
147
|
+
reviewer *"상황에 따라 일급 컬렉션 사용이 필요할 수 있습니다"* — *학생이 일급 컬렉션 어휘 자가 학습 시점*.
|
|
148
|
+
|
|
149
|
+
→ *현재 `PlayerGameResults(private val _playerGameResults)` 는 일급 컬렉션* (잘 적용됨) + *총 수익 메서드 `getPlayersTotalProfit()` 도 일급 컬렉션* (잘 적용됨). 다만 *Referee 가 외부 꺼내서 조작* = *일급 컬렉션 의미 누수*.
|
|
150
|
+
|
|
151
|
+
#### 1.2. *외부 글 = jojoldu 일급 컬렉션*
|
|
152
|
+
|
|
153
|
+
reviewer 외부 자료 *jojoldu.tistory.com/412* — **외부 자료 활용 메타 어휘**. PR #23·#26·#108·#136·#151·#146·#148·#93·#133 결.
|
|
154
|
+
|
|
155
|
+
#### 1.3. *BlackJackReferee 의 책임 = 메시지 던지기*
|
|
156
|
+
|
|
157
|
+
현재 `Dealer.judgeDealerGameResults` 가 `!playersTotalProfitMoney` 로 메시지 처리. 다만 *Referee 의 다른 메서드*는 외부 조작 → *Tell-Don't-Ask 부분 적용*.
|
|
158
|
+
|
|
159
|
+
**MCP 룰 `tell-dont-ask-partial-coverage` 후보** — *일부 자리만 Tell-Don't-Ask 적용 = 인지 부담 ↑*.
|
|
160
|
+
|
|
161
|
+
### 2. Domain/View 비용 메타포 — *서버/클라이언트* 비유
|
|
162
|
+
|
|
163
|
+
reviewer:
|
|
164
|
+
|
|
165
|
+
> *"Domain을 서버, View를 클라이언트라고 가정해보고 View의 호출 최소화하여 비용을 줄여보면 어떨까요?"*
|
|
166
|
+
|
|
167
|
+
→ **메타포 어휘 (서버/클라이언트)** = *Domain ↔ View 호출 비용 메타포*. 현재 `BlackJackGameController` 가 *Domain → View → Domain → View* 반복 (drawAdditionalCardsForPlayers 함수 인자 람다로 *내부에서 View 호출*).
|
|
168
|
+
|
|
169
|
+
**3 가지 학습**:
|
|
170
|
+
|
|
171
|
+
#### 2.1. *View 호출 비용 메타포*
|
|
172
|
+
|
|
173
|
+
*Domain (서버) ↔ View (클라이언트) 라운드트립 = 네트워크 비용*. 라운드트립 횟수 ↓ = *비용 ↓*.
|
|
174
|
+
|
|
175
|
+
#### 2.2. *람다 콜백 vs 일괄 응답 트레이드오프*
|
|
176
|
+
|
|
177
|
+
현재 `BlackJackGame.drawAdditionalCardsForPlayers(isPlayerWantedAdditionalCards, checkCurrentCards)` = *콜백 람다 2개*. → *View 함수 매번 호출* (`OutputView::printPlayerCurrentCards`).
|
|
178
|
+
|
|
179
|
+
대안: **`BlackJackGame.drawAdditionalCardsForPlayers(isPlayerWantedAdditionalCards): List<PlayerDrawResult>`** = *일괄 응답*. 두 대안 트레이드오프:
|
|
180
|
+
|
|
181
|
+
| 안 | 장점 | 단점 |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| 콜백 람다 | 실시간 진행 표시 (블랙잭 한 장씩 보임) | View 라운드트립 ↑ |
|
|
184
|
+
| 일괄 응답 | View 라운드트립 ↓ | 진행 표시 불가 (한 번에 다 보임) |
|
|
185
|
+
|
|
186
|
+
→ *블랙잭 도메인은 한 장씩 보이는 것이 자연* (UX) → *콜백 람다가 적절* (다만 reviewer 의 *비용 메타포*는 *진행 표시 필요 없는 케이스* 에서 유효).
|
|
187
|
+
|
|
188
|
+
#### 2.3. *PR #137 (HamBeomJoon) `println` 도메인 X (간접 lambda 도 결합)* 결
|
|
189
|
+
|
|
190
|
+
PR #137 결: *콜백 람다 = View 결합도 ↓ 처럼 보이지만, 사실상 *View 함수 직접 호출과 동치**.
|
|
191
|
+
|
|
192
|
+
**MCP 룰 `callback-lambda-view-cost` 후보** — *콜백 람다 = View 호출 비용*.
|
|
193
|
+
|
|
194
|
+
### 3. `GameResultCase` 의 `condition` 익명 함수 = enum 외부 분기
|
|
195
|
+
|
|
196
|
+
학생 코드 (위 reviewer 코멘트에서 참조):
|
|
197
|
+
|
|
198
|
+
```kotlin
|
|
199
|
+
enum class GameResultCase(val condition: (playerScore: Int, dealerScore: Int) -> Boolean) {
|
|
200
|
+
WIN({ ... }), LOSE({ ... }), DRAW({ ... });
|
|
201
|
+
// ...
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
reviewer:
|
|
206
|
+
|
|
207
|
+
> *"enum class의 condition 익명 함수로 result를 판단하는 이 방법이 적절할까요? 매번 외부에서 GameResultCase의 values 전체를 호출해서 어떤 케이스인지 판단해야 할 텐데요."*
|
|
208
|
+
|
|
209
|
+
reviewer 후속:
|
|
210
|
+
|
|
211
|
+
> *"Case를 나누어 엔티티를 작게 유지한 점은 좋았습니다 👍 다만 이 코멘트의 의도는 `condition` 함수를 꼭 enum 객체가 들고 있어야 할까?에 초점이 맞춰져있습니다. condition은 어떤 enum을 반환할지 처음에 판단할 때에만 필요하고 실제 WIN, DRAW 값을 만질 때에는 사용되지 않는 값입니다. 이러한 조건이 사용되지 않는다면 빌더 함수에 캡슐화해도 되지 않을까 싶습니다 🤔 이를테면 다음처럼 구현해볼 수 있겠네요!*
|
|
212
|
+
>
|
|
213
|
+
> ```kotlin
|
|
214
|
+
> fun valueOf(dealerCardsState: CardsState): BlackJackCase? {
|
|
215
|
+
> return if (dealerCardsState != CardsState.BlackJack) {
|
|
216
|
+
> WIN
|
|
217
|
+
> } else if (dealerCardsState == CardsState.BlackJack) {
|
|
218
|
+
> DRAW
|
|
219
|
+
> } else {
|
|
220
|
+
> null
|
|
221
|
+
> }
|
|
222
|
+
> }
|
|
223
|
+
> ```
|
|
224
|
+
>
|
|
225
|
+
> *저는 참고로 nullable한 enum보다 not nullable한 enum을 선호하긴 합니다 🤔*"
|
|
226
|
+
|
|
227
|
+
→ **3 가지 학습**:
|
|
228
|
+
|
|
229
|
+
#### 3.1. *enum 외부 분기 X — condition 익명 함수 의도 누수*
|
|
230
|
+
|
|
231
|
+
reviewer 핵심: *condition = enum 선택 시점만 필요* → *enum 외부 (companion object valueOf) 가 적절*. **enum 내부 condition lambda 보관 = *데이터 메모리 낭비 + 의도 누수***.
|
|
232
|
+
|
|
233
|
+
PR #98·#43·#107·#137·#148·#76·#86·#73 결의 *enum 외부 분기 X*.
|
|
234
|
+
|
|
235
|
+
#### 3.2. *nullable enum vs not-nullable enum 3안 트레이드오프*
|
|
236
|
+
|
|
237
|
+
reviewer 3 가지 안:
|
|
238
|
+
|
|
239
|
+
| 안 | 장점 | 단점 |
|
|
240
|
+
|---|---|---|
|
|
241
|
+
| nullable enum (`BlackJackCase?`) | *값이 없음 명시* | *call site `?.` 처리 + 추측 어려움* |
|
|
242
|
+
| not-nullable enum (예: `WIN` 기본) | *call site 간결* | *기본값 의도 약함* |
|
|
243
|
+
| NONE enum 추가 (`NONE`) | *명시적 부재 + 컴파일러 보장* | *enum 멤버 ↑ 폭증* |
|
|
244
|
+
|
|
245
|
+
reviewer 선호: *not-nullable enum* (개인 의견). **MCP `oop_propose_alternatives` 핵심 가치 = N 안 + 트레이드오프 + 개인 의견 분리** 어휘 합류.
|
|
246
|
+
|
|
247
|
+
PR #95·#23·#26 결 (*"옳고 그름 X, 장단점만"*) 동일.
|
|
248
|
+
|
|
249
|
+
#### 3.3. *현재 BlackJackCase 는 not-nullable, GameResultCase 는 nullable*
|
|
250
|
+
|
|
251
|
+
GameResultCase 의 *condition 익명함수* 는 *조건 false 면 매핑 없음* → nullable.
|
|
252
|
+
|
|
253
|
+
reviewer *nullable enum 선호 X* + *NONE enum 멤버* → *학생 자가 선택* 권유.
|
|
254
|
+
|
|
255
|
+
**MCP 룰 `enum-nullability-axis` 후보** — *enum nullable 여부 트레이드오프 3안*.
|
|
256
|
+
|
|
257
|
+
### 4. `decideAceValue` / `decideAdditionalAceScore` — 명명과 실제 반환 불일치
|
|
258
|
+
|
|
259
|
+
```kotlin
|
|
260
|
+
companion object {
|
|
261
|
+
private const val ADDITION_SCORE_FOR_ACE = 10
|
|
262
|
+
private const val STANDARD_SCORE = 11
|
|
263
|
+
private const val ZERO = 0
|
|
264
|
+
|
|
265
|
+
fun decideAdditionalAceScore(score: Int): Int {
|
|
266
|
+
if (score <= STANDARD_SCORE) return ADDITION_SCORE_FOR_ACE
|
|
267
|
+
return ZERO
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
reviewer:
|
|
273
|
+
|
|
274
|
+
> *"A를 판단하는 여러 경우의 수를 고민해봤군요 👍 단, decideAceValue -> 함수의 네이밍은 Ace 값을 정해주는 함수, 즉 1 혹은 11을 리턴할 것 처럼 생겼는데 실제로는 추가로 더해야 하는 값을 리턴하고 있어요. 명시적인 네이밍을 활용하는 것도 좋아보입니다."*
|
|
275
|
+
|
|
276
|
+
→ **이름 vs 실제 반환 불일치** — `decideAceValue` 또는 `decideAdditionalAceScore` 둘 다 어색:
|
|
277
|
+
|
|
278
|
+
- `decideAceValue` → *Ace 값 (1 or 11) 반환 예상* → 실제는 *추가 더할 값 (0 or 10)*.
|
|
279
|
+
- `decideAdditionalAceScore` → *추가 점수 반환 명시*. 다만 *AdditionalAceScore* = *Ace 점수 추가분* vs *Ace 외 추가 점수* 양가.
|
|
280
|
+
|
|
281
|
+
**대안 명명**:
|
|
282
|
+
- `getAceBonusIfApplicable(currentSum: Int): Int` — *현재 합계 기준 보너스 점수*.
|
|
283
|
+
- `getExtraScoreForSoftAce(currentSum: Int): Int` — *Soft Ace = 11 vs Hard Ace = 1 도메인 어휘 + 추가분*.
|
|
284
|
+
- `getAceUpscoreBonus(currentSum: Int): Int` — *Ace 점수 업그레이드 보너스*.
|
|
285
|
+
|
|
286
|
+
**MCP 룰 `function-name-vs-return-semantic-mismatch` 후보** — *이름과 실제 반환값 의미 불일치*.
|
|
287
|
+
|
|
288
|
+
PR #99·#147·#95·#76 결의 *vague rename* (Return → GameResult, etc.).
|
|
289
|
+
|
|
290
|
+
### 5. `Ace` 11 기본 + 단일 +10 룰 자가 적용 — Ace 안티패턴 ↓
|
|
291
|
+
|
|
292
|
+
```kotlin
|
|
293
|
+
fun getMinimumCardsScore(): Int = cards.sumOf { card -> card.number.value }
|
|
294
|
+
|
|
295
|
+
fun getTotalCardsScore(): Int {
|
|
296
|
+
val minimumScore = getMinimumCardsScore()
|
|
297
|
+
if (cards.any { card -> card.number == CardNumber.A }) {
|
|
298
|
+
return minimumScore + CardNumber.decideAdditionalAceScore(minimumScore)
|
|
299
|
+
}
|
|
300
|
+
return minimumScore
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
→ **Ace 1 기본 + 단일 +10 룰** (Ace 1 sum + Ace 11 변환 가능 시 +10). PR #20·#64·#110·#28·#125·#147 의 *while + 차감 보정 안티패턴 반대 시점*.
|
|
305
|
+
|
|
306
|
+
**Ace 룰 정확성** ⭐⭐:
|
|
307
|
+
|
|
308
|
+
- *Ace 1 기본 + 11 변환 보너스*: *재계산 1회* (현재 안).
|
|
309
|
+
- *Ace 11 기본 + while 차감 보정*: *재계산 N회 (Ace 개수 만큼)*.
|
|
310
|
+
|
|
311
|
+
다만 *current 안 한계*:
|
|
312
|
+
- **여러 Ace 가 모두 11 변환 시점 처리 X** — *Ace 2장 = 11+11 = 22 > 21 → 1+11 = 12, 1+1 = 2*. 현재 코드는 *Ace 존재 시 1회 +10* → *Ace 1장 변환은 OK, Ace 2장 모두 변환은 처리 X*.
|
|
313
|
+
- → *현재 안은 Ace 1장 한정 정확* + *Ace 2장 이상은 잘못된 합산*.
|
|
314
|
+
|
|
315
|
+
**MCP 룰 `ace-bonus-single-vs-multi` 후보** — *Ace +10 단일 룰 vs Multi-Ace 트레이드오프*.
|
|
316
|
+
|
|
317
|
+
PR #82 (Hevton 1단계 *Ace +10 단일*) 결 + PR #11 (ki960213 *Ace 1+11 변환 모두 처리*) 결.
|
|
318
|
+
|
|
319
|
+
### 6. `Card.draw()` companion object + `ALL_CARDS: MutableSet` — Singleton Deck 변형
|
|
320
|
+
|
|
321
|
+
```kotlin
|
|
322
|
+
class Card(val number: CardNumber, val shape: Shape) {
|
|
323
|
+
companion object {
|
|
324
|
+
private val ALL_CARDS: MutableSet<Card> = CardNumber.values()
|
|
325
|
+
.flatMap { cardNumber ->
|
|
326
|
+
Shape.values().map { shape -> Card(cardNumber, shape) }
|
|
327
|
+
}.toMutableSet()
|
|
328
|
+
|
|
329
|
+
fun draw(): Card {
|
|
330
|
+
val card = ALL_CARDS.random()
|
|
331
|
+
ALL_CARDS.remove(card)
|
|
332
|
+
return card
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
→ **Singleton Deck (companion object MutableSet) 안티패턴** — 2판 이상 불가 / 테스트 격리 X / *static mutable state*. PR #20·#28·#125·#65·#92·#108·#137·#106·#48·#9·#22·#13·#11·#39·#16·#46 누적 결.
|
|
339
|
+
|
|
340
|
+
**3 가지 학습**:
|
|
341
|
+
|
|
342
|
+
#### 6.1. *Set vs List 자료구조 트레이드오프*
|
|
343
|
+
|
|
344
|
+
PR #23·#26 결의 *Set vs List 다중 카드덱 (여러 벌)* 트레이드오프 → *현재 안은 1벌 한정*. *6벌 카지노 메타포 (PR #58 결)* 시 자료구조 변경 필요.
|
|
345
|
+
|
|
346
|
+
#### 6.2. *Singleton 회피 = Cards constructor default*
|
|
347
|
+
|
|
348
|
+
`Cards(cards: List<Card> = listOf(Card.draw(), Card.draw()))` → *Cards 생성 시 Card.draw 2회 자동 호출* + *static state 변경* = *Cards 생성 자체가 부작용*.
|
|
349
|
+
|
|
350
|
+
대안: **`Deck` 객체 + `dealer.deck.draw()` 메시지**. PR #46 (rhthrhrl0 2단계 *Deck 도입*) / PR #91 (murjune 2단계 *Deck 자료구조*) 결.
|
|
351
|
+
|
|
352
|
+
#### 6.3. *MutableSet 사용 vs 재귀 자료구조*
|
|
353
|
+
|
|
354
|
+
PR #23·#26 결 *Set 자료구조 = 카드 중복 자연 방지*. 다만 *MutableSet 변경 = 함수형 사고 X*. **immutable Set + slice 함수** 대안.
|
|
355
|
+
|
|
356
|
+
**MCP 룰 `singleton-deck-via-companion` 후보** — *companion object MutableSet/MutableList = Singleton Deck 변형*. 누적 17+ PR ⭐⭐⭐.
|
|
357
|
+
|
|
358
|
+
### 7. `lateinit var blackJackPlayers` + `initPlayers` — 호출 순서 invariant 부재
|
|
359
|
+
|
|
360
|
+
```kotlin
|
|
361
|
+
class BlackJackGame(val dealer: Dealer = Dealer()) {
|
|
362
|
+
lateinit var blackJackPlayers: BlackJackPlayers
|
|
363
|
+
private set
|
|
364
|
+
|
|
365
|
+
fun initPlayers(names: List<String>, getBattingMoney: (String) -> Int) {
|
|
366
|
+
val players = names.map { name -> Player(name, getBattingMoney(name)) }
|
|
367
|
+
blackJackPlayers = BlackJackPlayers(players)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
→ **`lateinit var` + setter** (1단계 #18 의 *lateinit var callback* 결 재발). *initPlayers 호출 전 blackJackPlayers 접근 = UninitializedPropertyAccessException*. PR #28·#92·#48·#16·#22·#11·#13 누적 결.
|
|
373
|
+
|
|
374
|
+
**MCP 룰 `lateinit-var-call-order-invariant` 후보** — *호출 순서 invariant 부재*. 누적 8+ PR.
|
|
375
|
+
|
|
376
|
+
**대안**:
|
|
377
|
+
- **Builder Pattern** — `BlackJackGame.Builder().withPlayers(names).build()` → *호출 시점 강제*.
|
|
378
|
+
- **Generic 분리** — `BlackJackGameSetup` (players 없음) + `BlackJackGame(setup, players)` → *컴파일 시점 강제*.
|
|
379
|
+
- **constructor + 필수 인자** — `BlackJackGame(players: BlackJackPlayers, dealer: Dealer)` → *생성 자체가 invariant*.
|
|
380
|
+
|
|
381
|
+
reviewer 는 이 토픽 명시 X — 다만 *Tell-Don't-Ask 후속 코멘트* 에서 *외부 조작 의도* 가 *lateinit + setter 변형*임을 시사.
|
|
382
|
+
|
|
383
|
+
### 8. `BlackJackPlayers.drawAdditionalCardsForPlayers` 함수 인자 = 람다 2개 — 콜백 지옥
|
|
384
|
+
|
|
385
|
+
```kotlin
|
|
386
|
+
fun drawAdditionalCardsForPlayers(
|
|
387
|
+
isPlayerWantedAdditionalCards: (player: Player) -> Boolean,
|
|
388
|
+
checkCurrentCards: (player: Player) -> Unit = { },
|
|
389
|
+
) {
|
|
390
|
+
players.forEach { player ->
|
|
391
|
+
player.drawCardsRepeatedly(
|
|
392
|
+
isPlayerWantedAdditionalCards = { isPlayerWantedAdditionalCards(player) },
|
|
393
|
+
checkCurrentCards = { checkCurrentCards(player) }
|
|
394
|
+
)
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
→ **콜백 람다 2개 = call site 인지 부담 ↑** + *내부에서 람다 재포장 (`{ isPlayerWantedAdditionalCards(player) }`)*.
|
|
400
|
+
|
|
401
|
+
대안: **Listener interface** (PR #148 (etama123 2단계 *Listener vs 고차함수*) 결):
|
|
402
|
+
|
|
403
|
+
```kotlin
|
|
404
|
+
interface PlayerActionListener {
|
|
405
|
+
fun isWantedAdditionalCards(player: Player): Boolean
|
|
406
|
+
fun onCardsChanged(player: Player)
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
**3 가지 트레이드오프**:
|
|
411
|
+
|
|
412
|
+
| 안 | 장점 | 단점 |
|
|
413
|
+
|---|---|---|
|
|
414
|
+
| 람다 2개 (현재) | *호출자가 함수 참조로 간결 (`InputView::requestAdditionalDraw`)* | *람다 ↑ = 인지 부담 + 람다 시그니처 분산* |
|
|
415
|
+
| Listener interface | *책임 그룹화 + 구현 명확* | *Adapter 클래스 필요 + 보일러플레이트* |
|
|
416
|
+
| Sealed result + suspend | *진행 결과 + 다음 액션 일급화* | *복잡도 ↑ + Kotlin coroutines 의존* |
|
|
417
|
+
|
|
418
|
+
reviewer 명시 X — 다만 *Tell-Don't-Ask + Domain/View 비용 메타포* 와 관련 자가 학습 영역.
|
|
419
|
+
|
|
420
|
+
PR #148·#137·#132·#90·#147·#136·#152·#88·#131·#93·#133·#85 결.
|
|
421
|
+
|
|
422
|
+
### 9. `PlayerGameResults` data class + 방어적 복사 양가성 — 학생 자가 의문
|
|
423
|
+
|
|
424
|
+
학생:
|
|
425
|
+
|
|
426
|
+
> *"test를 하기 위해서 아래와같이 equals와 hashCode를 override 했습니다. data 클래스를 사용하고 싶었지만 인자로 들어오는 List<PlayerGameResult>에 대한 방어적 복사를 수행해야된다고 생각해서 이 방법을 사용했는데 적절한 사용인지 잘 모르겠습니다!"*
|
|
427
|
+
|
|
428
|
+
reviewer:
|
|
429
|
+
|
|
430
|
+
> *"현재는 두 프로퍼티 모두 List<PlayerGameResult> 타입이기에 backing property로 선언했을 때의 큰 이점이 없어보입니다 🤔 오히려 다음과 같이 작성하면 backing property의 이점을 살리며 data 클래스로도 변환할 수 있을 것 같네요!*
|
|
431
|
+
>
|
|
432
|
+
> ```kotlin
|
|
433
|
+
> data class PlayerGameResults(private val _playerGameResults: List<PlayerGameResult>) {
|
|
434
|
+
> val playerGameResults: List<PlayerGameResult>
|
|
435
|
+
> get() = _playerGameResults.toList()
|
|
436
|
+
> ...
|
|
437
|
+
> }
|
|
438
|
+
> ```"
|
|
439
|
+
|
|
440
|
+
→ **2 가지 학습**:
|
|
441
|
+
|
|
442
|
+
#### 9.1. *방어적 복사 vs data class 양가성*
|
|
443
|
+
|
|
444
|
+
학생 자가 사고: *data class 사용 시 equals 자동 생성 → 방어적 복사 어려움 → 그래서 equals/hashCode override*.
|
|
445
|
+
|
|
446
|
+
reviewer 자가 답변: *data class + private val 백킹 + getter toList() = 방어적 복사 자동 + equals 자동*. **양립 가능**.
|
|
447
|
+
|
|
448
|
+
PR #137·#148 결의 *방어적 복사 강박 자가 학습 (불변 객체 deepCopy 비용)* 결.
|
|
449
|
+
|
|
450
|
+
#### 9.2. *backing property = 두 프로퍼티 같은 타입 시 이점 ↓*
|
|
451
|
+
|
|
452
|
+
reviewer *"두 프로퍼티 모두 List<PlayerGameResult> 타입이기에 backing property로 선언했을 때의 큰 이점이 없어보입니다"* → **backing property 사용 시점 트레이드오프**:
|
|
453
|
+
|
|
454
|
+
| 케이스 | backing property 이점 |
|
|
455
|
+
|---|---|
|
|
456
|
+
| 내부 MutableList + 외부 List | *불변 노출* + *방어적 복사* |
|
|
457
|
+
| 내부 List + 외부 List (같은 타입) | *방어적 복사만* (불변 노출은 그대로) |
|
|
458
|
+
| Computed property + caching | *재계산 회피* |
|
|
459
|
+
|
|
460
|
+
→ *현재 안*은 *방어적 복사만* 이점 → reviewer 의 대안 (*data class + private val + getter toList*) 가 *더 간결*.
|
|
461
|
+
|
|
462
|
+
#### 9.3. *PR #46 (rhthrhrl0 2단계 backing property) 결*
|
|
463
|
+
|
|
464
|
+
PR #46 (rhthrhrl0 2단계) 도 *backing property + 방어적 복사* 자가 학습.
|
|
465
|
+
|
|
466
|
+
**MCP 룰 `backing-property-applicability` 후보** — *backing property 사용 시점 트레이드오프*.
|
|
467
|
+
|
|
468
|
+
### 10. `enum class GameResultCase` `condition` 익명함수 — §3 참조 (Case 분리 + condition 빌더 함수)
|
|
469
|
+
|
|
470
|
+
PR #36 의 핵심 학습 시점. reviewer *enum + condition lambda 분리 = builder 함수 (companion object valueOf)*.
|
|
471
|
+
|
|
472
|
+
학생 자가 적용 결과 → *BlackJackCase / BustCase / RunningCase 3개 enum 분리 (위 §잘한점 5)*. **학습 후속 시점 완성**.
|
|
473
|
+
|
|
474
|
+
### 11. `List<Pair<String, Int>>` 타입 vs 도메인 명명
|
|
475
|
+
|
|
476
|
+
```kotlin
|
|
477
|
+
fun initPlayers(names: List<String>, getBattingMoney: (String) -> Int) { ... }
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
reviewer (관련 코멘트, `BlackJackGame.kt`):
|
|
481
|
+
|
|
482
|
+
> *"`List<Pair<String, Int>>` -> 타입만 보고도 어떤 데이터인지 판단할 수 있을까요? 사용하는 곳에서는 `.map { (playerName, battingMoney) ->`로 깔끔하게 묶어 처리하고 있지만 뷰가 도메인을 너무 잘 알고 있다는 생각도 듭니다. 어떻게 해결해볼 수 있을까요?"*
|
|
483
|
+
|
|
484
|
+
→ **Tuple 타입 누수 (Pair<String, Int>) = 도메인 의미 부족**:
|
|
485
|
+
|
|
486
|
+
#### 11.1. *뷰가 도메인을 잘 알고 있다*
|
|
487
|
+
|
|
488
|
+
*View → Domain 호출 시 (name, money) 묶음 형태* = *Domain 의 PlayerInitInfo 객체 필요* 시사.
|
|
489
|
+
|
|
490
|
+
#### 11.2. *대안 3 가지*
|
|
491
|
+
|
|
492
|
+
| 안 | 장점 | 단점 |
|
|
493
|
+
|---|---|---|
|
|
494
|
+
| `Pair<String, Int>` (현재) | *간결 + Kotlin destructuring 활용* | *타입만으로 의미 모름 + View ↔ Domain 결합* |
|
|
495
|
+
| `data class PlayerInitInfo(name: String, money: Int)` | *도메인 어휘 + View → Domain 명시 인터페이스* | *DTO 추가 + 클래스 ↑* |
|
|
496
|
+
| `getBattingMoney: (String) -> Int` 람다 (현재 안의 일부) | *Pair 자료구조 회피* | *View 의존성 람다로 전이* |
|
|
497
|
+
|
|
498
|
+
#### 11.3. *PR #137·#148·#90·#136 결*
|
|
499
|
+
|
|
500
|
+
PR #137 (HamBeomJoon *Money 가변 + operator plus Unit 반환*) / PR #148 (etama123 *Listener vs 고차함수 콜백*) / PR #90 (kmkim2689 *view-as-raw-input-converter*) / PR #136 (whk06061 *State 자식 책임 부여*) 결의 *View ↔ Domain 결합 어휘*.
|
|
501
|
+
|
|
502
|
+
**MCP 룰 `tuple-leak-vs-domain-dto` 후보** — *Pair/Triple 타입 누수 vs 도메인 DTO*.
|
|
503
|
+
|
|
504
|
+
### 12. `BlackJackReferee` 함수 호출 순서 = 읽기 쉽도록 배치
|
|
505
|
+
|
|
506
|
+
reviewer:
|
|
507
|
+
|
|
508
|
+
> *"함수의 호출 순서를 정할 때에는 읽기 쉽도록 호출하는 곳을 먼저, 이어서 호출되는 순서대로 배치하는 것이 좋습니다.*
|
|
509
|
+
>
|
|
510
|
+
> ```kotlin
|
|
511
|
+
> fun main() {
|
|
512
|
+
> A()
|
|
513
|
+
> B()
|
|
514
|
+
> }
|
|
515
|
+
> fun A() {}
|
|
516
|
+
> fun B() {}
|
|
517
|
+
> ```"
|
|
518
|
+
|
|
519
|
+
→ **함수 정의 순서 = *호출 순서 따라 위에서 아래로***. *Stepdown 원칙* (Clean Code) 어휘. PR #93 (junjange 2단계 *Clean Code 인용*) 결.
|
|
520
|
+
|
|
521
|
+
**MCP 룰 `function-order-stepdown` 후보** — *호출자 먼저, 호출 함수 뒤*. 코드 가독성 룰.
|
|
522
|
+
|
|
523
|
+
다만 *Kotlin top-level 함수* 는 *순서 무관* (전방 참조 가능) → *읽기 편의 한정 룰*.
|
|
524
|
+
|
|
525
|
+
### 13. `InputView::requestAdditionalDraw` `InputView::requestPlayersName` `InputView::requestBattingMoney` — 입력 함수 폭증
|
|
526
|
+
|
|
527
|
+
```kotlin
|
|
528
|
+
private fun initPlayers() {
|
|
529
|
+
val names = InputView.requestPlayersName()
|
|
530
|
+
blackJackGame.initPlayers(names, InputView::requestBattingMoney)
|
|
531
|
+
...
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
reviewer:
|
|
536
|
+
|
|
537
|
+
> *"requestAdditionalDraw도 그렇고 이런 식으로 숫자가 아닌 입력을 허용하지 않도록 한 것은 창의적인 구현이라고 생각해요 👍 매번 입력타입이 늘어날 때마다 이러한 함수를 계속 만들어야 할까?라는 고민을 해볼 순 있겠네요."*
|
|
538
|
+
|
|
539
|
+
→ **`request*` 함수 폭증** = *입력 타입마다 함수 1개* → *N 개 입력 = N 개 함수*.
|
|
540
|
+
|
|
541
|
+
**3 가지 대안**:
|
|
542
|
+
|
|
543
|
+
| 안 | 장점 | 단점 |
|
|
544
|
+
|---|---|---|
|
|
545
|
+
| 함수별 분리 (현재) | *함수명 = 입력 의미 + 도메인 검증 통합* | *입력 ↑ = 함수 ↑ 폭증* |
|
|
546
|
+
| Generic `inputView.read<T>(prompt: String, parser: (String) -> T): T` | *함수 1개로 모든 입력 처리* | *parser 람다 매번 작성 + 도메인 검증 분산* |
|
|
547
|
+
| Sealed Input + ViewModel | *Input 일급화 + 검증 단일 위치* | *복잡도 ↑* |
|
|
548
|
+
|
|
549
|
+
reviewer *고민해볼 순 있겠네요* = *현재 안 OK + 미래 확장 의식*.
|
|
550
|
+
|
|
551
|
+
**MCP 룰 `input-function-proliferation-vs-generic` 후보** — *입력 함수 폭증 vs Generic read*.
|
|
552
|
+
|
|
553
|
+
### 14. `enum class GameResult.not()` operator 활용 — Kotlin 어휘
|
|
554
|
+
|
|
555
|
+
```kotlin
|
|
556
|
+
operator fun not(): GameResult = when (this) {
|
|
557
|
+
BLACKJACK_WIN -> LOSE
|
|
558
|
+
WIN -> LOSE
|
|
559
|
+
LOSE -> WIN
|
|
560
|
+
DRAW -> DRAW
|
|
561
|
+
}
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
→ **`operator fun not()` = enum 반전 어휘**. *딜러 결과 = !플레이어 합계*.
|
|
565
|
+
|
|
566
|
+
다만 *논리 부정 (`!`) 의미와 enum 반전 의미 비교 어색*:
|
|
567
|
+
- *`!Boolean` = true ↔ false* (논리 부정).
|
|
568
|
+
- *`!GameResult` = WIN ↔ LOSE, DRAW → DRAW* (의미 반전).
|
|
569
|
+
- *`!ProfitMoney` = -value* (부호 반전).
|
|
570
|
+
|
|
571
|
+
**3 가지 트레이드오프**:
|
|
572
|
+
|
|
573
|
+
| 안 | 장점 | 단점 |
|
|
574
|
+
|---|---|---|
|
|
575
|
+
| `operator fun not()` (현재) | *간결 (`!result`) + Kotlin 어휘* | *`!` 가 *논리 부정* 의미와 혼동* |
|
|
576
|
+
| `fun inverse()` / `fun reverse()` | *의미 명시 + `result.inverse()` 명확* | *Kotlin operator 어휘 손실* |
|
|
577
|
+
| `operator fun unaryMinus()` (ProfitMoney) | *`-result` = 부호 반전 의미 자연* | *enum 에는 어색* |
|
|
578
|
+
|
|
579
|
+
reviewer 명시 X — 다만 *Kotlin 어휘 깊은 활용* 칭찬 가치.
|
|
580
|
+
|
|
581
|
+
PR #133·#137·#148·#90 (Money operator plus, ProfitMoney 정공) 결.
|
|
582
|
+
|
|
583
|
+
**MCP 룰 `operator-not-semantic-misalign` 후보** — *`operator fun not()` 의미 일치 트레이드오프*.
|
|
584
|
+
|
|
585
|
+
### 15. State 패턴 자식 책임 부여 미적용 — reviewer 후속 권유
|
|
586
|
+
|
|
587
|
+
reviewer (위 §잘한점 2 인용):
|
|
588
|
+
|
|
589
|
+
> *"CardState가 스스로 일할 수 있도록 👍 이를 더 구체화하여 자식들에게도 책임을 부여하면 지난 수업처럼 상태 패턴의 모습을 띄게 할 수 있습니다."*
|
|
590
|
+
|
|
591
|
+
→ **State 패턴 미적용 (자식 책임 부여 X)** — 현재 CardsState 자식 (BlackJack/Bust/Running) 은 *데이터 컨테이너* + *분기는 외부 (GameResult.valueOf when)*.
|
|
592
|
+
|
|
593
|
+
**State 패턴 정공**:
|
|
594
|
+
|
|
595
|
+
```kotlin
|
|
596
|
+
sealed class CardsState {
|
|
597
|
+
abstract fun compareWith(other: CardsState): GameResult
|
|
598
|
+
|
|
599
|
+
object BlackJack : CardsState() {
|
|
600
|
+
override fun compareWith(other: CardsState): GameResult = when (other) {
|
|
601
|
+
is BlackJack -> DRAW
|
|
602
|
+
else -> BLACKJACK_WIN
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
object Bust : CardsState() {
|
|
606
|
+
override fun compareWith(other: CardsState): GameResult = when (other) {
|
|
607
|
+
is Bust -> WIN
|
|
608
|
+
else -> LOSE
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
data class Running(val score: Int) : CardsState() {
|
|
612
|
+
override fun compareWith(other: CardsState): GameResult = when (other) {
|
|
613
|
+
is Bust -> WIN
|
|
614
|
+
is BlackJack -> LOSE
|
|
615
|
+
is Running -> compareByScore(score, other.score)
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
PR #93·#136·#152·#98 결의 *State 자식 책임 부여*.
|
|
622
|
+
|
|
623
|
+
**3 가지 트레이드오프**:
|
|
624
|
+
|
|
625
|
+
| 안 | 장점 | 단점 |
|
|
626
|
+
|---|---|---|
|
|
627
|
+
| 외부 when (현재) | *분기 한 자리 + sealed 자식 단순* | *State 자식 = 데이터 컨테이너 + Tell-Don't-Ask 위반* |
|
|
628
|
+
| State 자식 추상 메서드 (정공) | *Tell-Don't-Ask + 다형성* | *self.compareWith(other) 와 other.compareWith(self) 대칭 깨기 시 어색* |
|
|
629
|
+
| Visitor 패턴 | *State 추가 시 자식 수정 X* | *복잡도 ↑ + Kotlin 에 어색 (sealed when 이 더 자연)* |
|
|
630
|
+
|
|
631
|
+
**MCP 룰 `state-children-method-vs-external-when` 후보** — *State 자식 추상 메서드 vs 외부 when*. 누적 6+ PR.
|
|
632
|
+
|
|
633
|
+
### 16. 머지 후 후속 코멘트 (학습 종료 X)
|
|
634
|
+
|
|
635
|
+
PR 머지일 = 2023-03-12. reviewer 의 마지막 라인 코멘트 2개 (`CardsState.kt` *상태 패턴 모습* + `BustCase.kt` *조건 활용 케이스 판별*) 가 머지 시점 동일.
|
|
636
|
+
|
|
637
|
+
→ **머지 ≠ 학습 종료**. PR #23·#26 결의 *머지 후 후속 코멘트*. reviewer 가 *학생 추가 학습 권유* 의식.
|
|
638
|
+
|
|
639
|
+
## 리뷰어 의견 요지
|
|
640
|
+
|
|
641
|
+
- **Tell-Don't-Ask 2단계 재발** — *playerProfitResult 값 외부 조작 → 메시지 던지기 + 일급 컬렉션* + 외부 글 (jojoldu).
|
|
642
|
+
- **Domain/View 비용 메타포** — *서버/클라이언트 라운드트립 비유*.
|
|
643
|
+
- **`enum + condition lambda 분리` = builder 함수** — *condition 익명함수 의도 누수 + valueOf 빌더 함수 캡슐화*.
|
|
644
|
+
- **sealed class 학습 깊이 + 자식 책임 부여 권유** — *학생 자가 답변 + reviewer 후속 confederate + 페어 프로그래밍 권유*.
|
|
645
|
+
- **nullable enum vs not-nullable enum 3안** — *개인 의견 명시 + 학생 선택지 분리*.
|
|
646
|
+
- **backing property + data class 융합 대안** — *방어적 복사 자가 의문 → reviewer 자가 답변*.
|
|
647
|
+
- **`decideAceValue` 명명·실제 반환 불일치** — *이름 보고 1 or 11 반환 예상하는데 실제로는 추가 점수*.
|
|
648
|
+
- **함수 호출 순서 = 호출자 먼저 + 읽기 편의** — Stepdown 원칙.
|
|
649
|
+
- **`request*` 함수 폭증 미래 의식 권유** — *입력 타입마다 함수 폭증 vs Generic*.
|
|
650
|
+
- **`List<Pair<String, Int>>` 도메인 명명 권유** — *뷰가 도메인을 너무 잘 알고 있다*.
|
|
651
|
+
- **머지 후 후속 코멘트** — *학습 종료 X*.
|
|
652
|
+
|
|
653
|
+
## 대표 인용
|
|
654
|
+
|
|
655
|
+
> [woowahan-leah]
|
|
656
|
+
> *"Domain을 서버, View를 클라이언트라고 가정해보고 View의 호출 최소화하여 비용을 줄여보면 어떨까요?"*
|
|
657
|
+
|
|
658
|
+
→ **Domain/View 비용 메타포 어휘**. 새로운 reviewer 어휘. *Kent Beck 메타포* 어휘.
|
|
659
|
+
|
|
660
|
+
> [boogi-woogi 자가 답변]
|
|
661
|
+
> *"sealed 클래스를 사용해야하는 근거에 대해서 생각해보았습니다. enum class는 해당 class에 속하는 instance가 모두 같은 프로퍼티를 갖고 같은 형식으로 이루어져야 하기 때문에 Running 상태일때만 필요한 score를 처리하기가 어렵다고 생각했습니다. (...) sealed 클래스 사용 경험이 거의 없어서 이러한 상황에서의 사용이 적절했는지 잘 모르겠습니다! (미션 끝나고 sealed 클래스에 대해서 다시 꼭 정리하겠습니다)"*
|
|
662
|
+
|
|
663
|
+
→ **학생 자가 학습 + 자가 한계 인정 + 미래 학습 의지 명시**. *학습 = 시간 두고 반복* 어휘 (PR #95·#98·#99·#23·#46 결).
|
|
664
|
+
|
|
665
|
+
> [woowahan-leah]
|
|
666
|
+
> *"이래야 진정으로 '직접 본인의 상태를 판단하는 객체'가 될 수 있지 않을까요? 고민해보고 이번 단계에 적용해보면 어떨까요? 어려움이 있다면 저와 페어 프로그래밍해봐도 좋습니다!"*
|
|
667
|
+
|
|
668
|
+
→ **페어 프로그래밍 권유 + 학습 가시화** 어휘. *reviewer 가 학생 학습 적극 개입* 의식.
|
|
669
|
+
|
|
670
|
+
> [woowahan-leah]
|
|
671
|
+
> *"playerProfitResult값을 외부에서 꺼내서 조작하기보다 직접 메세지를 던져 요청하면 어떨까요? 다른 곳에서도 이렇게 메세지를 던져 구현해야 할 필요가 있는 곳이 없는지 점검해보세요! 상황에 따라 일급 컬렉션 사용이 필요할 수 있습니다."*
|
|
672
|
+
|
|
673
|
+
→ **Tell-Don't-Ask + 다른 자리 점검 권유 + 일급 컬렉션 어휘**.
|
|
674
|
+
|
|
675
|
+
> [woowahan-leah]
|
|
676
|
+
> *"저는 참고로 nullable한 enum보다 not nullable한 enum을 선호하긴 합니다 🤔"* + *"아래 두 케이스는 참고만 해주세요!"*
|
|
677
|
+
|
|
678
|
+
→ **개인 의견 + 학생 선택지 분리** 어휘. PR #23·#26·#95 결.
|
|
679
|
+
|
|
680
|
+
> [boogi-woogi 자가 의문]
|
|
681
|
+
> *"test를 하기 위해서 아래와같이 equals와 hashCode를 override 했습니다. data 클래스를 사용하고 싶었지만 인자로 들어오는 List<PlayerGameResult>에 대한 방어적 복사를 수행해야된다고 생각해서 이 방법을 사용했는데 적절한 사용인지 잘 모르겠습니다!"*
|
|
682
|
+
|
|
683
|
+
→ **학생 자가 의문 + 자가 한계 인정** 모범. PR #91·#11·#13·#80·#106 결.
|
|
684
|
+
|
|
685
|
+
## 얻은 교훈 (보편)
|
|
686
|
+
|
|
687
|
+
1. **Tell-Don't-Ask 2단계 재발 = *부분 적용*** — *1단계 일부 자리 적용 → 2단계 다른 자리 재발*. *일관 적용 vs 부분 적용 트레이드오프*. **MCP 룰 `tell-dont-ask-partial-coverage` 후보**.
|
|
688
|
+
|
|
689
|
+
2. **Domain/View 비용 메타포 = *서버/클라이언트 라운드트립***. *호출 비용 의식 = 메타포 어휘*. **MCP 룰 `domain-view-call-cost-metaphor` 후보** (메타포 = 학습 어휘).
|
|
690
|
+
|
|
691
|
+
3. **enum + condition lambda = *데이터 메모리 낭비 + 의도 누수*** — *condition 함수 enum 멤버 보관 vs valueOf 빌더 함수 캡슐화*. 누적 8+ PR.
|
|
692
|
+
|
|
693
|
+
4. **State 자식 책임 부여 = *진정한 State 패턴*** — *데이터 컨테이너 자식 + 외부 when vs 자식 추상 메서드 + 다형성*. 누적 6+ PR.
|
|
694
|
+
|
|
695
|
+
5. **nullable enum vs not-nullable enum 3안 = *개인 의견 + 학생 선택지 분리*** — *MCP `oop_propose_alternatives` 핵심 가치*. 누적 9+ reviewer 어휘.
|
|
696
|
+
|
|
697
|
+
6. **backing property + data class 융합** — *방어적 복사 자가 의문 + data class 양립 가능* (private val + getter toList()).
|
|
698
|
+
|
|
699
|
+
7. **함수 명명 vs 실제 반환 불일치** — *`decideAceValue` 보고 1 or 11 예상 → 실제는 추가 점수*. **MCP 룰 `function-name-vs-return-semantic-mismatch` 후보**.
|
|
700
|
+
|
|
701
|
+
8. **operator overloading 의미 일치** — *`operator fun not()` = 논리 부정 vs 의미 반전 양가*. **MCP 룰 `operator-not-semantic-misalign` 후보**.
|
|
702
|
+
|
|
703
|
+
9. **Stepdown 원칙 = *호출자 먼저, 호출 함수 뒤*** — Clean Code 어휘.
|
|
704
|
+
|
|
705
|
+
10. **Tuple 누수 (Pair<String, Int>) vs 도메인 DTO** — *뷰가 도메인을 너무 잘 알고 있다*. **MCP 룰 `tuple-leak-vs-domain-dto` 후보**.
|
|
706
|
+
|
|
707
|
+
11. **request* 함수 폭증 vs Generic read** — *입력 타입마다 함수 1개 = 함수 ↑*.
|
|
708
|
+
|
|
709
|
+
12. **머지 후 후속 코멘트 = *학습 종료 X*** — *reviewer 가 머지일에도 추가 코멘트*. PR #23·#26 결.
|
|
710
|
+
|
|
711
|
+
13. **페어 프로그래밍 권유 = *reviewer 적극 개입*** — *학습 가시화 + 학생 의지 + reviewer 시간 투자*.
|
|
712
|
+
|
|
713
|
+
## 얻은 교훈 (도메인)
|
|
714
|
+
|
|
715
|
+
1. **블랙잭 1.5배 별도 enum 멤버 `BLACKJACK_WIN(1.5)`** — *Win + isBlackjack 분기* 반대 시점. 누적 8+ PR.
|
|
716
|
+
|
|
717
|
+
2. **Ace 1 기본 + 단일 +10 룰** — *재계산 1회 + Ace 1장 한정 정확*. *Ace 2장 이상* 자가 처리 한계 + *while 차감 안티패턴 반대 시점*.
|
|
718
|
+
|
|
719
|
+
3. **Singleton Deck (companion object MutableSet)** — *2판 이상 불가 + 테스트 격리 X*. 누적 17+ PR.
|
|
720
|
+
|
|
721
|
+
4. **`operator fun not()` GameResult 반전 + ProfitMoney 부호 반전** — *딜러 결과 = !플레이어 합계* 도메인 의미. Kotlin operator 깊은 활용.
|
|
722
|
+
|
|
723
|
+
5. **PlayerName + BattingMoney + ProfitMoney value class 3종** — *오프라인 페어 학습 이어진 자가 적용*.
|
|
724
|
+
|
|
725
|
+
6. **`BlackJackCase / BustCase / RunningCase` 작은 enum 3개** — *플레이어 상태별 분기 평탄화*. PR #99 *WIN/LOSE × 블랙잭/일반 곱집합* 반대 시점.
|
|
726
|
+
|
|
727
|
+
7. **CardsState `companion object valueOf(score, isInitialDraw)` + `isInitialDraw` 플래그** — *초기 2장 BlackJack 판정 + 추가 draw 후 BlackJack 판정 X 도메인 룰*.
|
|
728
|
+
|
|
729
|
+
8. **`requestAdditionalDraw` `requestPlayersName` `requestBattingMoney`** — *함수 참조 (`InputView::requestAdditionalDraw`) 활용 깊음*. *콜백 람다 = 함수 참조 결합도 ↓*.
|
|
730
|
+
|
|
731
|
+
## MCP 룰 후보 신규 (PR #36 신규 + 기존 강화)
|
|
732
|
+
|
|
733
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
734
|
+
|---|---|---|
|
|
735
|
+
| `tell-dont-ask-partial-coverage` | 신규 | 1 (#36) — 1단계 적용 + 2단계 다른 자리 재발 |
|
|
736
|
+
| `domain-view-call-cost-metaphor` | 신규 | 1 (#36) — *서버/클라이언트 비유* reviewer 어휘 |
|
|
737
|
+
| `callback-lambda-view-cost` | 신규 | 1 (#36) — *콜백 람다 = View 호출 비용* |
|
|
738
|
+
| `enum-nullability-axis` | 신규 | 1 (#36) — *nullable vs not-nullable vs NONE 멤버 3안* |
|
|
739
|
+
| `function-name-vs-return-semantic-mismatch` | 신규 | 1 (#36) — *decideAceValue vs 실제 반환* |
|
|
740
|
+
| `ace-bonus-single-vs-multi` | 신규 | 1 (#36) — *Ace +10 단일 룰 vs Multi-Ace* |
|
|
741
|
+
| `operator-not-semantic-misalign` | 신규 | 1 (#36) — *operator fun not() 의미 일치* |
|
|
742
|
+
| `function-order-stepdown` | 신규 | 1 (#36) — *Stepdown 원칙* |
|
|
743
|
+
| `input-function-proliferation-vs-generic` | 신규 | 1 (#36) — *request* 함수 폭증 vs Generic* |
|
|
744
|
+
| `tuple-leak-vs-domain-dto` | 신규 | 1 (#36) — *Pair<String, Int> 누수 vs 도메인 DTO* |
|
|
745
|
+
| `backing-property-applicability` | 신규 | 2 (#36·#46) — *backing property 사용 시점 트레이드오프* |
|
|
746
|
+
| `singleton-deck-via-companion` | 강화 | 17+ (누적) — companion object MutableSet/MutableList |
|
|
747
|
+
| `lateinit-var-call-order-invariant` | 강화 | 8+ (누적) — 호출 순서 invariant |
|
|
748
|
+
| `state-children-method-vs-external-when` | 강화 | 6+ (#93·#136·#152·#98·#36) — State 자식 책임 |
|
|
749
|
+
| `enum-condition-lambda-misplacement` | 강화 | 8+ (#36·#98·#43·#107·#137·#148·#76·#86·#73) |
|
|
750
|
+
| `blackjack-rule-fidelity` | 강화 | 8+ (#36·#26·#147·#88·#93·#136·#152·#133) — BLACKJACK_WIN 1.5배 |
|
|
751
|
+
|
|
752
|
+
## 메타 어휘 (12 reviewer + MCP 핵심 가치 합류)
|
|
753
|
+
|
|
754
|
+
- ***Domain/View 비용 메타포 (서버/클라이언트)*** — woowahan-leah PR #36 — *Domain ↔ View 호출 비용 의식*.
|
|
755
|
+
- ***페어 프로그래밍 권유*** — woowahan-leah PR #36 — *학습 가시화 + reviewer 적극 개입*.
|
|
756
|
+
- ***개인 의견 + 학생 선택지 분리*** — woowahan-leah PR #36 — *"저는 참고로 nullable한 enum보다 not nullable한 enum을 선호하긴 합니다 🤔"* + *"아래 두 케이스는 참고만 해주세요!"* — *MCP `oop_propose_alternatives` 핵심 가치 합류*.
|
|
757
|
+
- ***외부 글 활용*** — woowahan-leah PR #36 — *jojoldu.tistory.com/412* (일급 컬렉션) — *외부 자료 + 자가 학습* 어휘.
|
|
758
|
+
- ***머지 후 후속 코멘트*** — woowahan-leah PR #36 — *학습 종료 X + 추가 학습 권유*. PR #23·#26 결.
|
|
759
|
+
- ***학생 자가 한계 인정 + 미래 학습 의지*** — boogi-woogi *"sealed 클래스 사용 경험이 거의 없어서 이러한 상황에서의 사용이 적절했는지 잘 모르겠습니다! (미션 끝나고 sealed 클래스에 대해서 다시 꼭 정리하겠습니다)"* — *학습 시간성 인정 + 미래 학습 시점 명시*. 누적 9+ PR.
|
|
760
|
+
|
|
761
|
+
## 비교 (PR #18 → #36 진화 — 사족 X, 안티패턴 명시만)
|
|
762
|
+
|
|
763
|
+
- **1단계 #18 신규 reviewer woowahan-leah → 2단계 #36 동일 reviewer = 학생-reviewer 페어 안정** (2 PR 누적).
|
|
764
|
+
- **1단계 Tell-Don't-Ask (DrawState.POSSIBLE 외부 판단) → 2단계 playerProfitResult 외부 조작 재발** — *부분 적용*.
|
|
765
|
+
- **1단계 enum 매직 넘버 자가 의문 → 2단계 enum + condition lambda 의도 누수 자가 의문** — *enum 학습 시간성*.
|
|
766
|
+
- **1단계 일급 컬렉션 칭찬 → 2단계 일급 컬렉션 권유 + 외부 글** — *학습 시점 강화*.
|
|
767
|
+
- **1단계 상속 vs 조합 자가 솔직 인정 → 2단계 sealed class 자가 한계 인정 + 미래 학습 의지** — *학생 자가 한계 인정 일관*.
|
|
768
|
+
|
|
769
|
+
→ *진화 비교 = 사족 아님 (안티패턴 코드 위치 명시)* + *학생 자가 한계 인정 어휘 일관*.
|