독서

책01. 파이브라인즈 오브 코드 05. 유사한 코드 융합하기

제비랑 2024. 2. 18. 04:15

파이브 라인스 오브 코드 - 크리스찬 클라우젠

5. 유사한 코드 융합하기

5.1 유사한 클래스 통합하기

  • 공통된 *상수 메서드를 가지고 있고, 반환값만 다르다면, 생성자로서 무엇을 반환할지 결정하는 식으로 클래스를 통합할수 있다.
  • 통합하는 방식은 다음과 같다.
    1. 메소드 주위에 if(true){}를 추가한다.
      • true를 기준 메서드를 호출해서 결과를 상수값과 비교하는 표현식으로 바꾼다.
      • 각 클래스들의 표현식과 본문들을 else와 함께 붙여넣는다.
    2. 기준 메서드에 대한 상수를 생성자를 통해 필드에 할당받도록 한다.
    3. 상수 메소드에서 상수 대신 할당된 필드 값을 반환하도록 메서드를 변경한다.
    4. 문제없나 확인을 위해 컴파일한다.
    5. 필드 기본값을 매개변수로만든다.
    6. 통합 클래스중 하나를 제외한 다른 모든 클래스를 삭제하고, 모든 컴파일 오류를 삭제하지 않은 클래스로 변경해서 수정한다.
  • 상수 메서드* : 멤버변수를 수정할 수 없으며, 항상 동일한 상수값을 반환한다.
  • 5.1 느낀점
  • 기껏 if else 삭제했더니 다시 만들었다
  • 5.2를 else를 가진 if를 제거한다니 두고보자.

5.2 단순한 조건 통합하기

  • if문결합
    1. 본문이 실제로 동일한지 확인한다.
    2. 다음과같이 변경한다.
      // Before
      if(expression1){
       // 본문
      } else if (expression2){
       //동일한 본문
      }
      // After
      if(expression1 || expression2){
       // 본문
      }

5.3 복잡한 조건 통합하기

  • 조건을 위한 산술 규칙을 사용한다.
  • 이때 ||는 덧셈처럼, &&는 곱하기처럼 판단해서 결합법칙, 교환법칙, 분배법칙을 적용한다.
  • 이때 조건은 순수조건 이어야 한다. 순수조건을 뽑아낼 때 캐시를 사용할 수 있다.
  • 순수조건* : 조건에 변수를할당하거나 예외를발생시키거나 IO가 없는것을말한다. 순수조건이 아닌 예 : if(a = b != 0)

5.4 클래스 간의 코드 통합

  • 전략패턴을 도입한다.
    1. 새로운 Strategy 클래스를 만든다.
    2. 두 클래스의 생성자에서 Strategy를 인스턴스화한다.
    3. 적용할 메서드를 Strategy 클래스로 이관한다.
    4. Strategy클래스 생성자에 의존하는 필드를 인자로 만든다
    5. 옮긴 코드에서 발생할 오류에대해 매개변수를 추가한다.
  • 전략패턴은 주로 클래스 다이어그램(UIML 예 중 하나)을 통해 보여진다.5.5 유사 함수 통합하기
  • 전략패턴 도입
  • 구현에서 인터페이스 추출
    1. 추출할 클래스(Strategy)와 동일한 이름으로 새로운 인터페이스를 만든다.
    2. 인터페이스를 추출하려는 클래스의 이름을 바꾸고 새로운 인터페이스(Strategy)를 구현하게 한다.
    3. 컴파일 후 오류를 검토한다.5.6 유사한 코드 통합하기
  • 배운것들을 이용해 코드 통합을 진행한다.느낀점
  • 메서드, 클래스, 인터페이스, if문이 생겼다가 없어졌다가를 반복하니 정신이 없다는 느낌을 받았다.
  • 여러번 보고 머릿속에 갈무리 할 필요가 있다.요약
    • 유사클래스통합, if문 결합을 통해 클래스(코드)를 통합하자
    • 조건에 부수적인 동작이 없는경우 조건부 산술을 사용할 수 있다.
    • UML 클래스 다이어그램은 일반적으로 코드베이스에 대한 특정 아키텍처를 설명할 때 사용된다.
    • 구현체가 하나인 인터페이스는 만들지 말자.