![[Clean Code] 8. 경계](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFgQTX%2FbtsGjJYVMab%2Fk39FJekFVpJEUftzmcG3C0%2Fimg.png)
본 게시글은 도서, Clean Code를 읽고 정리한 글입니다.
Clean Code(클린 코드) | 로버트 C. 마틴 - 교보문고
Clean Code(클린 코드) | 프로그래머, 소프트웨어 공학도, 프로젝트 관리자, 팀 리더, 시스템 분석가에게 도움이 될 더 나은 코드를 만드는 책『Clean Code(클린 코드)』은 오브젝트 멘토(Object Mentor)의
product.kyobobook.co.kr
1. 외부 코드 사용하기
Map<String, Sensor> sensors = new HashMap<>();
Sensor s = sensors.get(sensorId);
만약 우리가 특정 기능을 위해 Map 인터페이스를 사용한다고 하자.
IDE에서 map을 생성한 후 map. 까지 쳐보면 뒤에 나오는 수 많은 메서드들.
이 수 많은 메서드들이 map을 활용하는 기능에 쓰이는가? 대부분 그렇지 않다.
불필요한 메서드가 열려있다는 것은 프로그램에 큰 위험성을 준다.
그렇기에, 이 위험성을 방지하기 위해 수 많은 수정 코드가 필요할 것이다.
필요하지 않은 기능까지 제공한다는 것을 어떻게 해결할 수 있을까?
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.getId(id);
}
...
}
경계 인터페이스 Map을 Sensors 클래스 내부로 숨긴다.
Sensors 클래스 안에서 객체 유형을 관리하고 변환하기 때문에, Map 인터페이스가 변경되더라도 나머지 프로그램에는 영향을 미치지 않는다.
그리고 Sensor 클래스를 직접 커스텀하면서 필요한 인터페이스만 제공하도록 할 수 있다.
그렇기에 이해하기 쉽고, 오용하기 어렵고, 비즈니스 및 설계 규칙을 따르게 만드는 좋은 코드가 된다.
매번 저렇게 캡슐화한 방식으로 Map을 사용하라는 것이 아니라, Map 인터페이스를 클래스 밖으로 노출하지 말라는 것이다.
Map 인스턴스를 공개 API의 인수로 넘기거나 반환값으로 리턴하지 말자는 것이다.
2. 경계 살피고 익히기
외부 코드를 활용하면 시간의 효율성이 증가한다.
그런데 이 외부 코드가 내 프로그램에서 제대로 동작할 지 의문이다. 그렇기에 테스트하고 싶다면, 어떻게 해야할까?
일단 가장 기본적으로 외부 코드를 만든 곳에서 제공하는 문서를 읽으며 어떻게 활용할지 결정한다.
그런데 이것만으로는 내 예상대로 잘 안돌아갈 때가 많다.
좀 다르게 접근하자.
우리 코드를 먼저 작성하여 외부 코드를 호출하는 대신, 먼저 간단한 테스트 케이스를 작성하여 외부 코드를 익히는 것이다. 이것을 학습 테스트 라고 부른다.
결국 학습 테스트는 우리의 통제된 프로그램에서 외부 API를 제대로 이해하는지를 확인한다는 것이다.
그리고 이 외부 패키지의 새로운 버전이 나온다면, 성공했던 기존 학습 테스트를 돌리며 새로운 위험을 확인한다.
이런 경계 테스트가 잘 구축되어 있다면, 새로운 버전으로 이전하기 쉬워진다.
3. 아직 존재하지 않는 코드 사용
팀으로서 프로젝트를 하다보면, 내가 모르는 코드나 개념이 분명 있다.
그리고 그 모르는 부분과 내가 아는 부분의 경계가 있다.
각자 아는 내용을 각자가 바라는 인터페이스를 먼저 직접 구현하고, 그 둘을 Adapter를 통해 그 간극을 매울 수 있다.
Adapter 패턴으로 API 활용을 캡슐화하여 API가 바뀔 때 수정할 코드를 한 곳으로 모은다.
4. 깨끗한 경계
결국은 경계에 해당하는 코드를 깔끔히 분리하여 통제가 불가능한 외부 패키지에 의존하는 대신, 통제가 가능한 우리의 코드에 의존하는 것이 외부 코드에 휘둘리지 않는 좋은 방식이다.
그렇기에 외부 패키지를 호출하는 코드를 가급적 줄이고, 위에서 설명했던 새로운 클래스로 경계를 감싸거나 Adapter 패턴을 활용하여 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환할 수 있다.
'Software Engineering > Clean Code' 카테고리의 다른 글
[Clean Code] 9. 단위 테스트 (0) | 2024.03.12 |
---|---|
[Clean Code] 7. 오류 처리 (0) | 2024.02.19 |
[Clean Code] 6. 객체와 자료 구조 (1) | 2024.01.25 |
[Clean Code] 5. 형식 맞추기 (0) | 2024.01.24 |
[Clean Code] 4. 주석 (1) | 2024.01.23 |
개발자가 되고 싶어요.