❒ Goal
프리코스 1주차 과제는 "입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현"하는 것이다.
❒ Requirements
1. 사용자
- 문자열을 입력할 수 있다.
- 어떤 문자열이든 입력할 수 있다.
- 빈 문자열을 입력할 수 도 있다.
- 기본 구분자를 포함하여 입력할 수 있다.
- 기본 구분자란 쉼표(,) 또는 콜론(:)을 의미한다.
- 문자열 앞뒤 어디든 위치할 수 있다.
- 커스텀 구분자를 포함아여 입력할 수 있다.
- 커스텀 구분자란, // 와 \n 사이에 위치하는 구분자를 의미한다.
- 문자열 바로 앞에 작성해줘야 한다.
- 어떤 문자열이든 입력할 수 있다.
- 출력(덧셈) 결과를 콘솔에서 확인할 수 있다.
2. 시스템
- 주어진 문자열에서 숫자만 파싱해야 한다.
- 0으로 간주하는 경우
- 사용자가 빈 문자열을 입력했을 경우
- 추출한 결과가 비어있을 경우
- 추출된 숫자들을 더해야 한다.
- 덧셈 결과를 사용자에게 제공해야 한다.
- 사용자가 잘못된 입력을 했을 경우 적절한 예외를 발생시킨 후 애플리케이션을 종료한다.
❒ Exceptions
1. 사용자
- 커스텀 구분자를 정의하지 않고, 커스텀 구분자를 사용한 경우
- Ex) "1,2a3,10"
- 커스텀 구분자를 문자열 중간에 사용한 경우
- 커스텀 구분자를 두 번 이상 사용한 경우
- Ex) "//;\n1;2;3//*\n6"
- 숫자 이외의 문자를 입력한 경우
- Ex) "1,2,a,3,10"
2. 시스템
- 파싱된 값이 음수인 경우
- 파싱된 값이 숫자가 아닌 문자일 경우
❒ Domain modeling
1. [Date Stucture] Numbers
추출한 숫자를 담는 도메인 자료 구조
Type | Field |
List<Integer> | numbers |
- 자료구조이므로 불변하다.
2. [Entity] CalculateSystem
계산(덧셈)을 담당하는 역할을 가지는 Entity
Type | Field |
Numbers | numbers |
3. [Enum] Delimiter
구분자를 타입 별로 관리
TYPE = BASIC, CUSTOM
Type | Field |
List<String> | value |
4. [Entity] SeparateManager
구분자 관리 및 구분자 추출을 담당하는 역할을 가지는 Entity
Type | Field | Initial |
List<String> | (final) basicDelimiters | 쉼표(,), 콜론(:) |
String | customDelimeter | null |
고민거리 🤔 💭
1. null 할당 하면 NPE에 노출된다. 더 나은 방법은?
‣ 빈 문자열("")로 처리
‣Getter를 안쓰면 null을 써도 되지 않을까? Null처리만 잘한다면..?
2. 단순히 List<String>으로만 관리할까? 뭔가 더 명확함을 주고 싶은데...
‣ 문자열 값을 관리하는 곳은 Enum으로 분리‣ 인스턴스 생성할 때 Delimiter와 CustomChecker Enum 클래스에서 값을 가져온다.
‣ 매번 Enum에서 가져오는 것보다는 SeperatorManager에 캐싱해서 사용하는 방향으로
5. [View] ResultView
결과를 표시를 담당하는 역할을 가지는 View
Type | Field |
String | addResult |
❒ Main Logic
1. Logic Flow
1️⃣ 입력된 문자열에서 custom-delimiter가 있는지 확인
- // 로 시작하고 \n 로 끝나는지 확인
- //로 시작한다면 regex를 사용해서 custom-delimiter 추출
2️⃣ basic & custom delimiter로 문자열을 split
3️⃣ validate 수행
- custom-delimiter가 2개 이상 있다면 Throw MultiCustomDelimeterException
고민 거리들 🤔 💭1. array의 요소를 가져올 때 숫자 입력 & static final 말고 더 나은 방법은 없을까?
❒ Seperate Domain & Business Logic
1. [Domain] CalculateSystem
Method | Paramerter | Return Type | Exception |
sum(); | x | Integer | - |
validateNotNull | Numbers | void | ShouldNotBeNullException |
2. [Domain] SeparateManager
Method | Paramerter | Return Type | Exception |
getAllDelimiters(); | x | String | - |
extractCustomDelimiter(x); | String | void | - |
parseCustomDelimeter | String | List<String> | - |
separate | String | List<String> | |
createMatcher | String | Matcher | - |
mergeDelimiters | x | List<Integer> | - |
isAddable | String | boolean | - |
canParseCustomDelimiter | String | boolean | - |
processReplacing | String | String | - |
validateCustomDelimiterPosition | String | void | NotAllowedPositionException |
validateCustomDelmiterCount | String | void | MuliCustomDelimiterException |
tryParseToInt | String | Integer | ParseToIntegerFailedException |
3. [Domain] Numbers
Method | Parameter | Return Type | Exception |
validateMinusNumber (음수 판별) | List<Integer> | void | NotAllowedNumberException |
sum | x | Integer | - |
checkIsMInus | Integer | void | NotAllowedFormatException |
1. [Business] SeparateSurvice
Method | Parameter | Return Type | Exception |
offerCalculatedResult | ResultView | void | - |
❒ 기타
1. 추가로 작성할 포스팅 Llist
Regex (우선 순위 최상)clone 관련(이펙티브 자바 Item13 등)입출력 mockking
2. 작업 시 구글링 검색 키워드
- java multi delimiters
- does java have any try parse method?
- Deep Copy
- java regex, 전방 탐색과 후방 탐색
- git changelog
'우테코 7기 > 1주차' 카테고리의 다른 글
[JUnit5] 입력 값을 mockking할 수 있을까? (0) | 2024.10.21 |
---|---|
[Java] 객체를 복사해보자 (0) | 2024.10.19 |
[Refactoring] Pattern을 캐싱하자 (0) | 2024.10.19 |
Regex 뿌시기 (0) | 2024.10.17 |
1주차 회고 (0) | 2024.10.17 |