Java/클린코드

[클린코드] 경계

chjs93 2022. 3. 2. 22:22

제로베이스 클린코드 요약 정리 글입니다.

모호한 경계를 구분짓기

  1. 경계란
  2. 경계 짓기 (1) 우리 코드를 보호하기
  3. 경계 짓기 (2) 외부 코드와 호환하기
  4. 외부 라이브러리 테스트하기 - Learning Test

 

1. 경계란

내부 코드 |경계| 외부 코드

시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다.

오픈소스, 라이브러리를 안쓰는 프로젝트는 없으며 내부 코드와 외부 코드를 병합해야하는 상황이 생긴다.

우리코드(내부 코드) 와 외부 코드를 깔끔하게 병합시키려면 경계를 잘 지어야 한다.

 

2. 경계 짓기 (1)

우리코드 보호 하기

캡슐화 (Encapsulation)

갭슐화 : 객체의 실제 구현을 외부로부터 감추는 방식

다시 말해 Public 메소드는 외부에 공개하지만 내부 Data, 내부 메소드는 공개하지 않아야 한다는 의미이다.

 

예시) Sensor 를 관리해야 한다. Sensor 는 외부에서 사용된다.

캡슐화를 적용하는 흐름은 이렇다.

  • Sensor Id 와 Sensor 객체로 저장하고 싶어서, Map 을 사용한다.
Map<Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
  • 하지만 Map을 그대로 사용하면 Map이 가진 clear() 가 외부로 노출된다.
    • 데이터가 손상될 수 있다.
  • Sensor의 '외부' 코드 관점에서 Sensor 객체의 값들만 가져오고 싶다.
  • 따라서 캡슐화를 진행한다.
public class Sensors {
    private Map<Sensor> sensors = new HashMap<Sensor>();

    public Sensor getById(String sensorId) {
        return sensors.get(sensorId);
    }
}

캡슐화를 통해서 Map 을 감추고, 원하는 기능만 공개함으로 인해 적절한 경계로 우리 코드를 보호할 수 있다.

 

3. 경계 짓기(2)

외부 코드와 호환하기

외부 코드를 호출할 때 우리가 원하는 방식으로 사용하고 싶을 때를 생각해보자

Adapter 패턴

어댑터 패턴을 사용하면 외부 코드를 호출할 때, 우리가 정의한 인터페이스 대로 호출하기 위해 사용할 수 있다.

Client Request 방식대로 Adapter 클래스를 호출하면 Apapter 클래스에서 Adaptee(외부 코드) 에 맞추어 변환해서 호출하는 방식이다.

 

4. 외부 라이브러리 테스트하기

Learning Test 를 작성해 라이브러리를 테스트한다.

라이브러리는 이미 테스트 되어 있지만 라이브러리를 '사용' 하는 테스트를 해야한다는 의미이다.

테스트하는 장점은 다음과 같다.

  • 학습 테스트는 이해도를 높인다.
  • 외부 코드의 버전이 변경되었을 때, 우리 코드와 호환되는 지 확인할 수 있다.