<클린 코드> 좋았던 내용 기록하기(7-12장)
< Clean Code > 도서의 내용을 공부하며 요약 정리하였습니다.
7장
오류 처리를 프로그램 논리와 분리하자. 프로그램 논리와 분리하면 독립적인 추론이 가능해지며 코드 유지보수성이 높아진다.
오류 코드보다 예외를 사용해라
If 처리보다 오류가 발생하면 예외를 던지는 편이 코드도 간결하고 읽기쉽다.
감싸기 기법
외부 api를 사용할 때는 감싸기 기법이 최선이다.
LocalPort클래스에서 ACMEPort 클래스를 감싸고 있다.
1 | public class LocalPort{ |
외부 api를 감싸면 외부 라이브러리와 프로그램 사이에서 의존성이 크게 줄어든다. 나중에 다른 라이브러리로 갈아타도 비용이 적다. 또한 감싸기 클래스에서 외부 api를 호출하는 대신 테스트 코드를 넣어주는 방법으로 프로그램을 테스트하기 쉬어진다.
9장 단위 테스트
TDD법칙 3가지
- 실패하는 단위테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
- 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
깨끗한 테스트코드 유지하기
테스트 코드는 실제코드 못지 않게 중요하다. 실제 코드 못지않게 깨끗하게 짜야한다.
코드에 유연성, 유지보수성, 재사용성을 제공하는 버팀목이 바로 단위테스트이다. 왜냐하면 테스트 케이스가 있으면 변경에 부담이 없기 때문이다.
깨끗한 테스트 코드
깨끗한 테스트 코드를 만들때에는 가독성이 제일 중요하다.
중복되는 코드를 삭제하고 의도를 흐리지 않아야 한다.
테스트는 BUILD-OPERATE-CHECK 패턴으로 나눠진다. 첫 부분은 테스트 자료를 만든다. 두 번째는 테스트 자료를 조작하며, 세번 째 부분은 조작한 결과가 올바른지 확인한다.
이중 표준
테스트 코드는 단순하고 간결하고 표현력이 풍부해야 하지만 실제 코드만큼 효율적일 필요는 없다.
테스트 당 assert 하나
한 함수에서 assert문을 적용하려 하다보면, 중복되는 코드가 많아진다. 이때는 TEMPLATE METHOD 패턴을 사용하면 중복을 제거할 수 있다.
** template method : 변하지 않는 기능은 슈퍼 클래스에 넣어두고 자주 변경되며 확장할 기능은 서브 클래스에 만들도록 한다.
테스트 당 assert 함수 한개가 어렵다면, 테스트 함수마다 한 개념만 테스트하라는 규칙을 지키는 방법도 있겠다.
FIRST
빠르게, 독립적으로, 반복가능하게, 자가검증하는(return bool), 적시에(실제 코드 이전에 작성)
10장 클래스
클래스 체계
Static public 상수,
Private 변수,
비공개 인스턴스 변수,
공개 함수,
바로 위 공개 함수가 호출하는 비공개 함수
클래스는 작아야 한다!
단일 책임 원칙(srp)
단일 책임 원칙은 클래스나 모듈을 변경할 이유가 하나뿐이어야 한다는 원칙이다.
큰 클래스 몇개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다. 작은 클래스는 각자 맡은 책임이 하나이며 다른 작은 클래스와 협력해 싯스템에 필요한 동작을 수행한다.
1 | public class SuperDashboard extends JFrame impletements MetaDataUser{ |
응집도
클래스는 인스턴스 변수 수가 작아야 한다. 각 클래스 메서드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다. 메서드가 변수를 더 많이 사용할수록 메서드와 클래스는 응집도가 높다.
응집도가 높다는 말은 메서드와 변수가 서로 의존하며 논리적인 단위로 묶여있음을 의미한다.
클래스가 응집력을 잃는다면 쪼개라!
메서드가 많아지고 인스턴스 변수가 많아지면, 응집도를 고려하여 변수와 메서드를 적절히 분리해 새로운 두세개 클래스로 쪼개야한다. 다시 말해, 응집도를 유지하면 작은 클래스 여럿이 나오게 된다.
변경하기 쉬운 클래스
깨끗한 시스템은 클래스를 체계적으로 정리해 변경에 수반하는 위험을 낮춘다.
변경으로부터 격리
외부 api를 사용해 코드를 작성하는데, 5분마다 api 값이 달라진다면 테스트 코드를 짜기란 쉽지 않다. 이럴 때에는, 함수 내에서 api를 직접 호출하는 대신 클래스로 따로 뺀 후 mocking을 사용해 테스트한다. 이처럼 결합도를 낮추면 유연성과 재사용성도 더욱 높아지며 DIP를 따르는 클래스가 나온다.
12장 창발성
단순한 설계 규칙은 설계 품질을 높여주며, 다음 규칙을 따르면 설계가 단순하다고 말한다.
- 모든 테스트를 실행한다.
- 중복을 없앤다.
- 프로그래머 의도를 표현한다.
- 클래스 수와 메서드 수를 최소로 줄인다.