본문 바로가기

프로그래밍&IT/학습, 책

[클린 코드] 5. 오류처리, 경계, 단위테스트

 

ch7. 오류처리

깨끗한 코드와 오류 처리는 연관성있다. 상당수 코드기반은 전적으로 오류 처리 코드에 좌우된다.

오류처리가 중요하지만 프로그램 논리를 이해하기 어려워진다면 Clean Code라 부르기 어렵다.

 

  • 오류코드보다 예외를 사용하라.
  • Try-Catch-Finally 문부터 작성하라
  • 미확인 (unchecked) 예외를 사용하라
  • 호출자를 고려해 예외 클래스를 정의한다.
  • 정상 흐름을 정의. 비즈니스 논리와 오류 처리가 잘 분리된 코드
  • null 반환하지 마라. 호출자에게 문제를 떠넘기게 된다 > 예외를 던지거나 특수 사례 객체를 반환한다
  • 또한 null을 전달하지 마라. 정상적인 인수로 null을 기대하는 API가 아니라면.

결론

깨끗한 코드는 읽기도 좋아야 하지만 안정성도 높아야. 이 둘은 상충하는 목표가 아니다


미확인 (unchecked) 예외?.

컴파일 시점에 처리 여부를 확인하는 예외. 이러한 예외는 반드시 처리(try-catch 블록으로 처리하거나 메서드 선언에 throws로 명시)해야 하며, 이를 통해 예외 처리를 강제함으로써 잠재적인 문제를 코드 수준에서 미리 다룰 수 있게 한다.

public void readFile(String fileName) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line = reader.readLine();
    reader.close();

여기서 IOException은 확인된 예외이며 컴파일러는 IOException에 대해 예외 처리를 강제하며, 처리하지 않을 경우 컴파일 에러를 발생시킨다.

이 책에선 확인된 예외를 사용할 때 지나치게 상세한 예외 처리를 피하고, 프로그램의 가독성과 유지보수성을 높이는 방향으로 접근할 것을 권장합니다. 예외의 의미를 명확히 전달하고, 필요 이상으로 복잡하지 않게 다루는 것이 중요!

 

Ch.8 경계

시스템에 들어가는 모든 s/w를 직접 개발하는 경우는 드물다. 외부 컴포넌트, 오픈소스를 사용한다.

이 외부코드를 우리 코드에 깔끔히 통합해야 한다. 이를 위한 s/w 경계를 처리하는 방법 알아보기

 

  • 통제가 불가능한 외부 패키지에 의존하는 대신 통제가 가능한 우리 코드에 의존하도록 만드는 방식
  • 새로운 클래스로 경계를 감싸거나 Adapter 패턴을 사용해 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환
  • 코드 가독성이 높아지며 경계 인터페이스를 사용하는 일관성이 높아지며 외부 패키지가 변했을때 변경할 코드도 줄어든다

 

ch.9 단위 테스트

TDD 법칙 3가지

  1. 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다
  2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트 작성
  3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드 작성
  • 깨끗한 테스트 코드 유지 : 가독성
  • 테스트는 유연성, 유지보수성, 재사용성을 제공
  • 테스트당 Assert 하나
  • 테스트당 개념 하나
  • 깨끗한 테스트의 5가지 규칙. FIRST
  • Fast : 빠르게 / Independaent: 각 테스트는 서로 의존하면 안된다 / Repeatable: 반복가능하게
  • Self-Validating : 자가검증. 테스트는 bool (성공 or 실패)로 / Timely : 적시에. 테스트하려는 실제 코드 구현 직전에 작성

 

ch.10 클래스

  • 클래스는 작아야 한다
  • 클래스 이름은 해당 클래스 책임을 기술해야 한다
  • 단일 책임 원칙 (Single Reasponsibility Principe, SRP) : 클래스, 모듈을 변경할 이유가 하나 뿐이어야 한다.
  • 응집도 : 일반적으로 메서드가 변수를 더 많이 사용할 수록 메서드와 클래스는 응집도가 더 높다. 응집도가 높다는 건 클래스에 속한 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미
  • 변경쉬운 클래스
  • 결합도를 낮추면 유연성, 재사용성 높아진다. 각 시스템 요소가 다른 요소의 변경으로부터 격리되어 있다는 의미