Skip to content

Commit

Permalink
cleancode 8장 정리
Browse files Browse the repository at this point in the history
  • Loading branch information
now-water committed Apr 21, 2022
1 parent 2a05d10 commit d155fe6
Showing 1 changed file with 111 additions and 0 deletions.
111 changes: 111 additions & 0 deletions content/books/cleancode/8.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
title: '8장. 경계'
metaTitle: '만렙 개발자 키우기'
order: 7
tags: ['Book']
date: '2022-04-22'
---

## 외부 코드 사용하기

패키지/프레임워크 제공자는 적용성을 최대한 넓히려고 하고, 사용자는 자신의 요구에 집중하는 인터페이스를 바란다.

이러한 긴장으로 인해 시스템 경계에서 문제가 생길 소지가 많다.

예를 들어 Map 인터페이스를 들 수 있다.

Map 객체를 사용하는 사람은 누구나 내용을 지울 수도 있고, 새로운 값을 추가할 수 있다.

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

이러한 Map 인스턴스를 여기저기로 넘긴다면, Map 인터페이스가 변할 경우 수정할 코드가 상당히 많아지는 문제가 생긴다. (실제로 자바 5가 제네릭스 지원하면서 Map 인터페이스가 변했었다.)

따라서 **Map 과 같은 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의하자**

또한 Map 인스턴스를 공개 API 의 인수로 넘기거나 반환값으로 사용하지 말자.

---

## 경계 살피고 익히기

외부 패키지의 코드에 대한 테스트는 우리의 책임이 아니다. 하지만 우리 자신을 위해 우리가 사용할 코드를 테스트 하는 것은 바람직하다.

### 학습 테스트

먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히는 방법

프로그램에서 사용하려는 방식대로 외부 API 를 호출한다. -> 통제된 환경에서 API 를 제대로 이해하는지 확인하는 방법

API 를 사용하려는 목적에 초점을 맞춘다.

---

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

학습 테스트는 이해도를 높여주는 정확한 실험이며, 필요한 지식만 확보하는 손쉬운 방법이다.

패키지가 예상대로 도는지 검증할 수 있고, 이를 통해 새 버전이 우리 코드와 호환되지 않으면 학습 테스트가 이 사실을 곧바로 밝혀낸다.

이러한 경계 테스트가 있다면 패키지의 새 버전으로 이전하기 쉬워진다.

---

## 아직 존재하지 않는 코드를 사용하기

경계와 관련해 또 다른 유형은 아는 코드와 모르는 코드를 분리하는 경계다.

우리가 바라는 인터페이스를 구현하면 우리가 인터페이스를 전적으로 통제한다는 장점이 생긴다.

또한 코드 가독성도 높아지고 코드 의도도 분명해진다.

우리가 사용할 API 가 정의되고 나면, 어댑터를 구현해 우리쪽 인터페이스와 사용할 API 사이에 간극을 메워준다.

그렇게 되면 API 사용을 캡슐화해 API 가 바뀌게 될 경우 수정해야 하는 코드를 한 곳으로 모을 수 있다.

---

## 깨끗한 경계

경계에 위치하는 코드는 깔끔하게 분리하고, 기대치를 정의하는 테스트 케이스도 작성한다.

우리 쪽 코드에서 외부 패키지를 세세하게 알아야 할 필요가 없다. 그러한 통제 불가능한 외부 패키지에 의존하는 대신, 통제가 가능한 우리 코드에 의존하는 편이 훨씬 좋다.

따라서, **외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자**

새로운 클래스로 경계를 감싸거나, 아니면 어댑터 패턴을 사용해 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환하자.

---

## 정리

이번 장에서 저자가 말하려고 하는 내용을 3가지로 정리할 수 있는 것 같다.

1. Map 과 같은 경계 인터페이스는 클래스 밖으로 노출하지 말고, API 인수나 반환값으로도 사용하지 말자.


2. 외부 패키지는 어댑터나 새로운 클래스 등으로 감싸서 우리 입맛에 맞는 자체 인터페이스를 구축하자.


3. 학습 테스트를 통해 외부 API 에 대해 지식을 얻고, 변경이 일어날 경우 기존 코드와의 호환성을 확인하자. -> 그러면 새 버전이 나와도 이전하기 쉽다.






















0 comments on commit d155fe6

Please sign in to comment.