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,258 @@
|
|
|
1
|
+
# PR #20 — [블랙잭 1단계] 핑구 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@pingu244](https://github.com/pingu244)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/20
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @namjackson
|
|
7
|
+
- **라인 코멘트:** 30 (리뷰어 22 / 리뷰이 8)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`Deck(deck: List<Card>)` 명시 주입** — 셔플은 외부.
|
|
12
|
+
- **`abstract class ParticipantState` + `DealerState`/`PlayerState`** + 공통 추상화 시도.
|
|
13
|
+
- **`Referee` 분리** + `Result` enum.
|
|
14
|
+
- **`Map<String, PlayerState>` 사용 — `name` 키 매핑** (후속에 객체로 변경 권고).
|
|
15
|
+
|
|
16
|
+
## 못한 점 (설계 관점)
|
|
17
|
+
|
|
18
|
+
### 1. `CardMaker.makeCard()` vs `makeCards()` 함수명 — *단/복수 모호*
|
|
19
|
+
|
|
20
|
+
```kotlin
|
|
21
|
+
class CardMaker {
|
|
22
|
+
fun makeCards(): List<Card> { ... }
|
|
23
|
+
private fun makeCard(shape: Shape): List<Card> { ... } // ⚠ 단수 이름인데 List 반환
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
리뷰어: "*makeCard와 makeCards는 어떤 차이일까요? 함수명을 직관적으로 추상화해보면 어떨까요?* *구현부를 확인하기전에 함수명만으로도 파악할수 있으면 좋을거 같아요!*" — *단/복수* 미세 차이로 *의미 구분*은 *읽기 비용 ↑*. `makeCardsBy(shape)` 또는 *함수 이름 자체를 다르게*.
|
|
28
|
+
|
|
29
|
+
### 2. `for + mutableList`보다 `flatMap`
|
|
30
|
+
|
|
31
|
+
```kotlin
|
|
32
|
+
fun makeCards(): List<Card> {
|
|
33
|
+
val cards = mutableListOf<Card>()
|
|
34
|
+
for (shape in Shape.values()) { cards.addAll(makeCard(shape)) }
|
|
35
|
+
return cards.toList().shuffled()
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
리뷰어: "*forEach, for문을 활용하기보다, map, flatMap을 활용하면 코드가 간단해질것 같아요!*" — `Shape.entries.flatMap { shape -> CardValue.entries.map { Card(shape, it) } }.shuffled()` 한 줄. PR #17·#28과 같은 결.
|
|
40
|
+
|
|
41
|
+
### 3. `Deck(deck, _deck)` 두 필드 중복
|
|
42
|
+
|
|
43
|
+
```kotlin
|
|
44
|
+
class Deck(private val deck: List<Card>) {
|
|
45
|
+
private val _deck = deck.toMutableList()
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
리뷰어: "*deck과 _deck 두가지가 중복되어 가지고 있네요!* *Backing Properties를 활용하실 목적이였을까요?*" — **Backing property 오용**. *생성자 인자 deck*과 *내부 _deck* 둘 다 보관 = *중복 + 동기화 위험*. `class Deck(initialCards: List<Card>) { private val _cards = initialCards.toMutableList() }` 또는 `private val cards: MutableList<Card>` 직접.
|
|
50
|
+
|
|
51
|
+
### 4. `ParticipantState` 추상이 *abstract` 사용 이유 불명
|
|
52
|
+
|
|
53
|
+
리뷰어: "*abstract로 선언한 이유는 무엇일까요?* *딜러의 checkAvailableForPick와 플레이어의 checkBurst는 어떤 차이고, 무엇을 추상화할 수 있을까* 고민해보면 어떨까요?" — *추상 클래스 도입했으나 추상화 활용 부재*. *공통 행위 = canDraw()* 같은 *단일 추상 메서드*가 자연. 학생 후속: `checkOverCondition` 추상 함수 도입.
|
|
54
|
+
|
|
55
|
+
### 5. `~State` 명명이 *카드 보유자*를 의미
|
|
56
|
+
|
|
57
|
+
리뷰어: "*~State라는 네이밍을 지었지만, 사실 상태에 대한 정보보단, 단순한 보유한 카드뭉치를 의미하는것 같아요* *어떤 목적으로 어떤 책임을 가진 객체를 설계하셨는지 고민해보셔도 좋을거같아요*" — **클래스명 vs 실제 책임 불일치**. *DealerState/PlayerState*는 *상태 정보*를 연상시키지만 *실제는 카드 보유 + 점수 계산*. `Dealer/Player` 또는 `DealerHand/PlayerHand`가 자연. **이름이 의미를 거짓말**.
|
|
58
|
+
|
|
59
|
+
### 6. `Controller`가 `names`와 `blackjackGame`을 *모두 보유*
|
|
60
|
+
|
|
61
|
+
```kotlin
|
|
62
|
+
fun startGame() {
|
|
63
|
+
val names = InputView.inputPlayerNames()
|
|
64
|
+
val blackjackGame = BlackjackGame(names)
|
|
65
|
+
requestPickCard(names, blackjackGame)
|
|
66
|
+
...
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
리뷰어: "*names은 blackjackGames내에서 관리되어야하는 부분이 아닐까요?*" — *names를 BlackjackGame 생성자에 넘긴 후 Controller가 다시 names를 인자로* = *데이터 중복 보유*. `blackjackGame.players` 메시지로 충분.
|
|
71
|
+
|
|
72
|
+
### 7. `Controller.validatePickAnswer(name)`가 *문자열 비교*
|
|
73
|
+
|
|
74
|
+
```kotlin
|
|
75
|
+
private fun repeatPickCard(blackjackGame: BlackjackGame, name: String) {
|
|
76
|
+
while (!blackjackGame.checkBurst(name)) {
|
|
77
|
+
val answer = validatePickAnswer(name)
|
|
78
|
+
if (answer == YES_ANSWER) blackjackGame.pickPlayerCard(name)
|
|
79
|
+
if (answer == NO_ANSWER) return
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
리뷰어: "*컨트롤러에서는 카드를 받을것인지 말것인지에 대한 Boolean값이 관심사인것 같아요!* *어떤 문자열로 받는지는 View의 책임*은 아닐까요? *y였던 문자열이 o, yes 등으로 변경된다면, View뿐 아니라 ,Controller에도 영향이 있을것 같아요!*" — **Controller가 문자열 인식 = UI 형식 누수**. *InputView.askPickCard(): Boolean*가 자연. PR #25·#28·#33과 같은 결.
|
|
85
|
+
|
|
86
|
+
### 8. `Map<String, PlayerState>` — 객체화 필요
|
|
87
|
+
|
|
88
|
+
```kotlin
|
|
89
|
+
val playersStates = mutableMapOf<String, PlayerState>()
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
리뷰어: "*String, PlayerState은 무엇을 의미할까요?* *Map이 아니라 객체로 관리되면 어떨까요?*" — **Map 그대로 노출 = 키 의미 불명**. `Players` 일급 컬렉션 + *내부에 `Map<Name, PlayerState>`*가 자연. *외부 호출자*는 *Players.find(name)* 메시지만. PR #25·#81·#125와 같은 결.
|
|
93
|
+
|
|
94
|
+
### 9. `BlackjackGame.lateinit var dealerState`
|
|
95
|
+
|
|
96
|
+
```kotlin
|
|
97
|
+
class BlackjackGame(private val names: List<String>) {
|
|
98
|
+
private val deck: Deck = Deck(CardMaker().makeCards())
|
|
99
|
+
lateinit var dealerState: DealerState
|
|
100
|
+
val playersStates = mutableMapOf<String, PlayerState>()
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
리뷰어: "*lateinit은 초기화를 지연시켜주지만, 가변변수로 선언됩니다.* *외부에 노출되는 가변 변수는 외부에서 변경되어 의도치않은 동작을 할것 같아요!* *init함수내에서 초기화*를 하면 *초기화지연을 할필요가 없어요!*" — **lateinit var + 외부 공개**는 *외부에서 dealerState = ...* 가능. `private val dealerState = DealerState()` + `init` 또는 `val dealerState = DealerState()` 직접. PR #92·#29·#114·#33·#34·#25와 같은 결.
|
|
105
|
+
|
|
106
|
+
### 10. `ParticipantState`의 *Ace 보정 순서 의존*
|
|
107
|
+
|
|
108
|
+
리뷰어: "*이러한 구조라면, cardList내의 Ace의 순서에 따라 다른동작을 할것 같아요* *관련 테스트들을 작성*해보면 어떨까요?" / 후속: "*카드가 ACE,ACE,JACK이라면, 12가 되어야하지만, 22로 계산이되네요!* *간단하게, sum을 먼저 구하고, Ace유무와 sum의 크기에 따라 +10을 더해주는 방법*으로 로직을 간단하게 작성할수 있어요!" — PR #33·#10·#79·#114와 같은 *Ace 순서 의존 알고리즘 실패*.
|
|
109
|
+
|
|
110
|
+
### 11. `Card.value.toString() == "ACE"` 문자열 비교
|
|
111
|
+
|
|
112
|
+
리뷰어: "*Card가 Ace인지 여부는 Card가 가져야할 책임이 아닐까요?* *문자열이 아닌 enum을 활용해서 비교*해보아요" — **`it.value.toString() == "ACE"`** 같은 *문자열 비교*는 *enum 어휘 회피*. `Card.isAce()` 또는 `it.value == CardValue.ACE`. **Java 어휘 잔재**.
|
|
113
|
+
|
|
114
|
+
### 12. `if/else 두 줄 이상은 중괄호`
|
|
115
|
+
|
|
116
|
+
리뷰어: "*if, else 가 두줄 이상이라면 중괄호를 작성해주세요*, https://kotlinlang.org/docs/coding-conventions.html#control-flow-statements *컨벤션을 지키면 어떤점이 좋을까요?*" — Kotlin 컨벤션. *블록 표현*이 *읽기 명확*.
|
|
117
|
+
|
|
118
|
+
### 13. `Referee` 중첩 조건문
|
|
119
|
+
|
|
120
|
+
```kotlin
|
|
121
|
+
fun judge(dealerSum: Int, playerSum: Int): Result {
|
|
122
|
+
return when {
|
|
123
|
+
// 여러 중첩 조건문
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
리뷰어: "*여러 조건문이 중첩되어있어 복잡한거 같아요!* *조건을 중첩시키기보다, 조건별 순서대로 나눠보면 어떨까요?* *플레이어 21초과 - 패배 딜러 21초과 - 승리 플레이어 > 딜러 - 승리 등등 ..*" — *우선순위 명시 when*. 또: 학생 후속 도착 *블랙잭 룰* (`Ace+10 두 장만 진짜 블랙잭`) 미반영. 리뷰어가 *2단계에서 참고하라고 명시*.
|
|
129
|
+
|
|
130
|
+
### 14. `ParticipantState`의 리턴 타입 생략
|
|
131
|
+
|
|
132
|
+
```kotlin
|
|
133
|
+
fun isAceValue() = value == CardValue.ACE // ⚠ 리턴 타입 추론
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
리뷰어: "*함수의 리턴타입가 생략되었네요, 생략이 가능하지만, 생략한 경우는 어떤 단점이 있을까요?*"
|
|
137
|
+
|
|
138
|
+
학생 자가 답변: "*이름에서부터 명시적으로 Value를 반환한다고 말하고 있기에 생략*했습니다! *생략한 경우, 코드를 읽는 사람의 입장에서 반환값을 일일이 파악해야 한다는 단점*이 있는 것 같습니다." — PR #10 (s9hn)과 같은 *Effective Kotlin Item 4*. 공개 API는 명시.
|
|
139
|
+
|
|
140
|
+
### 15. `Controller`가 *blackjackGame.players + 반복문* — Tell-Don't-Ask 위반
|
|
141
|
+
|
|
142
|
+
리뷰어 (반복): "*blackJackGame에서 names를 받아와서, 다시 blackJackGame의 checkBurst, pickPlayerCard, findPlayer 등에 사용*하고 있네요, *blackJackGame게임에 메시지를 던져서, 동작하는 역할을 부여*해보면 어떨까요?" / "*blackjackGame.players를 반복문을 돌려서, blackjackGame.repeatPickCard를 카드를 돌리기보단*, *blackjackGame에게 "players에게 반복문을 돌려서 repeatPickCard을 실행하라"는 메세지를 전달*해보면 어떨까요? `blackjackGame.playsTurn(wantPickCard: (Player) ->...`" — *Manager.data → loop → Manager.method* 안티패턴. PR #25·#33·#92와 같은 결.
|
|
143
|
+
|
|
144
|
+
### 16. `BlackjackGame`의 *public 메서드 순서 의존*
|
|
145
|
+
|
|
146
|
+
리뷰어: "*외부에서 이런 동작이 공개되면, 순서에 따라 실행되지 않는다면, 예상하지 못한 동작을 할것 같아요!* *players가 순서에 따라 각자의 턴이 BlackJackGame내부에서 동작하게 책임을 부여*해보면 어떨까요?" — **외부에서 호출 순서 invariant 보호 부재**. *진행 메서드 1개 (`play()`)*로 묶기.
|
|
147
|
+
|
|
148
|
+
### 17. `DealerCards(cards: List<Card>) : ParticipantCards(_cards)` — *중복 cards 프로퍼티*
|
|
149
|
+
|
|
150
|
+
```kotlin
|
|
151
|
+
class DealerCards(cards: List<Card>) : ParticipantCards(cards.toMutableList()) {
|
|
152
|
+
val cards: List<Card> = ... // ⚠ 중복
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
리뷰어: "*불필요하게 중복된 cards 프로퍼티는 제거해주셔도 좋아요!*" — *상속 + 동일 이름 프로퍼티 재선언*은 *그림자(shadowing)* + 혼동.
|
|
157
|
+
|
|
158
|
+
### 18. `Controller`가 *Domain에 callback 함수 전달*
|
|
159
|
+
|
|
160
|
+
학생 자가 의문: "*Input이나 Output의 함수를 도메인에게 인자로 넘기는 것이 MVC패턴에 위배되지 않을까요?*" — 학생이 *callback 전달 + 도메인의 View 의존*에 자가 의문. 답: *예, 도메인 → View 의존 위반*. PR #25 (whk06061)의 학생 자가 도달과 같은 결.
|
|
161
|
+
|
|
162
|
+
### 19. `Referee.judgePlayers`의 `forEach`보다 `map`
|
|
163
|
+
|
|
164
|
+
리뷰어: "*map과 forEach의 차이는 무엇일까요?* *map을 활용*해보아요!" — `forEach` = *사이드 이펙트만*, `map` = *변환된 List 반환*. *결과를 모음*이면 `map`.
|
|
165
|
+
|
|
166
|
+
### 20. *함수 선언 순서가 호출 순서와 불일치* (Stepdown rule)
|
|
167
|
+
|
|
168
|
+
리뷰어: "*함수 순서에 대한 이야기*입니다! *개발자들은 보통 코드를 작성하는 시간보다 작성을 위해 코드를 읽는 시간이 훨씬 많다고해요!* *코드를 읽는 사람의 가독성을 위해, 호출순서에 따라 위에서 아래로 흐름이 흐르도록 순서를*..." — PR #79와 같은 *Stepdown rule*.
|
|
169
|
+
|
|
170
|
+
### 21. `BlackjackGame` *매직넘버 2*
|
|
171
|
+
|
|
172
|
+
```kotlin
|
|
173
|
+
repeat(2) { ... } // 초기 분배 2장
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
리뷰어: "*2는 무엇일까요? 매직넘버보단, 상수로 관리되면, 가독성도 좋아질것 같아요!*" — `INITIAL_CARD_COUNT = 2`. PR #128·#119와 같은 결.
|
|
177
|
+
|
|
178
|
+
### 22. `BlackjackGame`이 *`names` 보유 — Players와 중복*
|
|
179
|
+
|
|
180
|
+
```kotlin
|
|
181
|
+
class BlackjackGame(private val names: List<String>) {
|
|
182
|
+
...
|
|
183
|
+
val playersStates = mutableMapOf<String, PlayerState>()
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
리뷰어: "*names는 Players는 중복된 값을 가지고 있는것 같아요!* *names는 초기화 이후에는 가지고있지 않으도 좋을거같아요!*" — *생성자에서만 사용*하는 *names를 멤버화* = 메모리 + 상태 중복.
|
|
188
|
+
|
|
189
|
+
### 23. `Referee`에 *블랙잭 룰 (Ace+10 두 장)* 미반영
|
|
190
|
+
|
|
191
|
+
리뷰어 (2단계 미리 참고): "*이부분은 참고하시고, 2단계 미션하면서 참고해주세요!* *ACE와 10(Jack,Queen,King) 단 두장의 카드로만 21이 된것을 블랙잭이라고합니다.* *룰상 딜러와 플레이어가 모두 블랙잭이거나, 서로 모두 21인 경우는 무승부입니다.* *블랙잭* ..." — **블랙잭 룰 정확 이해 = 16개+ PR 연속 권고**.
|
|
192
|
+
|
|
193
|
+
또: 리뷰어 *코드 제안* (`suggestion`)으로 *우선순위 명시 when* 제안.
|
|
194
|
+
|
|
195
|
+
## 리뷰어 의견 요지
|
|
196
|
+
|
|
197
|
+
- ***함수명 단/복수 (`makeCard`/`makeCards`) 모호*** — *명확한 이름*.
|
|
198
|
+
- ***`for + mutableList` < `flatMap`*** Kotlin 컬렉션 함수.
|
|
199
|
+
- ***Backing property 오용 (`deck`/`_deck` 둘 다)*** — 한 가지 표현.
|
|
200
|
+
- ***`abstract` 도입했으나 활용 부재*** — 공통 추상 메서드.
|
|
201
|
+
- ***`~State` 명명이 카드 보유자 의미*** = 이름이 거짓말.
|
|
202
|
+
- ***Controller가 names + game 중복 보유***.
|
|
203
|
+
- ***UI 형식 (`y`/`n`) Controller에 누수***.
|
|
204
|
+
- ***`Map<String, PlayerState>` 그대로 노출 = 키 의미 불명***.
|
|
205
|
+
- ***`lateinit var dealerState` + 외부 공개***.
|
|
206
|
+
- ***Ace 보정 순서 의존 = ACE,ACE,JACK 케이스 22 오답***.
|
|
207
|
+
- ***`it.value.toString() == "ACE"` 문자열 비교 < enum 활용***.
|
|
208
|
+
- ***`if/else 두 줄 = 중괄호` Kotlin 컨벤션***.
|
|
209
|
+
- ***Referee 중첩 조건 < 우선순위 when***.
|
|
210
|
+
- ***공개 API 리턴 타입 명시*** (학생 자가 도달).
|
|
211
|
+
- ***Controller → game.data + loop = manager.method 메시지***.
|
|
212
|
+
- ***외부 메서드 순서 invariant 부재 = play() 단일 진입점***.
|
|
213
|
+
- ***상속 + 중복 프로퍼티 = shadowing***.
|
|
214
|
+
- ***`forEach` vs `map`*** — 변환은 map.
|
|
215
|
+
- ***Stepdown rule***.
|
|
216
|
+
- ***매직넘버 2 = INITIAL_CARD_COUNT***.
|
|
217
|
+
- ***BlackjackGame에 names 멤버화 = 중복***.
|
|
218
|
+
- ***블랙잭 룰 (Ace+10 두 장만 블랙잭)*** — 2단계 미리 참고.
|
|
219
|
+
|
|
220
|
+
## 대표 인용
|
|
221
|
+
|
|
222
|
+
> ~State라는 네이밍을 지었지만, *사실 상태에 대한 정보보단, 단순한 보유한 카드뭉치를 의미*하는것 같아요. *어떤 목적으로 어떤 책임을 가진 객체를 설계*하셨는지 고민해보셔도 좋을거같아요
|
|
223
|
+
> — @namjackson on `ParticipantState.kt`
|
|
224
|
+
|
|
225
|
+
> 이러한 구조라면, *cardList내의 Ace의 순서에 따라 다른동작을 할것 같아요*. *카드가 ACE,ACE,JACK이라면, 12가 되어야하지만, 22로 계산이되네요!*
|
|
226
|
+
> — @namjackson on `ParticipantState.kt`
|
|
227
|
+
|
|
228
|
+
> blackjackGame.players를 반복문을 돌려서, blackjackGame.repeatPickCard를 카드를 돌리기보단, *blackjackGame에게 "players에게 반복문을 돌려서 repeatPickCard을 실행하라"는 메세지를 전달*해보면 어떨까요?
|
|
229
|
+
> — @namjackson on `BlackjackController.kt`
|
|
230
|
+
|
|
231
|
+
> Input이나 Output의 함수를 *도메인에게 인자로 넘기는 것이 MVC패턴에 위배되지 않을까요?*
|
|
232
|
+
> — @pingu244 (학생 자가 의문) on `BlackjackGame.kt`
|
|
233
|
+
|
|
234
|
+
## 얻은 교훈
|
|
235
|
+
|
|
236
|
+
- ***함수명 단/복수 미세 차이 = 의미 구분 모호*** — 명확하게 다른 이름.
|
|
237
|
+
- ***`for + mutableList`는 Java 어휘, Kotlin은 `flatMap`*** — 함수형 컬렉션.
|
|
238
|
+
- ***Backing property 오용 (`deck` + `_deck` 둘 다 보유) = 동기화 위험*** — 한 가지 표현.
|
|
239
|
+
- ***`abstract` 도입했으나 추상 메서드 부재 = 추상화 활용 부재*** — *공통 행위* 추상 메서드.
|
|
240
|
+
- ***`~State` 명명이 카드 보유자 의미 = 이름이 의미를 거짓말*** — *Dealer/Player* 또는 *Hand* 명명이 자연.
|
|
241
|
+
- ***Controller가 names + game 중복 보유 = 데이터 흐름 분산*** — *game.players* 메시지.
|
|
242
|
+
- ***UI 형식(`y`/`n`) Controller에 누수 = 16개+ PR 연속***.
|
|
243
|
+
- ***`Map<String, PlayerState>` 그대로 노출 = 키 의미 불명*** — *일급 컬렉션*으로 메시지만 노출.
|
|
244
|
+
- ***`lateinit var` + 외부 공개 = 외부에서 변경 가능 위험*** — `private val + init` 또는 *생성자 주입*.
|
|
245
|
+
- ***Ace 보정 순서 의존 = 4번째 PR (ACE,ACE,JACK 케이스 실패)*** — *합산 후 +10 단일 룰*.
|
|
246
|
+
- ***`it.value.toString() == "ACE"` 문자열 비교 = enum 어휘 회피*** — Java 잔재.
|
|
247
|
+
- ***`if/else 두 줄 = 중괄호` Kotlin 컨벤션***.
|
|
248
|
+
- ***Referee 중첩 조건 < 우선순위 when***.
|
|
249
|
+
- ***공개 API 리턴 타입 명시 = Effective Kotlin Item 4*** (학생 자가 도달).
|
|
250
|
+
- ***Controller → game.data + loop = Tell-Don't-Ask 위반*** — *manager.playTurns()* 메시지.
|
|
251
|
+
- ***공개 메서드 순서 invariant 부재 = `play()` 단일 진입점*** — 호출 순서 보호.
|
|
252
|
+
- ***상속 + 동일 이름 프로퍼티 = shadowing*** — *부모가 보유*하면 자식 재선언 X.
|
|
253
|
+
- ***`forEach`는 사이드 이펙트, `map`은 변환 반환***.
|
|
254
|
+
- ***Stepdown rule (호출 순서대로 위→아래 선언)***.
|
|
255
|
+
- ***매직넘버 2 = `INITIAL_CARD_COUNT`*** — 도메인 룰 상수.
|
|
256
|
+
- ***BlackjackGame에 names 멤버화 = 생성자에서만 쓰면 멤버 X***.
|
|
257
|
+
- ***블랙잭 룰 (Ace+10 두 장만 진짜 블랙잭) = 16개+ PR 연속 권고*** — 룰 정확 이해.
|
|
258
|
+
- ***도메인에 callback 함수 인자 = MVC 위반 (학생 자가 도달)*** — *진행 결과 반환*이 자연.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# PR #41 — [블랙잭 2단계] 핑구 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@pingu244](https://github.com/pingu244)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/41
|
|
5
|
+
- **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
|
|
6
|
+
- **리뷰어:** @namjackson (잭슨)
|
|
7
|
+
- **라인 코멘트:** 16 스레드 / 19 코멘트 — *람다 vs 반환 메시지 트레이드오프* + *3 변수 제약 자가 회의*
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **3 변수 제약 자가 회의 + 잭슨 동의** — 학생 자가 질문: *"Player라던가 BlackjackGame에서 생성자 인자로 받아오는 정보들이 3개가 되는데 이를 줄일 수 있는 방법이 있을까요? 제가 생각한 방법은 클래스를 만들어서 두가지 프로퍼티를 하나의 객체로 관리하는 것인데, 둘의 연관성이나 효율적인 코드를 위해서가 아닌 인자를 줄이고자 이렇게 만드는 것은 비효율적인 것 같습니다. (접근할 때 계속해서 파고 들어가야 하니까요!)"*. 잭슨 답변: *"3가지 이상의 변수를 가진 클래스를 쓰지 않는다라는 요구사항이 있지만, 좋은 설계를 위한 하나의 규칙일뿐, 불필요하다고 느낀다면 굳이 적용할필요는 없다는 생각이 들어요😄 좋은 설계방법을 고민해보시고, 불필요하다고 느끼시면 적용하지 않으셔도 좋을거 같아요!"*. **MCP 룰 후보 — `arbitrary-rule-driven-grouping`** (PR #133·#88·#132·#136 와 같은 결).
|
|
12
|
+
- **`View 책임 위치 자가 토론` — 입력 검증을 view vs controller** — 학생 자가 질문 + 잭슨 답변: *"이부부은 트레이드 오프 영역일것 같아요! View의 역할을 어디까지로 지정하느냐가 중요한 지점인거 같아요... View에서 검증을 하였지만, 도메인 영역에서는 View와의 관계가 분리가 되어있기 때문에 이러한 부분 또한 신뢰할수 없기 때문에 사실 유효성 검사의 경우는 View와 컨트롤러, 도메인영역에도 모두 이루어져야 한다고 보아요"*. 학습 가시화 모범. PR #132·#88·#133 와 같은 결.
|
|
13
|
+
- **`BlackjackGame` 도메인 객체 분리 시도** — 1단계 Controller god-object 진단 후속. *플레이어 턴 + 딜러 턴 흐름을 BlackjackGame 안*으로 이전 시도.
|
|
14
|
+
- **`Money` 원시값 포장 권고 후속 반영** — 잭슨의 *"Money와 같은 객체로 원시값을 포장해보면 어떨까요?"* 권고. PR #133·#90·#132·#136 와 같은 결.
|
|
15
|
+
- **`Result` 객체 반환 + Player 가변 상태 해소** — 잭슨 권고 *"Result또한 Player내에서 관리하는게 아닌, 새로운 Result객체로 반환해보면 어떨까요?"* 후속 반영 의도. 학생 자가 질문: *"근데 결국 외부에서 수정이 가능하긴 해야합니다..! 외부에서 계산하여 or 입력받아 정보를 저장해야하기 때문입니다.. 이렇게 가변 객체로 만들기 싫은데 바깥에서 변경할 수는 있어야 하는 상황에서는 어떻게 해야 할까요?"*. PR #85 (하디 2단계) 와 같은 결의 *불변 vs 가변* 트레이드오프 학생 자가 의문.
|
|
16
|
+
|
|
17
|
+
## 못한 점 (설계 관점)
|
|
18
|
+
|
|
19
|
+
### 1. `Controller` 가 *플레이어 턴 → 딜러 턴 순서 관리* — *Game 객체 책임 누수*
|
|
20
|
+
|
|
21
|
+
```kotlin
|
|
22
|
+
// BlackjackController (추정)
|
|
23
|
+
fun run() {
|
|
24
|
+
playPlayersTurns()
|
|
25
|
+
playDealerTurn()
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
잭슨 (BlackjackController.kt — 미해결): *"플레이어턴 후, 딜러 턴이 진행되는 부분은 컨트롤러에서 정하는게 아닌, blackjackGame 클래스 내에서 관리될 부분이 아닐까요?"*
|
|
30
|
+
|
|
31
|
+
→ **플레이어 → 딜러 순서 = 게임 룰**. *Controller 가 순서 결정 = Game 룰 누수*. *blackjackGame.playGame()* 한 줄 호출이 *Game 자기 흐름 통제*. PR #131·#132·#136·#152 와 같은 결.
|
|
32
|
+
|
|
33
|
+
### 2. `BlackjackGame.startBlackjackGame()` 가 *람다만 실행* — 함수 이름 misleading
|
|
34
|
+
|
|
35
|
+
잭슨 (BlackjackGame.kt — 미해결): *"startBlackjackGame이라는 함수지만, 실제로 블랙잭 게임이 시작되는걸까요? 함수내부에는 람다만 실행되고 있네요!"*
|
|
36
|
+
|
|
37
|
+
→ **`startBlackjackGame` = *블랙잭 게임을 시작한다* 의미**. *내부에 람다 호출만* = *함수 책임 부재*. *함수 이름 = 책임 명세 위반*. PR #88·#125·#114 의 *vagueName 안티패턴 변형*.
|
|
38
|
+
|
|
39
|
+
### 3. `isBlackjack` / `isBurst` 가 *Player/Dealer 책임* — *Card 책임으로 이전 권고*
|
|
40
|
+
|
|
41
|
+
잭슨 (Dealer.kt + Player.kt — 미해결): *"블랙잭을 확인하는 역할은 Card에게 책임을 부여해보면 어떨까요?"* + *"isBurst를 확인하는 부분도 Card에서 처리해보면 어떨까요? 승패시에 플레이뿐 아니라 딜러도, Burst여부를 확인하지 않을까요?"*
|
|
42
|
+
|
|
43
|
+
→ **상태 판정 = Card/Hand 책임**. *Tell-Don't-Ask* — *Card 가 자기 점수 + Bust/Blackjack 자기 판정*. *Player/Dealer 가 자기 카드 정보 직접 비교* = *Card 책임 누수*. PR #124·#108·#128·#135·#114·#125·#152·#133·#131·#132·#136 와 같은 결.
|
|
44
|
+
|
|
45
|
+
### 4. `람다 인자 vs 반환 메시지` 트레이드오프 — 학생 자가 답변
|
|
46
|
+
|
|
47
|
+
잭슨 (BlackjackController.kt — 미해결): *"람다를 이용해 결과를 받는 방식과, 결과 값을 리턴받는 방식과 어떤 장단점이 있을까요?"*
|
|
48
|
+
|
|
49
|
+
학생: *"제 생각에는 람다를 이용한다면 controller에서 맡는 일이 적어지고, 결과를 리턴받는다면 람다보다 직관적으로 하는 일을 확인할 수 있는 것 같습니다."*
|
|
50
|
+
|
|
51
|
+
잭슨 후속 (Controller.kt 미해결): *"BlackjackResult와 blackjackGame가 협력해보면 어떨까요? blackjackGame에서 BlackjackResult를 생성하여 리턴해도 좋을거같아요! 추가적으로 val gameResult = blackjackGame.play( .. 플레이 이후, 결과를 바로 받아오면 어떨까요? 직관적일거 같아요😄"*
|
|
52
|
+
|
|
53
|
+
→ **람다 인자 = Controller 책임 ↓ + 흐름 분산** vs **반환 메시지 = Controller 직관 + 결과 응집**. *학생 자가 학습 + 잭슨 후속 권고 = 반환 메시지 선호*. PR #132·#136 의 *고차함수 vs 반환 메시지* 와 같은 결.
|
|
54
|
+
|
|
55
|
+
### 5. `Result.BLACKJACK_WIN` vs `WIN` 중복 — *BLACKJACK 여부 별도 체크*
|
|
56
|
+
|
|
57
|
+
잭슨 (Result.kt — 미해결): *"BLACKJACK_WIN과 WIN 과 중복된 결과가 아닐까요? BLACKJACK으로 승리하였는지를 체크하는 다른 방법은 없을까요?"*
|
|
58
|
+
|
|
59
|
+
→ **`BLACKJACK_WIN` enum 멤버 별도 = 결과 + 수익률 결합**. *PR #132·#108·#136 의 `BlackjackWin / BLACKJACK earningRate`* 와 *반대 트레이드오프* — 잭슨은 *결과는 WIN 하나 + 블랙잭 별도 체크*가 *명시*라 봄. *enum 멤버 응집 vs 분리* 트레이드오프.
|
|
60
|
+
|
|
61
|
+
### 6. `OutputView 가 계산 로직` — *View 책임 누수*
|
|
62
|
+
|
|
63
|
+
잭슨 (OutputView.kt — 미해결, 2 코멘트): *"View에서 계산로직을 호출하지말고, 계산완료된 값만 보여주도록 해보아요!"* + *"해당 로직은 dealer의 결과를 계산하는 로직으로, View에는 어울리지 않는 로직 같아요! View에서는 아무것도 모르고 전달된 데이터만 그려주는 역할을 해보아요"*
|
|
64
|
+
|
|
65
|
+
→ **View = 전달 데이터만 그림**. *계산 = 도메인 책임*. PR #132·#90·#88 와 같은 결.
|
|
66
|
+
|
|
67
|
+
### 7. `Cards.check` 함수명 — *Boolean 반환 미명시*
|
|
68
|
+
|
|
69
|
+
잭슨 (Cards.kt:24 — 미해결): *"check라는 함수명은 리턴을 기대하지는 않을수도 있을거같아요! 보통 Boolean을 리턴할때 is, has 와 같은 접두사를 자주 사용하곤 합니다!"*
|
|
70
|
+
|
|
71
|
+
→ **`check` = *동작 수행* 어휘**. *Boolean 반환은 is*/has* 접두사*. *Kotlin 어휘 표준*. *checkXX 가 Unit 반환* 가정. PR #125·#114·#10 와 같은 결.
|
|
72
|
+
|
|
73
|
+
### 8. `List<Money>` 인자 — *name 별 베팅 매핑 부재*
|
|
74
|
+
|
|
75
|
+
잭슨 (BlackjackGame.kt — 미해결): *"List<Money>가 무엇인지 파악하기 힘들거같아요, name별 베팅머니는 함께 관리되거나, 람다를 활용해보면 어떨까요?"*
|
|
76
|
+
|
|
77
|
+
→ **`List<Money>` = 익명 컬렉션**. *플레이어 순서 의존 = 인덱스 일치 강제*. *Map<Player, Money> 또는 데이터 클래스 (BetInfo) 응집*이 정공. PR #132 (환노 2단계) 의 *Map<X,X> 지양* 진단과 같은 결.
|
|
78
|
+
|
|
79
|
+
### 9. `BlackjackGameTest` 학생 자가 질문 — *private 변수 테스트* 함정
|
|
80
|
+
|
|
81
|
+
학생 자가 질문: *"BlackjackGame을 테스트하기 위해서는 BlackjackGame의 private 변수인 players와 dealer를 public으로 돌려야하는데 테스트만을 위해서 그래도 되는 것인지 궁금합니다."*
|
|
82
|
+
|
|
83
|
+
잭슨: *"먼저 테스트를 위한 코드는 지양하는게 좋아요, 테스트를 위한 코드가 된다면, 좋은 방법은 아닙니다! BlackjackGame의 어떤 테스트 작성을 위해 고민하시는걸까요?"* + *"다양한 방법이 있을 것 같아요! 먼저 불변객체라면, 불변변수에 사용해서 open해주어도 좋고, 생성자로 주입받는 방식을 활용할수도 있고, 결과를 확인하기 위해서라면, 리뷰에 남겨진대로, 게임 결과값을 리턴하는 구조 로 변경할수 있을거 같아요. 또 Private fun을 테스트하고 싶다면, 클래스 분리의 신호로 볼수도 있을거 같아요!"*
|
|
84
|
+
|
|
85
|
+
→ **테스트를 위한 코드 지양**. *Private 멤버 테스트 필요 → 클래스 분리 신호*. *반환 메시지 + 결과 객체 검증* 정공. *Kotlin internal* 회피.
|
|
86
|
+
|
|
87
|
+
### 10. `DealerTest` 의 *given-when-then 분리* — 학생 자가 학습 권고
|
|
88
|
+
|
|
89
|
+
잭슨 (DealerTest.kt — 미해결): *"when, then 영역을 분리해보면 어떨까요? when영역을 통해 무엇을 테스트하는지 명확하면 좋을거같아요!"*
|
|
90
|
+
|
|
91
|
+
→ **AAA (Arrange-Act-Assert) / GWT (Given-When-Then) 테스트 구조**. *주석으로 단계 명시* = *가독성 + 의도 명료*. PR #133·#136·#90 와 같은 결.
|
|
92
|
+
|
|
93
|
+
### 11. `is` 연산자 회피 + 캐스팅 — *코드 미공개*
|
|
94
|
+
|
|
95
|
+
잭슨 (Participants.kt — 미해결): *"캐스팅이 꼭 필요한 작업일까요? 참가자 타입에 역할을 만들어 보는건 어려울까요? 추가로, 코드에 체이닝이 너무 길게 되어 있어 명시적으로 변수를 분리해서 가독성을 올려주세요"*
|
|
96
|
+
|
|
97
|
+
→ **타입 캐스팅 = 다형성 부재 신호**. *Participant 추상 메서드*가 *분기 회피*. *체이닝 길이 = 가독성 ↓*. PR #93·#108 와 같은 결.
|
|
98
|
+
|
|
99
|
+
## 리뷰어 의견 요지
|
|
100
|
+
|
|
101
|
+
- **3 변수 제약 = 좋은 설계 규칙 하나일 뿐, 불필요하면 적용 X** — 학생 자가 회의 + 잭슨 동의. PR #133·#88·#132·#136 와 같은 결의 *연습 도구 인식*.
|
|
102
|
+
- **View 책임 = 트레이드오프 영역** — *View 자체 검증 + 도메인도 자기 invariant 강제*. *현재 단일 프로그램에선 중복 제거 OK*.
|
|
103
|
+
- **람다 vs 반환 메시지** — *람다 = Controller 책임 ↓ + 흐름 분산*. *반환 = 직관 + 결과 응집*. *반환 메시지 선호*.
|
|
104
|
+
- **테스트를 위한 코드 지양 — private 테스트 필요 시 클래스 분리 신호** — *생성자 주입 / 결과 반환 / 클래스 분리* 정공.
|
|
105
|
+
- **Card 책임 = 자기 점수 + Bust/Blackjack 판정** — *Player/Dealer 누수 회피*.
|
|
106
|
+
- **View 계산 로직 제거 = 전달 데이터만 그림** — *Tell-Don't-Ask*.
|
|
107
|
+
- **`List<X>` 의미 부재 = name 별 매핑 또는 람다** — *익명 컬렉션 회피*.
|
|
108
|
+
- **`check` 메서드명 = 동작 어휘, Boolean = is/has** — *Kotlin 어휘 표준*.
|
|
109
|
+
|
|
110
|
+
## 대표 인용
|
|
111
|
+
|
|
112
|
+
**잭슨 (3 변수 제약 적정 적용, Player.kt:5):**
|
|
113
|
+
> 두가지를 묶는다면, bettingMoney와 Cards를 묶어서 게임을 진행시키는 클래스로 분리할수 있다고 생각이 들지만,
|
|
114
|
+
> 지금의 구조에선, 저도 핑구님의 생각처럼 불필요하다고 생각이들어요,
|
|
115
|
+
> 3가지 이상의 변수를 가진 클래스를 쓰지 않는다라는 요구사항이 있지만,
|
|
116
|
+
> 좋은 설계를 위한 하나의 규칙일뿐, 불필요하다고 느낀다면 굳이 적용할필요는 없다는 생각이 들어요😄
|
|
117
|
+
|
|
118
|
+
**잭슨 (View 책임 트레이드오프, InputView.kt):**
|
|
119
|
+
> 이부부은 트레이드 오프 영역일것 같아요!
|
|
120
|
+
> View의 역할을 어디까지로 지정하느냐가 중요한 지점인거 같아요,
|
|
121
|
+
> View에서 일어나는 입력에 대한 예외사항은 View의 책임으로 볼수도 있을거 같아요,
|
|
122
|
+
>
|
|
123
|
+
> View에서 검증을 하였지만, 도메인 영역에서는 View와의 관계가 분리가 되어있기 때문에 이러한 부분 또한 신뢰할수 없기 때문에
|
|
124
|
+
> 사실 유효성 검사의 경우는 View와 컨트롤러, 도메인영역에도 모두 이루어져야 한다고 보아요,
|
|
125
|
+
>
|
|
126
|
+
> 하지만, 현재의 프로젝트 구조상 View-Controller-도메인이 하나의 프로그램으로 동작중이기때문에,
|
|
127
|
+
> 불필요한 중복된 검증을 제거해도 좋을거같아요.
|
|
128
|
+
|
|
129
|
+
**잭슨 (Game 흐름 = Game 책임, BlackjackController.kt):**
|
|
130
|
+
> 플레이어턴 후, 딜러 턴이 진행되는 부분은
|
|
131
|
+
> 컨트롤러에서 정하는게 아닌, blackjackGame 클래스 내에서 관리될 부분이 아닐까요?
|
|
132
|
+
|
|
133
|
+
**잭슨 (private 테스트 = 클래스 분리 신호, BlackjackGameTest.kt:12):**
|
|
134
|
+
> 먼저 테스트를 위한 코드는 지양하는게 좋아요,
|
|
135
|
+
> 테스트를 위한 코드가 된다면, 좋은 방법은 아닙니다!
|
|
136
|
+
> ...
|
|
137
|
+
> 또 Private fun을 테스트하고 싶다면, 클래스 분리의 신호로 볼수도 있을거 같아요!
|
|
138
|
+
|
|
139
|
+
**학생 자가 답변 (가변 vs 불변 트레이드오프 자가 의문, Player.kt):**
|
|
140
|
+
> 현재 Player는 name, ownCards, bettingMoney, result 이렇게 4가지의 정보를 가지고 있습니다.
|
|
141
|
+
> 생성자 인자에 다 넣을 수는 없으니 var로 만들었는데 이러면 외부에서 수정이 가능하게 됩니다.
|
|
142
|
+
> 근데 결국 외부에서 수정이 가능하긴 해야합니다..! 외부에서 계산하여 or 입력받아 정보를 저장해야하기 때문입니다..
|
|
143
|
+
> 이렇게 가변 객체로 만들기 싫은데 바깥에서 변경할 수는 있어야 하는 상황에서는 어떻게 해야 할까요?
|
|
144
|
+
|
|
145
|
+
## 얻은 교훈
|
|
146
|
+
|
|
147
|
+
1. ***3 변수 제약 = 좋은 설계 규칙 하나일 뿐, 불필요하면 적용 X***. 잭슨/말리빈/페로로/두루 4 reviewer 공통 진단. *학생 자가 회의 + reviewer 동의 = 학습 가시화*. PR #133·#88·#132·#136·#90 와 같은 결.
|
|
148
|
+
|
|
149
|
+
2. ***View 책임 트레이드오프 = View 자체 검증 + 도메인 invariant***. *완전한 분리* = *각 layer 자기 책임*. *현재 단일 프로그램*에선 *중복 제거*. *Multi-platform 고려*에선 *각 자체 검증*. PR #132·#90·#88 와 같은 결.
|
|
150
|
+
|
|
151
|
+
3. ***게임 흐름 (플레이어 턴 → 딜러 턴) = Game 객체 책임***. *Controller 가 순서 결정 = Game 룰 누수*. *`blackjackGame.play()` 한 줄 호출*이 *Game 자율*. PR #131·#132·#136·#152 와 같은 결.
|
|
152
|
+
|
|
153
|
+
4. ***`startBlackjackGame()` 가 람다만 실행 = 함수 이름 misleading***. *함수 이름 = 책임 명세*. *내부 행동 ≠ 이름* 이면 *vagueName 안티패턴*. PR #88·#125·#114 와 같은 결.
|
|
154
|
+
|
|
155
|
+
5. ***람다 vs 반환 메시지 — 반환 메시지 선호***. *람다 = Controller 책임 ↓ + 흐름 분산*. *반환 = 직관 + 결과 응집*. *학생 자가 답변 + 잭슨 권고 = 반환 우선*. PR #132·#136·#85 와 같은 결.
|
|
156
|
+
|
|
157
|
+
6. ***Private 멤버 테스트 필요 = 클래스 분리 신호 + 결과 반환 구조***. *테스트를 위한 코드 지양*. *Kotlin internal 회피*. *생성자 주입 / 불변 객체 / 결과 반환* 정공. PR #133·#136·#90 와 같은 결.
|
|
158
|
+
|
|
159
|
+
7. ***Card 책임 = 자기 점수 + Bust/Blackjack 판정 (Tell-Don't-Ask)***. *Player/Dealer 가 Card 정보 직접 비교 = 누수*. PR #124·#108·#128·#135·#114·#125·#152·#133·#131·#132·#136 와 같은 결의 *카드 자기 판단* 정공.
|
|
160
|
+
|
|
161
|
+
8. ***`List<X>` 익명 컬렉션 = 의미 부재***. *Map<Player, Money>* 또는 *BetInfo 데이터 클래스* 응집이 정공. PR #132 (환노) 의 *Map<X,X> 지양* 와 같은 결.
|
|
162
|
+
|
|
163
|
+
9. ***Kotlin Boolean 메서드명 = is/has 접두사***. *`check` = 동작 어휘*. *`isXX` / `hasXX` = Boolean 표준*. PR #125·#114·#10 와 같은 결.
|
|
164
|
+
|
|
165
|
+
10. ***Result.BLACKJACK_WIN 별도 멤버 vs WIN + 블랙잭 분기 — 트레이드오프***. *PR #132·#108·#136 의 별도 멤버* vs *PR #41·#85·#131 의 WIN + 블랙잭 분기*. *enum 멤버 응집 vs 분리* 의 *책임 위치* 트레이드오프.
|
|
166
|
+
|
|
167
|
+
11. ***View 계산 로직 = View 책임 누수***. *View = 전달 데이터만 그림*. *계산 = 도메인 책임*. *Multi-platform View 갈아끼우기* 시 *계산 로직 잃음*. PR #132·#90·#88 와 같은 결.
|
|
168
|
+
|
|
169
|
+
12. ***타입 캐스팅 + 체이닝 길이 = 다형성 부재 + 가독성 ↓***. *Participant 추상 메서드* 가 *분기 회피*. *명시적 변수 분리 + 다형성*이 정공. PR #93·#108 와 같은 결.
|
|
170
|
+
|
|
171
|
+
13. ***`is*()` 부울 메서드는 부수효과 X***. *check 같은 동작 어휘와 구분*. *호출자 분기 안전성*. PR #124·#125·#92 와 같은 결.
|