가취공부하자

[Clean Code]8장. 경계 본문

c++/(책) Clean Code

[Clean Code]8장. 경계

keepGGoing 2023. 7. 23. 15:13

소프트웨어를 개발할 외부 코드를 우리 코드에 통합시켜야 하는 경우가 많다.

이때소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴보자.

 

외부 코드 사용하기

Map sensors = new HashMap();

Sensor s=  (Sensor)sensors.get(sensorId);

 

코드는 Map 반환하는  Object 올바른 유형으로 변환할 책임은 Map 사용하는 클라이언트에 있다.

 

코드는 깨끗한 코드로 보기 어렵다.

코드 대신 제너릭스 (Generics) 사용하면 코드 가독성이 크게 높아진다

더보기

제너릭스 (Generics)란?

 

- 다양한 타입의 객체를 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능

- 객체의 타입을 컴파일 시에 체크하기에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다

- 타입의 안정성을 제공해 주고 타입 체크와 형변환을 생략할 수 있기에 코드가 간결해진다.

 

 

 

Map<String, Sensor> sensors = new HashMap<Sensor>();

..

Sensor s = sensors.get(sensorId);

 

하지만 방법도"Map <String, Sensor>가가 사용자에게 필요하지 않은 기능까지 제공한다" 문제는 해결하지 못한다.

 

이를 해결하기 위해선 경계 인터페이스인 Map Sensor안으로 숨긴다.

Public class sensors {

Private Map sensors = new HashMap();

 

Public sensor getById(String id){

Return (Sensor) sensors.get(id);

}

}

코드는 sensors클래스 안에서 객체 유형을 관리하고 변환하기 때문에 map 인터페이스가 변하더라도 나머지 프로그램 에는 영향을 끼치지 않는다.

 

이는 Map 클래스를 사용할 때마다 위와 같이 캡슐화를 하라는 말이 아니다

. Map 같은 경계 인터페이스를 이용할때에는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의해야한다.

 

경계를 살피고 익히기

외부 코드를 익히기 위해서는 곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익힌다. 이런 방법을 학습 테스트라고 한다.

학습 테스트는 프로그램에서 사용하려는 방식대로 외부 api 호출한다.

학습 테스트는 공짜 이상이다.

학습 테스트에 드는 비용도 없지만 가치는 공짜 이상이다. 투자하는 노력보다 얻는 성과가 크다.

학습 테스트는 패키지가 예상대로 도는지 검증한다. 이는 새로운 버전이 코드가 호환되지 않으면 학습 테스트가 사실을 곧바로 밝혀낸다. 이런 경계 테스트가 있다면 패키지의 버전으로 이전하기도 쉬워진다.

 

 

깨끗한 경계

경계에 위치하는 코드는 깔끔히 분리한다. 또한 기대치를 정의하는 테스트 케이스도 작성한다. 이쪽 코드에서 외부 패키지를 세세하게 알아야 필요가 없다.

통제가 불가능한  외부 패키지에 의존한는 대신  가능한 우리 코드에 의존하는 편이 좋다.

=> 외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자.

'c++ > (책) Clean Code' 카테고리의 다른 글

[Clean Code] 9장 단위테스트  (0) 2023.07.23
[Clean Code] 7장 오류처리  (0) 2023.07.23
[Clean Code] 6장. 객체와 자료구조  (0) 2023.07.23
[Clean Code] 5장 형식 맞추기  (0) 2023.07.23
[Clean Code]4장 주석  (0) 2023.07.23