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,110 @@
|
|
|
1
|
+
// "정책/전략을 *interface로* 풀까 *enum*으로 풀까" — Kotlin 도메인의 빈번한 결정.
|
|
2
|
+
// 근거: lotto PR #131, #144, #147 (LottoMachine/LottoRank/등급 결정).
|
|
3
|
+
export function strategyOrPolicySeeds(targetName) {
|
|
4
|
+
const T = targetName || "Decision";
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
id: "sp-interface",
|
|
8
|
+
label: "Strategy interface + 구현체",
|
|
9
|
+
summary: `${T}을 인터페이스로 선언하고 구현체를 주입한다. 각 구현체는 *자기 상태/의존*을 ` +
|
|
10
|
+
`생성자로 받는다 (예: ManualLottoMachine(numbers), AutomaticLottoMachine(random)).`,
|
|
11
|
+
design_delta: {
|
|
12
|
+
added_classes: [{ name: `${T}Strategy`, stereotype: "ServiceProvider" }],
|
|
13
|
+
},
|
|
14
|
+
tradeoffs: {
|
|
15
|
+
pros: [
|
|
16
|
+
"구현체별 *자기 상태*를 생성자로 받아 인터페이스 시그니처를 정화",
|
|
17
|
+
"테스트에서 *페이크 구현체* 주입 용이 (Random/Clock 같은 non-newable 분리)",
|
|
18
|
+
"새 정책 추가가 *새 클래스 추가*로 끝남 (OCP에 가까움)",
|
|
19
|
+
],
|
|
20
|
+
cons: [
|
|
21
|
+
"구현체별 *생성/주입* 책임이 호출 지점에 분산",
|
|
22
|
+
"정책이 1~2종에서 끝나면 *과설계*",
|
|
23
|
+
"*케이스 추가의 폐쇄성*이 깨질 수 있음 — sealed가 아니라면 컴파일러가 누락 케이스를 알려주지 못함",
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
cho_younghos_lens: {
|
|
27
|
+
cohesion: "improves",
|
|
28
|
+
coupling: "improves",
|
|
29
|
+
testability: "improves",
|
|
30
|
+
notes: "*다형성으로 정책을 표현*하는 가장 객체지향적인 선택.",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "sp-enum-policy",
|
|
35
|
+
label: "enum class + 케이스별 동작",
|
|
36
|
+
summary: `${T}을 enum으로 정의하고 각 상수가 자기 데이터를 가지거나 추상 메서드를 오버라이드한다. ` +
|
|
37
|
+
`예: enum class Rank(val matchCount: Int, val money: Long) { FIRST(6, ...), SECOND(5, ...) }`,
|
|
38
|
+
design_delta: {},
|
|
39
|
+
tradeoffs: {
|
|
40
|
+
pros: [
|
|
41
|
+
"케이스가 *닫혀 있음*이 타입에 드러나 when exhaustive 보장",
|
|
42
|
+
"각 케이스의 *영구한 도메인 데이터*가 한 자리에 모임",
|
|
43
|
+
"*수가 적고 변하지 않는* 정책에 가벼움",
|
|
44
|
+
],
|
|
45
|
+
cons: [
|
|
46
|
+
"케이스마다 의존 주입 어려움 — 생성자가 *정적 데이터*에 한정",
|
|
47
|
+
"*동작이 외부 상태에 의존*해야 하면 enum이 깨지기 시작",
|
|
48
|
+
"ordinal 기반 코드 결합 위험 (\"첫 번째 enum이 0등\" 같은 암묵적 가정)",
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
cho_younghos_lens: {
|
|
52
|
+
cohesion: "improves",
|
|
53
|
+
coupling: "neutral",
|
|
54
|
+
testability: "neutral",
|
|
55
|
+
notes: "lotto Rank처럼 *고정 도메인 사실*을 표현할 때 자연. 외부 의존이 끼면 interface로 전환 신호.",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "sp-sealed-class",
|
|
60
|
+
label: "sealed class + when 분기",
|
|
61
|
+
summary: `${T}을 sealed class(또는 sealed interface)로 만들어 *닫힌 다형성*을 표현. ` +
|
|
62
|
+
`케이스마다 *서로 다른 필드*를 가질 수 있어 enum의 한계를 보완.`,
|
|
63
|
+
design_delta: {},
|
|
64
|
+
tradeoffs: {
|
|
65
|
+
pros: [
|
|
66
|
+
"케이스별 *서로 다른 데이터 모양*을 자연스럽게 표현 (Manual(numbers) vs Automatic)",
|
|
67
|
+
"when 표현식이 *모든 케이스를 컴파일 단계에서* 강제 — 누락 차단",
|
|
68
|
+
"enum 대비 *상속/생성자 자유도* 확보",
|
|
69
|
+
],
|
|
70
|
+
cons: [
|
|
71
|
+
"변형 추가가 모든 when 분기 수정 비용 유발 (OCP 약화)",
|
|
72
|
+
"when 분기가 코드 곳곳에 흩어지면 *추상화 누설*",
|
|
73
|
+
"외부 의존 주입은 여전히 *생성자 의존*",
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
cho_younghos_lens: {
|
|
77
|
+
cohesion: "improves",
|
|
78
|
+
coupling: "neutral",
|
|
79
|
+
testability: "improves",
|
|
80
|
+
notes: "다형성과 enum의 *중간 지점*. 변형 데이터 모양이 다를 때 선택.",
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "sp-functional",
|
|
85
|
+
label: "함수 타입(고차 함수) 정책",
|
|
86
|
+
summary: `${T}을 별도 객체 없이 \`(Input) -> Output\` 함수 타입으로 주입한다. ` +
|
|
87
|
+
`간단한 정책(예: random 선택 함수)에 가장 가벼움.`,
|
|
88
|
+
design_delta: {},
|
|
89
|
+
tradeoffs: {
|
|
90
|
+
pros: [
|
|
91
|
+
"*케이스 추가 = 람다 작성*으로 최소 비용",
|
|
92
|
+
"테스트에서 *람다 stub*으로 매우 간결",
|
|
93
|
+
"*Random/Clock* 같은 외부 의존 분리에 자연 (Kotlin functional interface)",
|
|
94
|
+
],
|
|
95
|
+
cons: [
|
|
96
|
+
"함수 시그니처만 봐서는 *의도*가 코드에 드러나지 않음",
|
|
97
|
+
"*명명되지 않은 정책*이 호출 그래프에 떠다니면 디버깅 비용 증가",
|
|
98
|
+
"정책 수가 늘면 다시 객체화가 필요 — 마이그레이션 비용",
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
cho_younghos_lens: {
|
|
102
|
+
cohesion: "neutral",
|
|
103
|
+
coupling: "improves",
|
|
104
|
+
testability: "improves",
|
|
105
|
+
notes: "정책이 *얇고 일회성*일 때 자연. 본격 도메인이 되면 객체로 승격 신호.",
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=strategyOrPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategyOrPolicy.js","sourceRoot":"","sources":["../../../src/tradeoff/heuristics/strategyOrPolicy.ts"],"names":[],"mappings":"AAEA,6DAA6D;AAC7D,gEAAgE;AAEhE,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,CAAC,GAAG,UAAU,IAAI,UAAU,CAAC;IACnC,OAAO;QACL;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,0BAA0B;YACjC,OAAO,EACL,GAAG,CAAC,8CAA8C;gBAClD,2EAA2E;YAC7E,YAAY,EAAE;gBACZ,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;aACzE;YACD,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,sCAAsC;oBACtC,wDAAwD;oBACxD,oCAAoC;iBACrC;gBACD,IAAI,EAAE;oBACJ,4BAA4B;oBAC5B,sBAAsB;oBACtB,6DAA6D;iBAC9D;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,UAAU;gBACpB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,gCAAgC;aACxC;SACF;QACD;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EACL,GAAG,CAAC,oDAAoD;gBACxD,4FAA4F;YAC9F,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,0CAA0C;oBAC1C,gCAAgC;oBAChC,wBAAwB;iBACzB;gBACD,IAAI,EAAE;oBACJ,qCAAqC;oBACrC,mCAAmC;oBACnC,mDAAmD;iBACpD;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,SAAS;gBACnB,WAAW,EAAE,SAAS;gBACtB,KAAK,EAAE,iEAAiE;aACzE;SACF;QACD;YACE,EAAE,EAAE,iBAAiB;YACrB,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EACL,GAAG,CAAC,yDAAyD;gBAC7D,yCAAyC;YAC3C,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,8DAA8D;oBAC9D,yCAAyC;oBACzC,yBAAyB;iBAC1B;gBACD,IAAI,EAAE;oBACJ,qCAAqC;oBACrC,+BAA+B;oBAC/B,wBAAwB;iBACzB;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,SAAS;gBACnB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,yCAAyC;aACjD;SACF;QACD;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,GAAG,CAAC,iDAAiD;gBACrD,kCAAkC;YACpC,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,0BAA0B;oBAC1B,yBAAyB;oBACzB,8DAA8D;iBAC/D;gBACD,IAAI,EAAE;oBACJ,gCAAgC;oBAChC,sCAAsC;oBACtC,iCAAiC;iBAClC;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,UAAU;gBACpB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,2CAA2C;aACnD;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// "값 객체를 어떤 *모양*으로 만들 것인가" — Kotlin 도메인에서 자주 보이는 결정.
|
|
2
|
+
// 근거: lotto PR #8, #40, #49, #64, #75, #87, #131 (LottoNumber/Money/Profit/Rank 등).
|
|
3
|
+
export function valueObjectShapeSeeds(targetName) {
|
|
4
|
+
const T = targetName || "Value";
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
id: "vo-value-class",
|
|
8
|
+
label: "value class",
|
|
9
|
+
summary: `${T}을 \`value class\`로 선언한다. 컴파일러가 인라이닝해 원시값 수준 비용을 유지하면서, ` +
|
|
10
|
+
`타입 안전성과 init invariant를 모두 얻는다.`,
|
|
11
|
+
design_delta: {},
|
|
12
|
+
tradeoffs: {
|
|
13
|
+
pros: [
|
|
14
|
+
"원시값 수준의 런타임 비용 (래퍼 할당 회피)",
|
|
15
|
+
"Int/Long과 컴파일러 단계에서 구분되어 인자 순서 실수 차단",
|
|
16
|
+
"init require로 *유효한 값만 존재* 보장",
|
|
17
|
+
"*고빈도 생성* 도메인(LottoNumber 등)에 특히 유리",
|
|
18
|
+
],
|
|
19
|
+
cons: [
|
|
20
|
+
"value class 제약: secondary constructor 불가, equals/hashCode 커스터마이즈 제한",
|
|
21
|
+
"nullable/제네릭/list 안에 들어가면 *박싱* 발생 (인라이닝 깨짐)",
|
|
22
|
+
"필드가 *정확히 하나*여야 함 — 복합 값에는 부적합",
|
|
23
|
+
"리플렉션/직렬화 라이브러리와의 호환성 검증 필요",
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
cho_younghos_lens: {
|
|
27
|
+
cohesion: "improves",
|
|
28
|
+
coupling: "improves",
|
|
29
|
+
testability: "improves",
|
|
30
|
+
notes: "단일 필드 + invariant가 본질인 값 객체에 가장 정직한 모양.",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "vo-data-class",
|
|
35
|
+
label: "data class",
|
|
36
|
+
summary: `${T}을 \`data class\`로 선언한다. equals/hashCode/toString/copy/구조 분해를 자동 생성하며 ` +
|
|
37
|
+
`여러 필드를 자연스럽게 표현한다.`,
|
|
38
|
+
design_delta: {},
|
|
39
|
+
tradeoffs: {
|
|
40
|
+
pros: [
|
|
41
|
+
"*여러 필드*로 구성된 값 객체에 적합 (Money(amount, currency) 같은)",
|
|
42
|
+
"copy()로 변경된 사본 생성 — 불변성 유지가 쉬움",
|
|
43
|
+
"equals/hashCode가 *값 기반*으로 자동 — 컬렉션 사용 안전",
|
|
44
|
+
"구조 분해 선언으로 호출 측 코드 간결화",
|
|
45
|
+
],
|
|
46
|
+
cons: [
|
|
47
|
+
"단일 원시 필드에는 *과한 비용* — value class 대비 인스턴스 할당 비용",
|
|
48
|
+
"*copy()의 invariant 우회* 위험 — copy는 init 호출하지만 호출자가 검증 의도를 깨기 쉬움",
|
|
49
|
+
"data class를 *상속*하면 equals가 깨질 수 있음 (final 클래스로 두는 게 안전)",
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
cho_younghos_lens: {
|
|
53
|
+
cohesion: "improves",
|
|
54
|
+
coupling: "neutral",
|
|
55
|
+
testability: "improves",
|
|
56
|
+
notes: "필드가 2개 이상이거나 destructuring/copy가 자주 쓰일 때 정당.",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "vo-class-with-init",
|
|
61
|
+
label: "일반 class + init require",
|
|
62
|
+
summary: `${T}을 일반 \`class\`로 선언하고 init 블록에서 invariant를 강제한다. ` +
|
|
63
|
+
`생성자 가시성을 \`private\`으로 두고 팩토리 메서드로 *입력 변환*을 분리.`,
|
|
64
|
+
design_delta: {},
|
|
65
|
+
tradeoffs: {
|
|
66
|
+
pros: [
|
|
67
|
+
"private constructor + factory 패턴으로 *생성 정책*과 *invariant 검증*을 분리",
|
|
68
|
+
"value/data class 제약(필드 1개, 상속 불가 등)에 묶이지 않음",
|
|
69
|
+
"복잡한 invariant(예: 1..45 AND 짝수) 표현 자유도 가장 높음",
|
|
70
|
+
],
|
|
71
|
+
cons: [
|
|
72
|
+
"보일러플레이트 — equals/hashCode/toString 직접 작성",
|
|
73
|
+
"*값 비교* 의미를 코드에 명시하지 않으면 자칫 *참조 비교*로 회귀",
|
|
74
|
+
"리뷰어가 \"왜 data class가 아니죠?\"를 반복 질문",
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
cho_younghos_lens: {
|
|
78
|
+
cohesion: "neutral",
|
|
79
|
+
coupling: "neutral",
|
|
80
|
+
testability: "neutral",
|
|
81
|
+
notes: "값 객체 의미를 *명시적으로 표현*해야 가치를 회복.",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "vo-keep-primitive",
|
|
86
|
+
label: "원시값 유지 + 검증을 호출 지점에 분산",
|
|
87
|
+
summary: `${T}을 별도 클래스로 만들지 않고 Int/String 등을 그대로 쓰며, 검증은 *진짜 도메인 객체*가 ` +
|
|
88
|
+
`생성 시점에 한다. 일종의 *Primitive Obsession 수용*.`,
|
|
89
|
+
design_delta: {},
|
|
90
|
+
tradeoffs: {
|
|
91
|
+
pros: [
|
|
92
|
+
"객체 수 최소화 — 단순 도메인에 가벼움",
|
|
93
|
+
"Kotlin 산술/비교 연산을 그대로 활용",
|
|
94
|
+
"*검증이 정말 한 자리*에서만 일어난다면 합리적 선택",
|
|
95
|
+
],
|
|
96
|
+
cons: [
|
|
97
|
+
"도메인 어휘 상실 — Int 한 자리에서 \"번호인지 금액인지\" 의미가 사라짐",
|
|
98
|
+
"*같은 검증이 여러 곳에 흩어지면* 누락이 사일런트 버그",
|
|
99
|
+
"인자 순서 실수에 취약 (`fun foo(a: Int, b: Int)`)",
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
cho_younghos_lens: {
|
|
103
|
+
cohesion: "neutral",
|
|
104
|
+
coupling: "hurts",
|
|
105
|
+
testability: "neutral",
|
|
106
|
+
notes: "조영호 「오브젝트」: 도메인 개념이 *코드에 직접 보이지 않으면* 협업이 어려워진다.",
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=valueObjectShape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valueObjectShape.js","sourceRoot":"","sources":["../../../src/tradeoff/heuristics/valueObjectShape.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,oFAAoF;AAEpF,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,CAAC,GAAG,UAAU,IAAI,OAAO,CAAC;IAChC,OAAO;QACL;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,aAAa;YACpB,OAAO,EACL,GAAG,CAAC,yDAAyD;gBAC7D,iCAAiC;YACnC,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,2BAA2B;oBAC3B,sCAAsC;oBACtC,8BAA8B;oBAC9B,oCAAoC;iBACrC;gBACD,IAAI,EAAE;oBACJ,qEAAqE;oBACrE,6CAA6C;oBAC7C,+BAA+B;oBAC/B,4BAA4B;iBAC7B;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,UAAU;gBACpB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,yCAAyC;aACjD;SACF;QACD;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,YAAY;YACnB,OAAO,EACL,GAAG,CAAC,uEAAuE;gBAC3E,oBAAoB;YACtB,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,oDAAoD;oBACpD,gCAAgC;oBAChC,0CAA0C;oBAC1C,wBAAwB;iBACzB;gBACD,IAAI,EAAE;oBACJ,gDAAgD;oBAChD,gEAAgE;oBAChE,yDAAyD;iBAC1D;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,SAAS;gBACnB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,8CAA8C;aACtD;SACF;QACD;YACE,EAAE,EAAE,oBAAoB;YACxB,KAAK,EAAE,yBAAyB;YAChC,OAAO,EACL,GAAG,CAAC,kDAAkD;gBACtD,iDAAiD;YACnD,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,gEAAgE;oBAChE,6CAA6C;oBAC7C,6CAA6C;iBAC9C;gBACD,IAAI,EAAE;oBACJ,0CAA0C;oBAC1C,wCAAwC;oBACxC,oCAAoC;iBACrC;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,SAAS;gBACnB,WAAW,EAAE,SAAS;gBACtB,KAAK,EAAE,+BAA+B;aACvC;SACF;QACD;YACE,EAAE,EAAE,mBAAmB;YACvB,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EACL,GAAG,CAAC,0DAA0D;gBAC9D,0CAA0C;YAC5C,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,wBAAwB;oBACxB,yBAAyB;oBACzB,+BAA+B;iBAChC;gBACD,IAAI,EAAE;oBACJ,8CAA8C;oBAC9C,iCAAiC;oBACjC,0CAA0C;iBAC3C;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,SAAS;gBACtB,KAAK,EAAE,iDAAiD;aACzD;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function expansionPromptResponsibilities(useCaseTitle) {
|
|
2
|
+
return [
|
|
3
|
+
`# 책임 분해 풍부화 요청`,
|
|
4
|
+
``,
|
|
5
|
+
`유스케이스 "${useCaseTitle}"에 대해 아래 시드 대안들을 받았습니다.`,
|
|
6
|
+
`각 대안에 대해 **현재 프로젝트의 도메인 어휘**를 사용해 다음을 보강해주세요:`,
|
|
7
|
+
``,
|
|
8
|
+
`1. \`tradeoffs.pros\` / \`tradeoffs.cons\`를 추상적 문장이 아닌 이 도메인의 구체적 결과로 다시 쓰세요.`,
|
|
9
|
+
`2. \`assignments[].candidate_class\` 이름이 도메인 명사를 반영하는지 검토해 더 적절한 이름을 제안하세요.`,
|
|
10
|
+
`3. 빠진 시각이 있으면 대안을 1~2개 더 추가하세요 (총 5개를 넘기지 마세요).`,
|
|
11
|
+
`4. 조영호님 렌즈로 한 줄 평을 덧붙이세요 — "이 대안은 Tell-Don't-Ask 측면에서 ...".`,
|
|
12
|
+
``,
|
|
13
|
+
`**중요:** 단일 권장안을 내놓지 마세요. 사용자가 선택할 수 있도록 모든 대안의 가치를 동등하게 제시하세요.`,
|
|
14
|
+
].join("\n");
|
|
15
|
+
}
|
|
16
|
+
export function expansionPromptAlternatives(question, description) {
|
|
17
|
+
return [
|
|
18
|
+
`# 트레이드오프 대안 풍부화 요청`,
|
|
19
|
+
``,
|
|
20
|
+
`질문 종류: \`${question}\``,
|
|
21
|
+
`상황: ${description}`,
|
|
22
|
+
``,
|
|
23
|
+
`시드로 받은 대안들에 대해 다음을 수행하세요:`,
|
|
24
|
+
``,
|
|
25
|
+
`1. 각 대안의 \`pros\`/\`cons\`를 이 프로젝트의 실제 컨텍스트로 다시 작성.`,
|
|
26
|
+
`2. \`cho_younghos_lens\`의 \`notes\`에 cohesion/coupling/testability 변화 이유를 한 문장으로 적기.`,
|
|
27
|
+
`3. 빠진 대안이 있다면 1~2개 추가 (총 5개 한도).`,
|
|
28
|
+
`4. 사용자에게 **결정을 강요하지 말고** 각 대안이 어떤 상황에서 적합한지를 분명히 하세요.`,
|
|
29
|
+
``,
|
|
30
|
+
`결정은 사용자가 합니다. 당신의 역할은 트레이드오프를 명료하게 만드는 것입니다.`,
|
|
31
|
+
].join("\n");
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/tradeoff/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,+BAA+B,CAAC,YAAoB;IAClE,OAAO;QACL,gBAAgB;QAChB,EAAE;QACF,UAAU,YAAY,yBAAyB;QAC/C,+CAA+C;QAC/C,EAAE;QACF,+EAA+E;QAC/E,6EAA6E;QAC7E,iDAAiD;QACjD,6DAA6D;QAC7D,EAAE;QACF,gEAAgE;KACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB,EAAE,WAAmB;IAC/E,OAAO;QACL,oBAAoB;QACpB,EAAE;QACF,YAAY,QAAQ,IAAI;QACxB,OAAO,WAAW,EAAE;QACpB,EAAE;QACF,2BAA2B;QAC3B,EAAE;QACF,qDAAqD;QACrD,sFAAsF;QACtF,kCAAkC;QAClC,uDAAuD;QACvD,EAAE;QACF,8CAA8C;KAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function logErr(...args: unknown[]): void;
|
package/dist/util/log.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/util/log.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,GAAG,IAAe;IACvC,MAAM,GAAG,GAAG,IAAI;SACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare function jsonResult(data: unknown, text?: string): CallToolResult;
|
|
3
|
+
export declare function textResult(text: string): CallToolResult;
|
|
4
|
+
export declare function errorResult(message: string): CallToolResult;
|
package/dist/util/mcp.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function jsonResult(data, text) {
|
|
2
|
+
const json = JSON.stringify(data, null, 2);
|
|
3
|
+
const blocks = [];
|
|
4
|
+
if (text)
|
|
5
|
+
blocks.push({ type: "text", text });
|
|
6
|
+
blocks.push({ type: "text", text: "```json\n" + json + "\n```" });
|
|
7
|
+
return { content: blocks, structuredContent: data };
|
|
8
|
+
}
|
|
9
|
+
export function textResult(text) {
|
|
10
|
+
return { content: [{ type: "text", text }] };
|
|
11
|
+
}
|
|
12
|
+
export function errorResult(message) {
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
15
|
+
isError: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/util/mcp.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,IAAa;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;IAClE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAA+B,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { assertHasMultipleRemedies } from "./findings.js";
|
|
2
|
+
const STOPWORDS = new Set([
|
|
3
|
+
"을",
|
|
4
|
+
"를",
|
|
5
|
+
"이",
|
|
6
|
+
"가",
|
|
7
|
+
"은",
|
|
8
|
+
"는",
|
|
9
|
+
"에",
|
|
10
|
+
"와",
|
|
11
|
+
"과",
|
|
12
|
+
"의",
|
|
13
|
+
"한다",
|
|
14
|
+
"안다",
|
|
15
|
+
"한",
|
|
16
|
+
"the",
|
|
17
|
+
"a",
|
|
18
|
+
"an",
|
|
19
|
+
"of",
|
|
20
|
+
"and",
|
|
21
|
+
"or",
|
|
22
|
+
"to",
|
|
23
|
+
]);
|
|
24
|
+
function tokens(text) {
|
|
25
|
+
return new Set(text
|
|
26
|
+
.toLowerCase()
|
|
27
|
+
.replace(/[()\[\]{}.,;:!?]/g, " ")
|
|
28
|
+
.split(/\s+/)
|
|
29
|
+
.map((t) => t.trim())
|
|
30
|
+
.filter((t) => t.length > 1 && !STOPWORDS.has(t)));
|
|
31
|
+
}
|
|
32
|
+
function overlap(a, b) {
|
|
33
|
+
if (a.size === 0 || b.size === 0)
|
|
34
|
+
return 0;
|
|
35
|
+
let inter = 0;
|
|
36
|
+
for (const t of a)
|
|
37
|
+
if (b.has(t))
|
|
38
|
+
inter++;
|
|
39
|
+
return inter / Math.min(a.size, b.size);
|
|
40
|
+
}
|
|
41
|
+
export function checkCohesion(design, threshold) {
|
|
42
|
+
const out = [];
|
|
43
|
+
for (const card of design.classes) {
|
|
44
|
+
const knowingText = card.responsibilities.knowing.join(" ");
|
|
45
|
+
const doingText = card.responsibilities.doing.join(" ");
|
|
46
|
+
if (!knowingText || !doingText)
|
|
47
|
+
continue;
|
|
48
|
+
const score = overlap(tokens(knowingText), tokens(doingText));
|
|
49
|
+
if (score >= threshold)
|
|
50
|
+
continue;
|
|
51
|
+
out.push(assertHasMultipleRemedies({
|
|
52
|
+
rule_id: "low-cohesion",
|
|
53
|
+
severity: "info",
|
|
54
|
+
target: { kind: "class", id: card.id },
|
|
55
|
+
message: `${card.name}의 knowing과 doing 책임 간 어휘 중복도가 ${(score * 100).toFixed(0)}%로 낮아 ` +
|
|
56
|
+
`책임들이 같은 클래스에 모인 근거가 약합니다.`,
|
|
57
|
+
evidence: { overlap: score, threshold },
|
|
58
|
+
remedies: [
|
|
59
|
+
{
|
|
60
|
+
label: "고립된 knowing을 별개 클래스로 분리",
|
|
61
|
+
summary: "doing에서 사용되지 않는 knowing을 별개 InformationHolder로 옮긴다.",
|
|
62
|
+
tradeoffs: {
|
|
63
|
+
pros: ["응집도가 명확해진다", "각 클래스가 한 가지 이유로만 변경된다"],
|
|
64
|
+
cons: ["클래스 수가 늘어난다"],
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
label: "doing 책임을 추가하여 knowing 사용처를 확보",
|
|
69
|
+
summary: "knowing이 의도된 것이라면 그것을 활용하는 doing을 명시한다.",
|
|
70
|
+
tradeoffs: {
|
|
71
|
+
pros: ["기존 구조 유지", "도메인 의도가 코드로 드러남"],
|
|
72
|
+
cons: ["의미 없는 책임을 억지로 만들 위험"],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
label: "사용되지 않는 knowing을 제거",
|
|
77
|
+
summary: "정말로 쓰이지 않는 데이터라면 삭제한다.",
|
|
78
|
+
tradeoffs: {
|
|
79
|
+
pros: ["YAGNI 위배 해소", "단순해짐"],
|
|
80
|
+
cons: ["미래 요구를 잘못 추측한 경우 재추가 비용"],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=cohesion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohesion.js","sourceRoot":"","sources":["../../src/validate/cohesion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { assertHasMultipleRemedies } from "./findings.js";
|
|
2
|
+
// 일급 컬렉션을 만들었지만 *List를 감싸는 것 외에 아무 역할이 없는* 안티패턴.
|
|
3
|
+
// 대표 사례: class Lottos(val list: List<Lotto>)만 두고 도메인 메서드 없음.
|
|
4
|
+
// woowacourse/kotlin-lotto PR #144 (jiyuneel) — 학생 자가 답변과 @krrong 균형 코멘트.
|
|
5
|
+
const PASS_THROUGH_VERBS = [
|
|
6
|
+
// 표현/직렬화
|
|
7
|
+
"tostring",
|
|
8
|
+
"tolines",
|
|
9
|
+
"torow",
|
|
10
|
+
"출력",
|
|
11
|
+
"문자열",
|
|
12
|
+
"표시",
|
|
13
|
+
"포맷",
|
|
14
|
+
"print",
|
|
15
|
+
"format",
|
|
16
|
+
// 단순 위임/조회
|
|
17
|
+
"크기",
|
|
18
|
+
"개수",
|
|
19
|
+
"size",
|
|
20
|
+
"count",
|
|
21
|
+
"get",
|
|
22
|
+
"list",
|
|
23
|
+
"조회",
|
|
24
|
+
"반환",
|
|
25
|
+
"노출",
|
|
26
|
+
];
|
|
27
|
+
function isPassThrough(doing) {
|
|
28
|
+
const lower = doing.toLowerCase();
|
|
29
|
+
return PASS_THROUGH_VERBS.some((v) => lower.includes(v));
|
|
30
|
+
}
|
|
31
|
+
function looksLikeCollectionToken(knowing) {
|
|
32
|
+
const lower = knowing.toLowerCase();
|
|
33
|
+
if (/(list|collection|set|map|array|리스트|컬렉션|집합|배열|들)/i.test(lower))
|
|
34
|
+
return true;
|
|
35
|
+
// 영어 복수형 단순 휴리스틱
|
|
36
|
+
if (/[a-z]s\b/.test(lower))
|
|
37
|
+
return true;
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
export function checkCollectionWrapperWithoutBehavior(design) {
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const card of design.classes) {
|
|
43
|
+
if (card.stereotype !== "Structurer")
|
|
44
|
+
continue;
|
|
45
|
+
const knowing = card.responsibilities.knowing;
|
|
46
|
+
if (knowing.length > 1)
|
|
47
|
+
continue; // 다중 knowing은 다른 안티패턴
|
|
48
|
+
// knowing이 0개거나, 1개가 컬렉션 토큰일 때만 본다.
|
|
49
|
+
if (knowing.length === 1 && !looksLikeCollectionToken(knowing[0]))
|
|
50
|
+
continue;
|
|
51
|
+
const doing = card.responsibilities.doing;
|
|
52
|
+
// doing이 모두 pass-through(표현/조회)거나 비어 있어야 안티패턴.
|
|
53
|
+
if (doing.length > 0) {
|
|
54
|
+
const allPassThrough = doing.every((d) => isPassThrough(d));
|
|
55
|
+
if (!allPassThrough)
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
out.push(assertHasMultipleRemedies({
|
|
59
|
+
rule_id: "collection-wrapper-without-behavior",
|
|
60
|
+
severity: "info",
|
|
61
|
+
target: { kind: "class", id: card.id },
|
|
62
|
+
message: `${card.name}은(는) Structurer로 분류되어 있지만, 컬렉션을 감싸는 것 외에 도메인 행위가 없습니다. ` +
|
|
63
|
+
`일급 컬렉션은 *역할*이 있을 때만 가치가 있습니다. *역할 없는 wrapper*는 호출자에게 한 겹의 ` +
|
|
64
|
+
`간접 비용만 더하고 도메인 어휘를 흐립니다.`,
|
|
65
|
+
evidence: {
|
|
66
|
+
stereotype: card.stereotype,
|
|
67
|
+
knowing_count: knowing.length,
|
|
68
|
+
doing_count: doing.length,
|
|
69
|
+
example_knowing: knowing[0] ?? null,
|
|
70
|
+
example_doing: doing[0] ?? null,
|
|
71
|
+
guideline: "@krrong (lotto PR #144): \"역할과 책임이 없기에 만들지 않는 것도 좋은 근거와 방법이라고 생각해요. " +
|
|
72
|
+
"단 *도메인 의미 전달*, *불변성 보장*, *확장성*은 일급 컬렉션의 장점\" — " +
|
|
73
|
+
"일급 컬렉션 채택은 *현재 행동* + *예상 확장*의 트레이드오프.",
|
|
74
|
+
},
|
|
75
|
+
remedies: [
|
|
76
|
+
{
|
|
77
|
+
label: "도메인 행위를 끌어와 일급 컬렉션의 역할을 부여",
|
|
78
|
+
summary: `${card.name}에 *컬렉션 위에서만* 의미 있는 행위(예: 합계, 일치 개수, 우승자 판정, 필터링)를 ` +
|
|
79
|
+
`옮긴다. 현재 외부에서 ${card.name}의 데이터를 꺼내 계산하는 호출 지점을 찾아 ` +
|
|
80
|
+
`Tell-Don't-Ask로 뒤집는다. 행위가 생기면 wrapper가 *진짜 도메인 객체*가 된다.`,
|
|
81
|
+
tradeoffs: {
|
|
82
|
+
pros: [
|
|
83
|
+
"도메인 어휘가 코드에 드러남 (\"이름들의 합\"이 아니라 \"Names.totalLength()\")",
|
|
84
|
+
"컬렉션 불변성을 게이트로 보장 (외부에서 MutableList로 변형 불가)",
|
|
85
|
+
"추후 행위가 더 늘어도 한 곳에서 확장 (OCP에 가까워짐)",
|
|
86
|
+
],
|
|
87
|
+
cons: [
|
|
88
|
+
"현 시점에 행위가 정말 *없다면* 인위적 메서드를 만들 위험",
|
|
89
|
+
"행위 이전 작업이 호출자들의 사용 위치 추적을 요구함",
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
label: "wrapper 폐기, List<T> 직접 사용 + 행위는 ServiceProvider로",
|
|
95
|
+
summary: `${card.name}을 제거하고 호출 지점에서 List<T>를 직접 쓴다. 컬렉션 위에서 도는 도메인 계산은 ` +
|
|
96
|
+
`별도 ServiceProvider(또는 확장 함수)로 분리. *역할이 없으면 만들지 않는 것이 정직*하다는 ` +
|
|
97
|
+
`@krrong의 균형 답변과 일치.`,
|
|
98
|
+
tradeoffs: {
|
|
99
|
+
pros: [
|
|
100
|
+
"객체 수가 줄어 인지 부담 감소",
|
|
101
|
+
"Kotlin 컬렉션 표준 API(map/filter/sumOf)를 자연스럽게 활용",
|
|
102
|
+
"*역할 없는 추상*이라는 죽은 코드 제거",
|
|
103
|
+
],
|
|
104
|
+
cons: [
|
|
105
|
+
"List<Lotto>가 코드 전체에 노출 — 불변성/타입 의미 약화",
|
|
106
|
+
"이후 도메인 행위가 생기면 다시 모으는 비용",
|
|
107
|
+
"공동 작업자가 List<T>의 도메인적 의미를 코드에서 읽어내야 함",
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
label: "유지 + notes에 *명시적 미사용 사유* 기록",
|
|
113
|
+
summary: `${card.name}을 그대로 두되, notes에 \"현 시점 행위 없음. *불변성 게이트* 목적으로 유지\" 같은 ` +
|
|
114
|
+
`의도를 적어 *방치된 추상*이 아님을 코드 외부에서 기록한다.`,
|
|
115
|
+
tradeoffs: {
|
|
116
|
+
pros: [
|
|
117
|
+
"타입으로 도메인 의미를 *최소한* 유지 (Lottos vs List<Lotto>)",
|
|
118
|
+
"행위가 생겼을 때 추가 위치가 이미 준비됨",
|
|
119
|
+
],
|
|
120
|
+
cons: [
|
|
121
|
+
"*추측 기반* 설계 — 정말 행위가 안 생기면 영구적 잉여물",
|
|
122
|
+
"리뷰에서 \"왜 wrapper가 있죠?\"가 반복 질문으로 남음",
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=collectionWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionWrapper.js","sourceRoot":"","sources":["../../src/validate/collectionWrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { assertHasMultipleRemedies } from "./findings.js";
|
|
2
|
+
export function checkCoupling(design, threshold) {
|
|
3
|
+
const out = [];
|
|
4
|
+
for (const card of design.classes) {
|
|
5
|
+
if (card.collaborators.length <= threshold)
|
|
6
|
+
continue;
|
|
7
|
+
out.push(assertHasMultipleRemedies({
|
|
8
|
+
rule_id: "too-many-collaborators",
|
|
9
|
+
severity: "warn",
|
|
10
|
+
target: { kind: "class", id: card.id },
|
|
11
|
+
message: `${card.name}이(가) ${card.collaborators.length}명의 협력자에 의존합니다. ` +
|
|
12
|
+
`결합도가 높아 변경 시 영향 범위가 큽니다.`,
|
|
13
|
+
evidence: {
|
|
14
|
+
collaborators: card.collaborators.map((c) => c.name),
|
|
15
|
+
threshold,
|
|
16
|
+
},
|
|
17
|
+
remedies: [
|
|
18
|
+
{
|
|
19
|
+
label: "Facade/Mediator로 협력자 묶기",
|
|
20
|
+
summary: "관련된 협력자 일부를 하나의 인터페이스 뒤로 숨겨 외부에서 보이는 협력자 수를 줄인다.",
|
|
21
|
+
tradeoffs: {
|
|
22
|
+
pros: ["호출자 입장의 인터페이스가 단순해진다", "결합 표면이 줄어든다"],
|
|
23
|
+
cons: ["간접 계층이 늘어 추적이 어려워질 수 있음"],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
label: "Tell-Don't-Ask: 협력자에게 책임 이전",
|
|
28
|
+
summary: "현재 클래스가 협력자들의 상태를 끌어와 처리하고 있다면, 작업을 가지고 있는 협력자에게 옮긴다.",
|
|
29
|
+
tradeoffs: {
|
|
30
|
+
pros: ["조회 메시지가 줄어든다", "데이터 소유자에게 행위가 모인다"],
|
|
31
|
+
cons: ["협력자의 책임이 커질 수 있어 god-object 위험"],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
label: "응집된 협력자 병합",
|
|
36
|
+
summary: "사실상 같은 개념을 두 클래스가 나눠 표현 중이라면 합쳐서 협력자 수를 줄인다.",
|
|
37
|
+
tradeoffs: {
|
|
38
|
+
pros: ["인위적인 경계가 사라짐"],
|
|
39
|
+
cons: ["분리가 의도된 경우 응집도가 훼손될 수 있음"],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=coupling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling.js","sourceRoot":"","sources":["../../src/validate/coupling.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,SAAiB;IAEjB,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,SAAS;YAAE,SAAS;QACrD,GAAG,CAAC,IAAI,CACN,yBAAyB,CAAC;YACxB,OAAO,EAAE,wBAAwB;YACjC,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YACtC,OAAO,EACL,GAAG,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,iBAAiB;gBAC9D,0BAA0B;YAC5B,QAAQ,EAAE;gBACR,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpD,SAAS;aACV;YACD,QAAQ,EAAE;gBACR;oBACE,KAAK,EAAE,yBAAyB;oBAChC,OAAO,EACL,kDAAkD;oBACpD,SAAS,EAAE;wBACT,IAAI,EAAE,CAAC,sBAAsB,EAAE,aAAa,CAAC;wBAC7C,IAAI,EAAE,CAAC,yBAAyB,CAAC;qBAClC;iBACF;gBACD;oBACE,KAAK,EAAE,6BAA6B;oBACpC,OAAO,EACL,uDAAuD;oBACzD,SAAS,EAAE;wBACT,IAAI,EAAE,CAAC,cAAc,EAAE,mBAAmB,CAAC;wBAC3C,IAAI,EAAE,CAAC,gCAAgC,CAAC;qBACzC;iBACF;gBACD;oBACE,KAAK,EAAE,YAAY;oBACnB,OAAO,EACL,8CAA8C;oBAChD,SAAS,EAAE;wBACT,IAAI,EAAE,CAAC,cAAc,CAAC;wBACtB,IAAI,EAAE,CAAC,0BAA0B,CAAC;qBACnC;iBACF;aACF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|