티스토리 뷰

목표

- 테스트코드의 습관들이기

- 천천히 하더라도 꼭 완주

- 기존 구성에 따라, 내 힘으로 구현 -> 피드백 확인 -> 리팩토링의 과정을 거친다.

 

 

객체지향 생활체조원칙

  1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.
  2. else 예약어를 쓰지 않는다.
  3. 모든 원시 값과 문자열을 포장한다.
  4. 한 줄에 점을 하나만 찍는다.
  5. 줄여 쓰지 않는다(축약 금지).
  6. 모든 엔티티를 작게 유지한다.
  7. 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
  8. 일급 컬렉션을 쓴다.
  9. getter/setter/프로퍼티를 쓰지 않는다.

 

문제는 혹시나하는 저작권 때문에 공개할 순 없다는 점..

 

 

TEST 코드

..test코드
public class StringCalcTest {  
  
    @BeforeEach  
    public void setUp() {  
       String polynomial = "2 / 2 * 4 - 100 + 207";  
       System.setIn(new ByteArrayInputStream(polynomial.getBytes()));  
    }  
    @Test  
    @DisplayName("문자열 계산기")  
    public void stringCalcTest() {  
       String output = inputString();  
       String[] values = output.split(" ");  
       StringCalculator stringCalculator = new StringCalculator(values);  
       int result = stringCalculator.calculate();  
  
       assertThat(result).isEqualTo(111);  
    }  
    private String inputString() {  
       Scanner sc = new Scanner(System.in);  
       return sc.nextLine();  
    }}

 

 

 

최초 TDD 구현

..초기 testcode -> 구현만 성공
public class StringCalculator {  
    private String[] values;  
  
    public StringCalculator(String[] values) {  
       this.values = values;  
    }  
    public int calculate() {  
       return 5;  
    }}

 

 

 

리팩토링 후 구현

public class StringCalculator {
	private String[] values;

	public StringCalculator(String[] values) {
		this.values = values;
	}

	/**
	 * 문자열 계산
	 * @return int
	 */
	public int calculate() {
		int result = Integer.parseInt(values[0]);
		for (int i = 1; i < values.length; i += 2) {
			int nextNum = Integer.parseInt(values[i + 1]);
			result = switchCalculation(values[i], result, nextNum);
		}
		return result;
	}

	/**
	 * 계산식
	 * @param value 기호
	 * @param result 결과
	 * @param nextNum 뒤에 번호
	 * @return int
	 */
	private int switchCalculation(String value, int result, int nextNum) {
		switch (value) {
			case "+" : return add(result, nextNum);
			case "-" : return subtract(result, nextNum);
			case "*" : return multiply(result, nextNum);
			case "/" : return divide(result, nextNum);
			default: throw new RuntimeException("잘못된 기호를 적었습니다.");
		}
	}

	/**
	 * 덧셈
	 * @param num 기존 값
	 * @param plusNum 더할 값
	 * @return int
	 */
	private int add(int num, int plusNum) {
		return num + plusNum;
	}

	/**
	 * 뺄셈
	 * @param num 기존 값
	 * @param minusNum 뺄 값
	 * @return int
	 */
	private int subtract(int num, int minusNum) {
		return num - minusNum;
	}

	/**
	 * 곱셈
	 * @param num 기존 값
	 * @param multiplyNum 곱할 값
	 * @return int
	 */
	private int multiply(int num, int multiplyNum) {
		return num * multiplyNum;
	}

	/**
	 * 자바 나눗셈
	 * @param num 기존 값
	 * @param divideNum 나눌 값
	 * @return int
	 */
	private int divide(int num, int divideNum) {
		return num / divideNum;
	}
}

 

 

 

결과

 

 

 

리팩토링 생각할 부분

switchCalculation의 파라미터가 3개이상인 부분..

'사견 > 노트' 카테고리의 다른 글

좋은 API Response 만들기 리뷰  (1) 2024.01.23
MoGreene Code Convention  (0) 2024.01.02
2023 리눅스마스터 2급 합격 후기  (0) 2023.06.30
Java 코드컨벤션  (0) 2023.01.20
2022 개발자 로드맵  (0) 2022.09.07
Comments