From b2fc40c9b2ace34b58f16a5f5a1b200653d5519f Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 13:12:46 +0900 Subject: [PATCH 01/14] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=B2=B4=ED=81=AC=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b29f..aa1b4c562 100644 --- a/README.md +++ b/README.md @@ -1 +1,69 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +**과제 진행 요구 사항** + +- 미션은 [문자열 덧셈 계산기](https://github.com/woowacourse-precourse/javascript-calculator-7) 저장소를 포크하고 클론하는 것으로 시작한다. +- **기능을 구현하기 전 `README.md`에 구현할 기능 목록을 정리**해 추가한다. +- Git의 커밋 단위는 앞 단계에서 `README.md`에 정리한 기능 목록 단위로 추가한다. + - [AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)을 참고해 커밋 메시지를 작성한다. +- 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다. + +## **기능 요구 사항 체크리스트** + +입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다. + +입력 + +- [ ] 사용자에게 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 입력 받는다. + - 입력 메세지: ‘덧셈할 문자열을 입력해 주세요.’ + +내부 기능 + +- [ ] 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. + - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 +- [ ] 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. +- [ ] 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. + - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. + +예외 처리 + +- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 `Error`를 발생시킨 후 애플리케이션은 종료되어야 한다. + +### **입출력 요구 사항** + +### **입력** + +- 구분자와 양수로 구성된 문자열 + +### **출력** + +- 덧셈 결과 + +``` +결과 : 6 + +``` + +### **실행 결과 예시** + +``` +덧셈할 문자열을 입력해 주세요. +1,2:3 +결과 : 6 + +``` + +## **프로그래밍 요구 사항** + +- [ ] Node.js 20.17.0 버전에서 실행 가능해야 한다. +- [ ] 프로그램 실행의 시작점은 `App.js`의 `run()`이다. +- [ ] `package.json` 파일은 변경할 수 없으며, **제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.** +- 프로그램 종료 시 `process.exit()`를 호출하지 않는다. +- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다. +- 자바스크립트 코드 컨벤션을 지키면서 프로그래밍한다. + - 기본적으로 [JavaScript Style Guide](https://github.com/woowacourse/woowacourse-docs/tree/main/styleguide/javascript)를 원칙으로 한다. + +### **라이브러리** + +- `@woowacourse/mission-utils`에서 제공하는 `Console` API를 사용하여 구현해야 한다. + - 사용자의 값을 입력 및 출력하려면 `Console.readLineAsync()`와 `Console.print()`를 활용한다. \ No newline at end of file From 611712546663ac21c1f1d20cc653192d63e2eae1 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 13:20:59 +0900 Subject: [PATCH 02/14] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=EB=B6=80=ED=84=B0=20=EB=8D=A7=EC=85=88=ED=95=A0=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 +++++++++++++------------- src/App.js | 7 ++++++- src/Controller/mainController.js | 17 +++++++++++++++++ src/Model | 0 src/View/inputView.js | 9 +++++++++ 5 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 src/Controller/mainController.js create mode 100644 src/Model create mode 100644 src/View/inputView.js diff --git a/README.md b/README.md index aa1b4c562..18f4c2cbf 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - 미션은 [문자열 덧셈 계산기](https://github.com/woowacourse-precourse/javascript-calculator-7) 저장소를 포크하고 클론하는 것으로 시작한다. - **기능을 구현하기 전 `README.md`에 구현할 기능 목록을 정리**해 추가한다. - Git의 커밋 단위는 앞 단계에서 `README.md`에 정리한 기능 목록 단위로 추가한다. - - [AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)을 참고해 커밋 메시지를 작성한다. + - [AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)을 참고해 커밋 메시지를 작성한다. - 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다. ## **기능 요구 사항 체크리스트** @@ -14,16 +14,16 @@ 입력 -- [ ] 사용자에게 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 입력 받는다. - - 입력 메세지: ‘덧셈할 문자열을 입력해 주세요.’ +- [X] 사용자에게 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 입력 받는다. + - 입력 메세지: ‘덧셈할 문자열을 입력해 주세요.’ 내부 기능 -- [ ] 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. - - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 -- [ ] 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. -- [ ] 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. - - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. +- [ ] 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. + - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 +- [ ] 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. +- [ ] 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. + - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. 예외 처리 @@ -55,15 +55,15 @@ ## **프로그래밍 요구 사항** -- [ ] Node.js 20.17.0 버전에서 실행 가능해야 한다. -- [ ] 프로그램 실행의 시작점은 `App.js`의 `run()`이다. -- [ ] `package.json` 파일은 변경할 수 없으며, **제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.** +- [ ] Node.js 20.17.0 버전에서 실행 가능해야 한다. +- [ ] 프로그램 실행의 시작점은 `App.js`의 `run()`이다. +- [ ] `package.json` 파일은 변경할 수 없으며, **제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.** - 프로그램 종료 시 `process.exit()`를 호출하지 않는다. - 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다. - 자바스크립트 코드 컨벤션을 지키면서 프로그래밍한다. - - 기본적으로 [JavaScript Style Guide](https://github.com/woowacourse/woowacourse-docs/tree/main/styleguide/javascript)를 원칙으로 한다. + - 기본적으로 [JavaScript Style Guide](https://github.com/woowacourse/woowacourse-docs/tree/main/styleguide/javascript)를 원칙으로 한다. ### **라이브러리** - `@woowacourse/mission-utils`에서 제공하는 `Console` API를 사용하여 구현해야 한다. - - 사용자의 값을 입력 및 출력하려면 `Console.readLineAsync()`와 `Console.print()`를 활용한다. \ No newline at end of file + - 사용자의 값을 입력 및 출력하려면 `Console.readLineAsync()`와 `Console.print()`를 활용한다. diff --git a/src/App.js b/src/App.js index 091aa0a5d..883a1aa05 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,10 @@ +import { MainController } from './Controller/mainController.js'; + class App { - async run() {} + async run() { + const controller = new MainController(); + await controller.startProgram(); + } } export default App; diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js new file mode 100644 index 000000000..0d8337f19 --- /dev/null +++ b/src/Controller/mainController.js @@ -0,0 +1,17 @@ +// 나중에 사용하기 +import { InputHandler } from '../View/inputView.js'; +// import { OutputHandler } from '../View/outputView.js'; + +export class MainController { + constructor() { + this.input = new InputHandler(); + // this.output = new OutputHandler(); + } + + async startProgram() { + const stringToAdd = await this.input.getStringToAddInput(); + console.log('stringToAdd: ', stringToAdd); + + // this.output.printRateOfReturn(rateOfReturn); + } +} diff --git a/src/Model b/src/Model new file mode 100644 index 000000000..e69de29bb diff --git a/src/View/inputView.js b/src/View/inputView.js new file mode 100644 index 000000000..86f368f8b --- /dev/null +++ b/src/View/inputView.js @@ -0,0 +1,9 @@ +import { Console } from '@woowacourse/mission-utils'; +// import { INPUT_MESSAGES } from '../Constant/messages.js'; + +export class InputHandler { + // TODO: 리펙토링-상수처리 + async getStringToAddInput() { + return await Console.readLineAsync('덧셈할 문자열을 입력해 주세요.\n'); + } +} From b370c4df02e27240d4f46359f86dd85813a0033c Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 13:47:03 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20=EC=89=BC=ED=91=9C=EC=99=80=20?= =?UTF-8?q?=ED=81=B4=EB=A1=A0=EC=9C=BC=EB=A1=9C=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EA=B5=AC=EB=B6=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=ED=95=A9=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++-- src/Controller/mainController.js | 12 +++++++++++- src/Utils/calculatorToAdd.js | 9 +++++++++ src/Utils/numbersParser.js | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/Utils/calculatorToAdd.js create mode 100644 src/Utils/numbersParser.js diff --git a/README.md b/README.md index 18f4c2cbf..a768e4e43 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,13 @@ - 입력 메세지: ‘덧셈할 문자열을 입력해 주세요.’ 내부 기능 - -- [ ] 구분자를 기준으로 분리한 각 숫자의 합을 반환한다. +1) 일반적인 경우 +- [X] 쉼표(,) 또는 콜론(:)으로 숫자를 구분한다. +- [X] 구분자를 기준으로 각 숫자들을 분리 한다. +- [X] 각 숫자의 합을 반환한다. - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 + +2) 커스텀 경우 - [ ] 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. - [ ] 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js index 0d8337f19..968f4b969 100644 --- a/src/Controller/mainController.js +++ b/src/Controller/mainController.js @@ -1,7 +1,10 @@ -// 나중에 사용하기 import { InputHandler } from '../View/inputView.js'; +// 나중에 사용하기 // import { OutputHandler } from '../View/outputView.js'; +import { parseNumbers } from '../Utils/numbersParser.js'; +import { addNumbers } from '../Utils/calculatorToAdd.js'; + export class MainController { constructor() { this.input = new InputHandler(); @@ -12,6 +15,13 @@ export class MainController { const stringToAdd = await this.input.getStringToAddInput(); console.log('stringToAdd: ', stringToAdd); + const parsedNumbers = parseNumbers(stringToAdd); + console.log('parsedNumbers: ', parsedNumbers); + + const resultAddedNumbers = addNumbers(parsedNumbers); + console.log('resultAddedNumbers: ', resultAddedNumbers); + + // this.output.printRateOfReturn(rateOfReturn); } } diff --git a/src/Utils/calculatorToAdd.js b/src/Utils/calculatorToAdd.js new file mode 100644 index 000000000..2feb7410e --- /dev/null +++ b/src/Utils/calculatorToAdd.js @@ -0,0 +1,9 @@ +export const addNumbers = (parsedNumbers) => { + let sum = 0; + + parsedNumbers.forEach((num) => { + sum += num; + }); + + return sum; +}; diff --git a/src/Utils/numbersParser.js b/src/Utils/numbersParser.js new file mode 100644 index 000000000..c711d38e4 --- /dev/null +++ b/src/Utils/numbersParser.js @@ -0,0 +1,15 @@ +export const parseNumbers = (Numbers) => { + // 쉼표 , 로 나눠질 경우 + if (Numbers[1] === ',') { + return Numbers.split(',') + .map((number) => number.trim()) + .map(Number); + } + + // 클론 : 로 나눠질 경우 + if (Numbers[1] === ':') { + return Numbers.split(':') + .map((number) => number.trim()) + .map(Number); + } +}; From 6f611ffd1349161704f03d5d0f388785e025517f Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 14:14:56 +0900 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20=EC=89=BC=ED=91=9C=EC=99=80=20?= =?UTF-8?q?=ED=81=B4=EB=A1=A0=20=EA=B5=AC=EB=B6=84=EC=9E=90=20=ED=95=A8?= =?UTF-8?q?=EA=BB=98=20=EC=82=AC=EC=9A=A9=ED=95=B4=EB=8F=84=20=EB=8D=94?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++--- src/Controller/mainController.js | 10 +++------ src/Utils/numbersParser.js | 35 ++++++++++++++++++++++++-------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index a768e4e43..fcdc83c70 100644 --- a/README.md +++ b/README.md @@ -25,10 +25,12 @@ - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 2) 커스텀 경우 -- [ ] 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. -- [ ] 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다. +- 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. +- [ ] 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 인지한다. - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. - +- [ ] 구분자를 기준으로 각 숫자들을 분리 한다. +- [ ] 각 숫자의 합을 반환한다. + 예외 처리 - 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 `Error`를 발생시킨 후 애플리케이션은 종료되어야 한다. diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js index 968f4b969..95a129aeb 100644 --- a/src/Controller/mainController.js +++ b/src/Controller/mainController.js @@ -2,7 +2,7 @@ import { InputHandler } from '../View/inputView.js'; // 나중에 사용하기 // import { OutputHandler } from '../View/outputView.js'; -import { parseNumbers } from '../Utils/numbersParser.js'; +import { checkNormalOrCustom } from '../Utils/numbersParser.js'; import { addNumbers } from '../Utils/calculatorToAdd.js'; export class MainController { @@ -13,15 +13,11 @@ export class MainController { async startProgram() { const stringToAdd = await this.input.getStringToAddInput(); - console.log('stringToAdd: ', stringToAdd); - - const parsedNumbers = parseNumbers(stringToAdd); - console.log('parsedNumbers: ', parsedNumbers); - + const parsedNumbers = checkNormalOrCustom(stringToAdd); const resultAddedNumbers = addNumbers(parsedNumbers); console.log('resultAddedNumbers: ', resultAddedNumbers); - + // // \n 기준으로 구분하자 // this.output.printRateOfReturn(rateOfReturn); } } diff --git a/src/Utils/numbersParser.js b/src/Utils/numbersParser.js index c711d38e4..df7aefb25 100644 --- a/src/Utils/numbersParser.js +++ b/src/Utils/numbersParser.js @@ -1,15 +1,32 @@ -export const parseNumbers = (Numbers) => { - // 쉼표 , 로 나눠질 경우 - if (Numbers[1] === ',') { - return Numbers.split(',') - .map((number) => number.trim()) - .map(Number); +export const checkNormalOrCustom = (Numbers) => { + if (Numbers[1] === ',' || Numbers[1] === ':') { + return parseNumbersForNormal(Numbers); } - // 클론 : 로 나눠질 경우 - if (Numbers[1] === ':') { - return Numbers.split(':') + // if (Numbers[1] === ',' || Numbers[1] === ':') { + // return parseNumbersForCustom(Numbers); + // } + + // if ( + // Numbers[0] === '/' && + // Numbers[1] === '/' && + // Numbers[3] === '\\' && + // Numbers[4] === 'n' + // ) { + // } +}; + +const parseNumbersForNormal = (Numbers) => { + // 쉼표 , 로 나눠질 경우 + if (Numbers[1] === ',' || Numbers[1] === ':') { + return Numbers.split((/,|:/)) .map((number) => number.trim()) .map(Number); } }; + +const parseNumbersForCustom = () => { + // 4번째 요소붙터 커스텀으로 구분하기 + // 4번째 배열을 다시 배열로 만들어서 + // 다시 입력 받기 +}; From 6f4d1622137510c7d0beccee6eed845d7adf9d84 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 14:28:39 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EB=A1=9C=20=EB=B0=9B=EC=9D=84=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=20=EB=8D=94=ED=95=B4=EC=A7=80=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++---- src/Utils/calculatorToAdd.js | 4 +++- src/Utils/numbersParser.js | 42 ++++++++++++++++++++++-------------- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index fcdc83c70..d284ff0c9 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,15 @@ - [X] 각 숫자의 합을 반환한다. - 예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6 -2) 커스텀 경우 + +//;\n1;2;3 + +2) 커스텀 경우 - 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. -- [ ] 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 인지한다. +- [X] 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 인지한다. - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. -- [ ] 구분자를 기준으로 각 숫자들을 분리 한다. -- [ ] 각 숫자의 합을 반환한다. +- [X] 구분자를 기준으로 각 숫자들을 분리 한다. +- [X] 각 숫자의 합을 반환한다. 예외 처리 diff --git a/src/Utils/calculatorToAdd.js b/src/Utils/calculatorToAdd.js index 2feb7410e..ed7974f99 100644 --- a/src/Utils/calculatorToAdd.js +++ b/src/Utils/calculatorToAdd.js @@ -1,6 +1,8 @@ export const addNumbers = (parsedNumbers) => { let sum = 0; - + + console.log('parsedNumbers: ', parsedNumbers); + parsedNumbers.forEach((num) => { sum += num; }); diff --git a/src/Utils/numbersParser.js b/src/Utils/numbersParser.js index df7aefb25..325276789 100644 --- a/src/Utils/numbersParser.js +++ b/src/Utils/numbersParser.js @@ -2,31 +2,41 @@ export const checkNormalOrCustom = (Numbers) => { if (Numbers[1] === ',' || Numbers[1] === ':') { return parseNumbersForNormal(Numbers); } + // console.log('Numbers[0]: ', Numbers[0]); + // console.log('Numbers[1]: ', Numbers[1]); + // console.log('Numbers[2]: ', Numbers[2]); + // console.log('Numbers[3]: ', Numbers[3]); + // console.log('Numbers[4]: ', Numbers[4]); - // if (Numbers[1] === ',' || Numbers[1] === ':') { - // return parseNumbersForCustom(Numbers); - // } - - // if ( - // Numbers[0] === '/' && - // Numbers[1] === '/' && - // Numbers[3] === '\\' && - // Numbers[4] === 'n' - // ) { - // } + if ( + Numbers[0] === '/' && + Numbers[1] === '/' && + Numbers[3] === '\\' && + Numbers[4] === 'n' + ) { + return parseNumbersForCustom(Numbers); + } }; const parseNumbersForNormal = (Numbers) => { // 쉼표 , 로 나눠질 경우 if (Numbers[1] === ',' || Numbers[1] === ':') { - return Numbers.split((/,|:/)) + return Numbers.split(/,|:/) .map((number) => number.trim()) .map(Number); } }; -const parseNumbersForCustom = () => { - // 4번째 요소붙터 커스텀으로 구분하기 - // 4번째 배열을 다시 배열로 만들어서 - // 다시 입력 받기 +const parseNumbersForCustom = (Numbers) => { + // 4번째 요소부터 배열부터 문자열 생성 + const onlyNumbersAndDelimiter = Numbers.substr(5); + console.log('onlyNumbersAndDelimiter: ', onlyNumbersAndDelimiter); + + const customDelimiter = Numbers[2]; + console.log('customDelimiter ', customDelimiter); + + return onlyNumbersAndDelimiter + .split(customDelimiter) + .map((number) => number.trim()) + .map(Number); }; From ccbc14464f4d395fb68b7ecc5275f2cb71127f03 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 14:32:25 +0900 Subject: [PATCH 06/14] =?UTF-8?q?feat:=20=ED=95=A9=ED=95=B4=EC=A7=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ src/Controller/mainController.js | 9 +++------ src/Utils/numbersParser.js | 9 --------- src/View/outputView.js | 7 +++++++ 4 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 src/View/outputView.js diff --git a/README.md b/README.md index d284ff0c9..5487d62e4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,10 @@ - 예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. - [X] 구분자를 기준으로 각 숫자들을 분리 한다. - [X] 각 숫자의 합을 반환한다. + +출력 +- [X] 결과를 반환한다. + - 출력 메시지: '결과 : ${6}' 예외 처리 diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js index 95a129aeb..7cd15cfc0 100644 --- a/src/Controller/mainController.js +++ b/src/Controller/mainController.js @@ -1,6 +1,5 @@ import { InputHandler } from '../View/inputView.js'; -// 나중에 사용하기 -// import { OutputHandler } from '../View/outputView.js'; +import { OutputHandler } from '../View/outputView.js'; import { checkNormalOrCustom } from '../Utils/numbersParser.js'; import { addNumbers } from '../Utils/calculatorToAdd.js'; @@ -8,16 +7,14 @@ import { addNumbers } from '../Utils/calculatorToAdd.js'; export class MainController { constructor() { this.input = new InputHandler(); - // this.output = new OutputHandler(); + this.output = new OutputHandler(); } async startProgram() { const stringToAdd = await this.input.getStringToAddInput(); const parsedNumbers = checkNormalOrCustom(stringToAdd); const resultAddedNumbers = addNumbers(parsedNumbers); - console.log('resultAddedNumbers: ', resultAddedNumbers); - // // \n 기준으로 구분하자 - // this.output.printRateOfReturn(rateOfReturn); + this.output.printResultOfSum(resultAddedNumbers); } } diff --git a/src/Utils/numbersParser.js b/src/Utils/numbersParser.js index 325276789..ad933a7df 100644 --- a/src/Utils/numbersParser.js +++ b/src/Utils/numbersParser.js @@ -2,11 +2,6 @@ export const checkNormalOrCustom = (Numbers) => { if (Numbers[1] === ',' || Numbers[1] === ':') { return parseNumbersForNormal(Numbers); } - // console.log('Numbers[0]: ', Numbers[0]); - // console.log('Numbers[1]: ', Numbers[1]); - // console.log('Numbers[2]: ', Numbers[2]); - // console.log('Numbers[3]: ', Numbers[3]); - // console.log('Numbers[4]: ', Numbers[4]); if ( Numbers[0] === '/' && @@ -28,12 +23,8 @@ const parseNumbersForNormal = (Numbers) => { }; const parseNumbersForCustom = (Numbers) => { - // 4번째 요소부터 배열부터 문자열 생성 const onlyNumbersAndDelimiter = Numbers.substr(5); - console.log('onlyNumbersAndDelimiter: ', onlyNumbersAndDelimiter); - const customDelimiter = Numbers[2]; - console.log('customDelimiter ', customDelimiter); return onlyNumbersAndDelimiter .split(customDelimiter) diff --git a/src/View/outputView.js b/src/View/outputView.js new file mode 100644 index 000000000..f179c3507 --- /dev/null +++ b/src/View/outputView.js @@ -0,0 +1,7 @@ +import { Console } from '@woowacourse/mission-utils'; + +export class OutputHandler { + async printResultOfSum(resultAddedNumbers) { + return Console.print(`결과 : ${resultAddedNumbers}`); + } +} From 329189437aae7809f90a51d9342fbca2ec04a073 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 15:40:59 +0900 Subject: [PATCH 07/14] =?UTF-8?q?feat:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/Constant/errorMessages.js | 7 +++ src/Constant/messages.js | 7 +++ src/Controller/mainController.js | 3 ++ src/Utils/calculatorToAdd.js | 2 - src/Validation/validateStringToAdd.js | 61 +++++++++++++++++++++++++++ src/View/inputView.js | 5 +-- src/View/outputView.js | 4 +- 8 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 src/Constant/errorMessages.js create mode 100644 src/Constant/messages.js create mode 100644 src/Validation/validateStringToAdd.js diff --git a/README.md b/README.md index 5487d62e4..ddbd5e183 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ - 출력 메시지: '결과 : ${6}' 예외 처리 - +- [X] - 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 `Error`를 발생시킨 후 애플리케이션은 종료되어야 한다. ### **입출력 요구 사항** diff --git a/src/Constant/errorMessages.js b/src/Constant/errorMessages.js new file mode 100644 index 000000000..bd8cf38e2 --- /dev/null +++ b/src/Constant/errorMessages.js @@ -0,0 +1,7 @@ +const ERROR_PREFIX = '[ERROR]'; + +export const ERROR_MESSAGES = { + WRONG_INPUT: `${ERROR_PREFIX} 잘못된 입력입니다.`, + WRONG_NORMAL_INPUT: `${ERROR_PREFIX} 컴마나 클론을 기준으로 숫자를 입력하지 않으셨습니다.`, + WRONG_CUSTOM_INPUT: `${ERROR_PREFIX}커스텀 숫자를 기준으로 숫자를 입력하지 않으셨습니다.`, +}; diff --git a/src/Constant/messages.js b/src/Constant/messages.js new file mode 100644 index 000000000..fd6e75f53 --- /dev/null +++ b/src/Constant/messages.js @@ -0,0 +1,7 @@ +export const INPUT_MESSAGES = { + STRING_TO_ADD: `덧셈할 문자열을 입력해 주세요.\n`, +}; + +export const OUTPUT_MESSAGES = { + RESULT: `결과`, +}; diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js index 7cd15cfc0..653c2661b 100644 --- a/src/Controller/mainController.js +++ b/src/Controller/mainController.js @@ -3,6 +3,7 @@ import { OutputHandler } from '../View/outputView.js'; import { checkNormalOrCustom } from '../Utils/numbersParser.js'; import { addNumbers } from '../Utils/calculatorToAdd.js'; +import { ValidationHandler } from '../Validation/validateStringToAdd.js'; export class MainController { constructor() { @@ -12,6 +13,8 @@ export class MainController { async startProgram() { const stringToAdd = await this.input.getStringToAddInput(); + new ValidationHandler().checkValidation(stringToAdd); + const parsedNumbers = checkNormalOrCustom(stringToAdd); const resultAddedNumbers = addNumbers(parsedNumbers); diff --git a/src/Utils/calculatorToAdd.js b/src/Utils/calculatorToAdd.js index ed7974f99..e62763798 100644 --- a/src/Utils/calculatorToAdd.js +++ b/src/Utils/calculatorToAdd.js @@ -1,8 +1,6 @@ export const addNumbers = (parsedNumbers) => { let sum = 0; - console.log('parsedNumbers: ', parsedNumbers); - parsedNumbers.forEach((num) => { sum += num; }); diff --git a/src/Validation/validateStringToAdd.js b/src/Validation/validateStringToAdd.js new file mode 100644 index 000000000..4e9d64e9a --- /dev/null +++ b/src/Validation/validateStringToAdd.js @@ -0,0 +1,61 @@ +import { ERROR_MESSAGES } from '../Constant/errorMessages.js'; + +export class ValidationHandler { + checkValidation(Numbers) { + this.Numbers = [...Numbers]; + + this.specifyCaseValue(); + this.checkBasicError(); + this.checkNormalOrCustom(); + } + + specifyCaseValue() { + this.normalCase = this.Numbers[1] === ',' || this.Numbers[1] === ':'; + this.customCase = + this.Numbers[0] === '/' && + this.Numbers[1] === '/' && + this.Numbers[3] === '\\' && + this.Numbers[4] === 'n'; + } + + checkBasicError() { + if (!(this.normalCase || this.customCase)) { + throw new Error(ERROR_MESSAGES.WRONG_INPUT); + } + } + + checkNormalOrCustom = () => { + if (this.normalCase) { + this.validateNormalCase(); + } + + if (this.customCase) { + this.validateCustomCase(); + } + }; + + validateNormalCase() { + const evenNumberArray = []; + for (let i = 0; i < this.Numbers.length; i += 2) { + evenNumberArray.push(this.Numbers[i]); + } + evenNumberArray.forEach((number) => { + if (isNaN(Number(number))) { + throw new Error(ERROR_MESSAGES.WRONG_NORMAL_INPUT); + } + }); + } + + validateCustomCase() { + const evenNumberArray = []; + for (let i = 5; i < this.Numbers.length; i += 2) { + evenNumberArray.push(this.Numbers[i]); + } + + evenNumberArray.forEach((number) => { + if (Number.isNaN(Number(number))) { + throw new Error(ERROR_MESSAGES.WRONG_CUSTOM_INPUT); + } + }); + } +} diff --git a/src/View/inputView.js b/src/View/inputView.js index 86f368f8b..7e040f22a 100644 --- a/src/View/inputView.js +++ b/src/View/inputView.js @@ -1,9 +1,8 @@ import { Console } from '@woowacourse/mission-utils'; -// import { INPUT_MESSAGES } from '../Constant/messages.js'; +import { INPUT_MESSAGES } from '../Constant/messages.js'; export class InputHandler { - // TODO: 리펙토링-상수처리 async getStringToAddInput() { - return await Console.readLineAsync('덧셈할 문자열을 입력해 주세요.\n'); + return await Console.readLineAsync(INPUT_MESSAGES.STRING_TO_ADD); } } diff --git a/src/View/outputView.js b/src/View/outputView.js index f179c3507..0b754a033 100644 --- a/src/View/outputView.js +++ b/src/View/outputView.js @@ -1,7 +1,9 @@ import { Console } from '@woowacourse/mission-utils'; +import { OUTPUT_MESSAGES } from '../Constant/messages.js'; export class OutputHandler { async printResultOfSum(resultAddedNumbers) { - return Console.print(`결과 : ${resultAddedNumbers}`); + const { RESULT } = OUTPUT_MESSAGES; + return Console.print(`${RESULT} : ${resultAddedNumbers}`); } } From ecea32682cdc29a8429620fb369592bcf6d536fa Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 16:27:59 +0900 Subject: [PATCH 08/14] =?UTF-8?q?style:=20=ED=8C=8C=EC=9D=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/mainController.js | 4 +-- src/Model | 0 src/Model/numbersParser.js | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) delete mode 100644 src/Model create mode 100644 src/Model/numbersParser.js diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js index 653c2661b..b393415a4 100644 --- a/src/Controller/mainController.js +++ b/src/Controller/mainController.js @@ -1,7 +1,7 @@ import { InputHandler } from '../View/inputView.js'; import { OutputHandler } from '../View/outputView.js'; -import { checkNormalOrCustom } from '../Utils/numbersParser.js'; +import { NumbersParserHandler } from '../Model/numbersParser.js'; import { addNumbers } from '../Utils/calculatorToAdd.js'; import { ValidationHandler } from '../Validation/validateStringToAdd.js'; @@ -15,7 +15,7 @@ export class MainController { const stringToAdd = await this.input.getStringToAddInput(); new ValidationHandler().checkValidation(stringToAdd); - const parsedNumbers = checkNormalOrCustom(stringToAdd); + const parsedNumbers = new NumbersParserHandler().validation(stringToAdd); const resultAddedNumbers = addNumbers(parsedNumbers); this.output.printResultOfSum(resultAddedNumbers); diff --git a/src/Model b/src/Model deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Model/numbersParser.js b/src/Model/numbersParser.js new file mode 100644 index 000000000..7f341e89f --- /dev/null +++ b/src/Model/numbersParser.js @@ -0,0 +1,42 @@ +export class NumbersParserHandler { + validation(inputString) { + this.inputString = inputString; + this.specifyCaseValue(); + if (this.NORMAL_CASE_CHECK) { + return this.parseNumbersForNormal(); + } + + if (this.CUSTOM_CASE_CHECK) { + return this.parseNumbersForCustom(); + } + } + + specifyCaseValue() { + this.NORMAL_CASE_CHECK = + this.inputString[1] === ',' || this.inputString[1] === ':'; + this.CUSTOM_CASE_CHECK = + this.inputString[0] === '/' && + this.inputString[1] === '/' && + this.inputString[3] === '\\' && + this.inputString[4] === 'n'; + } + + parseNumbersForNormal() { + if (this.inputString[1] === ',' || this.inputString[1] === ':') { + return this.inputString + .split(/,|:/) + .map((number) => number.trim()) + .map(Number); + } + } + + parseNumbersForCustom() { + const onlyNumbersAndDelimiter = this.inputString.substr(5); + const customDelimiter = this.inputString[2]; + + return onlyNumbersAndDelimiter + .split(customDelimiter) + .map((number) => number.trim()) + .map(Number); + } +} From 71910d2e3a73e3ce45cd93dda31e9deb371a5561 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 16:28:30 +0900 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20retrun=20=EB=AC=B8=20?= =?UTF-8?q?=EB=92=A4=20await=20=EC=83=9D=EB=9E=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/View/inputView.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/View/inputView.js b/src/View/inputView.js index 7e040f22a..1907b056e 100644 --- a/src/View/inputView.js +++ b/src/View/inputView.js @@ -3,6 +3,7 @@ import { INPUT_MESSAGES } from '../Constant/messages.js'; export class InputHandler { async getStringToAddInput() { - return await Console.readLineAsync(INPUT_MESSAGES.STRING_TO_ADD); + // TODO: 공부 - return 뒤에 await 없어도 실행 가능한 이유 + return Console.readLineAsync(INPUT_MESSAGES.STRING_TO_ADD); } } From fe3c63b31b69336747039e700161f861654509c8 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 16:29:15 +0900 Subject: [PATCH 10/14] =?UTF-8?q?refact:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Utils/calculatorToAdd.js | 1 - src/Utils/numbersParser.js | 33 -------------------- src/Validation/validateStringToAdd.js | 45 +++++++++++++++------------ 3 files changed, 25 insertions(+), 54 deletions(-) delete mode 100644 src/Utils/numbersParser.js diff --git a/src/Utils/calculatorToAdd.js b/src/Utils/calculatorToAdd.js index e62763798..eab5f1f87 100644 --- a/src/Utils/calculatorToAdd.js +++ b/src/Utils/calculatorToAdd.js @@ -1,6 +1,5 @@ export const addNumbers = (parsedNumbers) => { let sum = 0; - parsedNumbers.forEach((num) => { sum += num; }); diff --git a/src/Utils/numbersParser.js b/src/Utils/numbersParser.js deleted file mode 100644 index ad933a7df..000000000 --- a/src/Utils/numbersParser.js +++ /dev/null @@ -1,33 +0,0 @@ -export const checkNormalOrCustom = (Numbers) => { - if (Numbers[1] === ',' || Numbers[1] === ':') { - return parseNumbersForNormal(Numbers); - } - - if ( - Numbers[0] === '/' && - Numbers[1] === '/' && - Numbers[3] === '\\' && - Numbers[4] === 'n' - ) { - return parseNumbersForCustom(Numbers); - } -}; - -const parseNumbersForNormal = (Numbers) => { - // 쉼표 , 로 나눠질 경우 - if (Numbers[1] === ',' || Numbers[1] === ':') { - return Numbers.split(/,|:/) - .map((number) => number.trim()) - .map(Number); - } -}; - -const parseNumbersForCustom = (Numbers) => { - const onlyNumbersAndDelimiter = Numbers.substr(5); - const customDelimiter = Numbers[2]; - - return onlyNumbersAndDelimiter - .split(customDelimiter) - .map((number) => number.trim()) - .map(Number); -}; diff --git a/src/Validation/validateStringToAdd.js b/src/Validation/validateStringToAdd.js index 4e9d64e9a..fc5d4483a 100644 --- a/src/Validation/validateStringToAdd.js +++ b/src/Validation/validateStringToAdd.js @@ -1,8 +1,8 @@ import { ERROR_MESSAGES } from '../Constant/errorMessages.js'; export class ValidationHandler { - checkValidation(Numbers) { - this.Numbers = [...Numbers]; + checkValidation(inputString) { + this.inputString = [...inputString]; this.specifyCaseValue(); this.checkBasicError(); @@ -10,49 +10,54 @@ export class ValidationHandler { } specifyCaseValue() { - this.normalCase = this.Numbers[1] === ',' || this.Numbers[1] === ':'; - this.customCase = - this.Numbers[0] === '/' && - this.Numbers[1] === '/' && - this.Numbers[3] === '\\' && - this.Numbers[4] === 'n'; + this.NORMAL_CASE_CHECK = + this.inputString[1] === ',' || this.inputString[1] === ':'; + this.CUSTOM_CASE_CHECK = + this.inputString[0] === '/' && + this.inputString[1] === '/' && + this.inputString[3] === '\\' && + this.inputString[4] === 'n'; } checkBasicError() { - if (!(this.normalCase || this.customCase)) { + if (!(this.NORMAL_CASE_CHECK || this.CUSTOM_CASE_CHECK)) { throw new Error(ERROR_MESSAGES.WRONG_INPUT); } } checkNormalOrCustom = () => { - if (this.normalCase) { + if (this.NORMAL_CASE_CHECK) { this.validateNormalCase(); } - if (this.customCase) { + if (this.CUSTOM_CASE_CHECK) { this.validateCustomCase(); } }; + // eslint-disable-next-line max-lines-per-function validateNormalCase() { - const evenNumberArray = []; - for (let i = 0; i < this.Numbers.length; i += 2) { - evenNumberArray.push(this.Numbers[i]); + // TODO: 리펙토링 - forEach를 사용해서 짝수 인덱스만 돌게하는 것 찾기 + const onlyNumberInArray = []; + for (let i = 0; i < this.inputString.length; i += 2) { + onlyNumberInArray.push(this.inputString[i]); } - evenNumberArray.forEach((number) => { - if (isNaN(Number(number))) { + + onlyNumberInArray.forEach((number) => { + if (Number.isNaN(Number(number))) { throw new Error(ERROR_MESSAGES.WRONG_NORMAL_INPUT); } }); } + // eslint-disable-next-line max-lines-per-function validateCustomCase() { - const evenNumberArray = []; - for (let i = 5; i < this.Numbers.length; i += 2) { - evenNumberArray.push(this.Numbers[i]); + const onlyNumberInArray = []; + for (let i = 5; i < this.inputString.length; i += 2) { + onlyNumberInArray.push(this.inputString[i]); } - evenNumberArray.forEach((number) => { + onlyNumberInArray.forEach((number) => { if (Number.isNaN(Number(number))) { throw new Error(ERROR_MESSAGES.WRONG_CUSTOM_INPUT); } From 0dc695c812fec89c43b0f7364fd6d10c9d62e051 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 16:42:38 +0900 Subject: [PATCH 11/14] =?UTF-8?q?style:=20=EA=B0=9C=ED=96=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- src/Model/numbersParser.js | 4 +++- src/Utils/calculatorToAdd.js | 4 ++-- src/Validation/validateStringToAdd.js | 5 ++--- src/View/inputView.js | 2 +- src/View/outputView.js | 1 + 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ddbd5e183..27cd557e5 100644 --- a/README.md +++ b/README.md @@ -68,9 +68,9 @@ ## **프로그래밍 요구 사항** -- [ ] Node.js 20.17.0 버전에서 실행 가능해야 한다. -- [ ] 프로그램 실행의 시작점은 `App.js`의 `run()`이다. -- [ ] `package.json` 파일은 변경할 수 없으며, **제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.** +- [X] Node.js 20.17.0 버전에서 실행 가능해야 한다. +- [X] 프로그램 실행의 시작점은 `App.js`의 `run()`이다. +- [X] `package.json` 파일은 변경할 수 없으며, **제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.** - 프로그램 종료 시 `process.exit()`를 호출하지 않는다. - 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다. - 자바스크립트 코드 컨벤션을 지키면서 프로그래밍한다. diff --git a/src/Model/numbersParser.js b/src/Model/numbersParser.js index 7f341e89f..b4eb520ed 100644 --- a/src/Model/numbersParser.js +++ b/src/Model/numbersParser.js @@ -2,10 +2,11 @@ export class NumbersParserHandler { validation(inputString) { this.inputString = inputString; this.specifyCaseValue(); + if (this.NORMAL_CASE_CHECK) { return this.parseNumbersForNormal(); } - + if (this.CUSTOM_CASE_CHECK) { return this.parseNumbersForCustom(); } @@ -14,6 +15,7 @@ export class NumbersParserHandler { specifyCaseValue() { this.NORMAL_CASE_CHECK = this.inputString[1] === ',' || this.inputString[1] === ':'; + this.CUSTOM_CASE_CHECK = this.inputString[0] === '/' && this.inputString[1] === '/' && diff --git a/src/Utils/calculatorToAdd.js b/src/Utils/calculatorToAdd.js index eab5f1f87..c6ff7a6c5 100644 --- a/src/Utils/calculatorToAdd.js +++ b/src/Utils/calculatorToAdd.js @@ -1,7 +1,7 @@ export const addNumbers = (parsedNumbers) => { let sum = 0; - parsedNumbers.forEach((num) => { - sum += num; + parsedNumbers.forEach((number) => { + sum += number; }); return sum; diff --git a/src/Validation/validateStringToAdd.js b/src/Validation/validateStringToAdd.js index fc5d4483a..9209252dd 100644 --- a/src/Validation/validateStringToAdd.js +++ b/src/Validation/validateStringToAdd.js @@ -12,6 +12,7 @@ export class ValidationHandler { specifyCaseValue() { this.NORMAL_CASE_CHECK = this.inputString[1] === ',' || this.inputString[1] === ':'; + this.CUSTOM_CASE_CHECK = this.inputString[0] === '/' && this.inputString[1] === '/' && @@ -35,9 +36,8 @@ export class ValidationHandler { } }; - // eslint-disable-next-line max-lines-per-function + // TODO: 리펙토링 - forEach를 사용해서 짝수 인덱스만 돌게하는 것 찾기 validateNormalCase() { - // TODO: 리펙토링 - forEach를 사용해서 짝수 인덱스만 돌게하는 것 찾기 const onlyNumberInArray = []; for (let i = 0; i < this.inputString.length; i += 2) { onlyNumberInArray.push(this.inputString[i]); @@ -50,7 +50,6 @@ export class ValidationHandler { }); } - // eslint-disable-next-line max-lines-per-function validateCustomCase() { const onlyNumberInArray = []; for (let i = 5; i < this.inputString.length; i += 2) { diff --git a/src/View/inputView.js b/src/View/inputView.js index 1907b056e..13debcc0d 100644 --- a/src/View/inputView.js +++ b/src/View/inputView.js @@ -1,9 +1,9 @@ import { Console } from '@woowacourse/mission-utils'; import { INPUT_MESSAGES } from '../Constant/messages.js'; +// TODO: 공부 - return 뒤에 await 없어도 실행 가능한 이유 export class InputHandler { async getStringToAddInput() { - // TODO: 공부 - return 뒤에 await 없어도 실행 가능한 이유 return Console.readLineAsync(INPUT_MESSAGES.STRING_TO_ADD); } } diff --git a/src/View/outputView.js b/src/View/outputView.js index 0b754a033..22cb6ec35 100644 --- a/src/View/outputView.js +++ b/src/View/outputView.js @@ -4,6 +4,7 @@ import { OUTPUT_MESSAGES } from '../Constant/messages.js'; export class OutputHandler { async printResultOfSum(resultAddedNumbers) { const { RESULT } = OUTPUT_MESSAGES; + return Console.print(`${RESULT} : ${resultAddedNumbers}`); } } From 22213361f8fd5dadc07ee7bd3b35feb74f710c07 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 16:48:58 +0900 Subject: [PATCH 12/14] =?UTF-8?q?rename:=20=ED=95=A8=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/mainController.js | 2 +- src/Model/numbersParser.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controller/mainController.js b/src/Controller/mainController.js index b393415a4..f8c1c9de6 100644 --- a/src/Controller/mainController.js +++ b/src/Controller/mainController.js @@ -15,7 +15,7 @@ export class MainController { const stringToAdd = await this.input.getStringToAddInput(); new ValidationHandler().checkValidation(stringToAdd); - const parsedNumbers = new NumbersParserHandler().validation(stringToAdd); + const parsedNumbers = new NumbersParserHandler().parseNumbers(stringToAdd); const resultAddedNumbers = addNumbers(parsedNumbers); this.output.printResultOfSum(resultAddedNumbers); diff --git a/src/Model/numbersParser.js b/src/Model/numbersParser.js index b4eb520ed..86526d105 100644 --- a/src/Model/numbersParser.js +++ b/src/Model/numbersParser.js @@ -1,5 +1,5 @@ export class NumbersParserHandler { - validation(inputString) { + parseNumbers(inputString) { this.inputString = inputString; this.specifyCaseValue(); From 369d5c2f194d1f2dadcfdfe047cea103c2c1015f Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 16:54:01 +0900 Subject: [PATCH 13/14] =?UTF-8?q?refactor:=20double=20quotes=20=EB=A5=BC?= =?UTF-8?q?=20single=20quotes=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/View/outputView.js | 2 +- src/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/View/outputView.js b/src/View/outputView.js index 22cb6ec35..2c33c7f05 100644 --- a/src/View/outputView.js +++ b/src/View/outputView.js @@ -4,7 +4,7 @@ import { OUTPUT_MESSAGES } from '../Constant/messages.js'; export class OutputHandler { async printResultOfSum(resultAddedNumbers) { const { RESULT } = OUTPUT_MESSAGES; - + return Console.print(`${RESULT} : ${resultAddedNumbers}`); } } diff --git a/src/index.js b/src/index.js index 02a1d389e..9daefc93f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ -import App from "./App.js"; +import App from './App.js'; const app = new App(); await app.run(); From 6f0687c51f3aa6237ffc6c93d7ae6533e9afdb12 Mon Sep 17 00:00:00 2001 From: Jinny Date: Wed, 27 Nov 2024 17:03:54 +0900 Subject: [PATCH 14/14] =?UTF-8?q?refactor:=20=EA=B5=AC=EB=B6=84=EC=9E=90?= =?UTF-8?q?=20=EB=A7=8C=EB=93=9C=EB=8A=94=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=83=81=EC=88=98=ED=99=94=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Constant/constant.js | 11 +++++++++++ src/Model/numbersParser.js | 19 +++++++++++++------ src/Validation/validateStringToAdd.js | 12 +++++++----- 3 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 src/Constant/constant.js diff --git a/src/Constant/constant.js b/src/Constant/constant.js new file mode 100644 index 000000000..b1cef61ce --- /dev/null +++ b/src/Constant/constant.js @@ -0,0 +1,11 @@ +export const DELIMITER = { + COMMA: ',', + COLON: ':', +}; + +export const DELIMITER_MAKER = { + STRING_FIRST: '/', + STRING_SECOND: '/', + STRING_THIRD: '\\', + STRING_FOURTH: 'n', +}; diff --git a/src/Model/numbersParser.js b/src/Model/numbersParser.js index 86526d105..b84b78012 100644 --- a/src/Model/numbersParser.js +++ b/src/Model/numbersParser.js @@ -1,3 +1,5 @@ +import { DELIMITER, DELIMITER_MAKER } from '../Constant/constant.js'; + export class NumbersParserHandler { parseNumbers(inputString) { this.inputString = inputString; @@ -14,17 +16,22 @@ export class NumbersParserHandler { specifyCaseValue() { this.NORMAL_CASE_CHECK = - this.inputString[1] === ',' || this.inputString[1] === ':'; + this.inputString[1] === DELIMITER.COMMA || + this.inputString[1] === DELIMITER.COLON; this.CUSTOM_CASE_CHECK = - this.inputString[0] === '/' && - this.inputString[1] === '/' && - this.inputString[3] === '\\' && - this.inputString[4] === 'n'; + this.inputString[0] === DELIMITER_MAKER.STRING_FIRST && + this.inputString[1] === DELIMITER_MAKER.STRING_SECOND && + this.inputString[3] === DELIMITER_MAKER.STRING_THIRD && + this.inputString[4] === DELIMITER_MAKER.STRING_FOURTH; } + // TODO: 리펙토링: 정규식 표현에도 상수화 처리하여 콤마, 클론 넣기 parseNumbersForNormal() { - if (this.inputString[1] === ',' || this.inputString[1] === ':') { + if ( + this.inputString[1] === DELIMITER.COMMA || + this.inputString[1] === DELIMITER.COLON + ) { return this.inputString .split(/,|:/) .map((number) => number.trim()) diff --git a/src/Validation/validateStringToAdd.js b/src/Validation/validateStringToAdd.js index 9209252dd..63083024a 100644 --- a/src/Validation/validateStringToAdd.js +++ b/src/Validation/validateStringToAdd.js @@ -1,3 +1,4 @@ +import { DELIMITER, DELIMITER_MAKER } from '../Constant/constant.js'; import { ERROR_MESSAGES } from '../Constant/errorMessages.js'; export class ValidationHandler { @@ -11,13 +12,14 @@ export class ValidationHandler { specifyCaseValue() { this.NORMAL_CASE_CHECK = - this.inputString[1] === ',' || this.inputString[1] === ':'; + this.inputString[1] === DELIMITER.COMMA || + this.inputString[1] === DELIMITER.COLON; this.CUSTOM_CASE_CHECK = - this.inputString[0] === '/' && - this.inputString[1] === '/' && - this.inputString[3] === '\\' && - this.inputString[4] === 'n'; + this.inputString[0] === DELIMITER_MAKER.STRING_FIRST && + this.inputString[1] === DELIMITER_MAKER.STRING_SECOND && + this.inputString[3] === DELIMITER_MAKER.STRING_THIRD && + this.inputString[4] === DELIMITER_MAKER.STRING_FOURTH; } checkBasicError() {