1. 클래스 200줄 넘기지 않기
2. 외부 클래스 바로 의존하지 않고 경계 클래스 두기
나쁜 예)
Map<String, Sensor> sensors = SensorsFactory().get(); // 외부 라이브러리
Sensor s = sensors.get(sensorId);
좋은 예)
public class Sensors {
private Map<String, Sensor> sensors = SensorsFactory().get();
public Sensor getById(String id) {
return sensors.get(id);
}
// 이하 생략
}
3. 코드에 유연성, 유지보수성, 재사용성을 제공하는 버팀목이 바로 단위 테스트이다.
- 테스트 케이스가 있다면 공포는 사실상 사라진다. 테스트 커버리지가 높을수록 공포는 줄어든다.
4. 테스트 당 assert 하나
- 결론이 하나라 이해하기 쉽다
5. 테스트 F.I.R.S.T
- 빠르게 Fast
- 독립적으로 Independent
- 반복가능하게 Repeatable
- 어떠한 환경에서도 반복 가능해야 한다.
- 네트워크에 연결되지 않은 노트북 환경에서도 실행할 수 있어야 한다.
- 9월 17일과 맞는지 확인하고 아니면 오류를 던지는 함수가 있다. 만약 이 함수가 9월 17일이 아니라 다른 날 실행한다면 테스트는 실패할 것이다. 그러기 때문에 위 함수는 특정 날짜가 아닌 입력된 두 날짜가 맞는지 확인하는 함수로 만들어져야 한다.
- 자가검증하는 Self - Validating
- 통과 여부를 알려고 로그 파일을 읽게 만들어서는 안된다.
- 테스트가 스스로 성공과 실패를 판단하게 해야 한다.
- 적시에 Timely
- 테스트 코드는 적시에 작성해야 한다.실제 코드를 구현한 다음에 테스트 코드를 만들면 실제 코드를 구현하기 어렵다는 사실을 뒤늦게 발견할지도 모른다.
4. SOLID
1. SRP(Single Responsibliity Principle)
- 클래스는 하나의 역할만 맡아야 한다.
- 클래스를 변경할 이유도 하나여야 한다.
- 변경할 이유를 파악하려 애쓰다 보면 코드를 추상화하기도 쉬워진다.
2. OCP(Open Close Principle)
- 확장에 열려있고, 변경엔 닫혀있어야 한다.
- 즉, 새로운 기능 추가는 쉽지만, 변경의 영향은 작아야 한다.
3. LSP(Liskov Substitution Principle)
- 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있어야 한다.
4. ISP(Interface Segregation Principle)
- 필요한 인터페이스는 각각 따로 정의해서 사용해라.
- 한 인터페이스에 너무 많은 기능을 제공하지 마라.
5. DIP(Dependency Inversion Principle)
- 추상화에 의존해야지 구체적인 것에 의존하지 마라
- 추상클래스를 사용해라
- 다른 클래스나 자료구조에 의존적인 코드를 짜지마라.
'객체지향' 카테고리의 다른 글
🫥 디미터 법칙의 오해 (1) | 2024.11.12 |
---|---|
Google Java Style Guide 번역 (1) | 2024.10.15 |
[클린코드] 4. 주석 (0) | 2024.03.04 |
[클린코드] 3.함수 (0) | 2024.03.04 |
정순원의 코드 원칙 (0) | 2024.02.27 |