모든 소프트웨어를 직접 개발하는 경우는 드물다.
패키지를 사기도 하고, 오픈 소스를 사용하기도 한다. 때로는 사내 컴포넌트를 사용한다.
어떤 식으로든 외부 코드를 우리 코드애 깔끔하게 통합해야만 한다.
이 장에서는 소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴본다
외부 코드 사용하기
인터페이스 , 패키지 , 프레임워크
제공자와 사용자 사이 시스템 경계에서 문제가 발생할 소지가 많다.
java.util.map 살펴보면 많은 인터페이스를 제공, 기능성과 유연성을 제공하지만 위험성도 제공한다.
clear()는 모든 데이터를 지울수 있다. Map을 여기 저기로 넘긴다고 생각해보자.
어딘가에서 누군가가 clear()를 호출하지 않으리라 보장할수 있을까?
또한 Map은 저장할 때 Object타입 객체를 저장하므로 객체유형을 제한하지 않는다.
현재는 지네릭으로 이문제는 없다없다.(지네 릭스는자바 5부터 지원)
만약 너무 많은 기능을 제공하거나 래거시 코드가 지네릭을 지원을 안 하는데 적용하고 싶다면
이 또한 래퍼 클래스로 많은 부분을 해결할 수 있다.
예를 들어, Map을 사용하지만 Map의 clear() 호출을 못하게 하고 싶다면
래퍼클래스로 감싸고, clear() 메서드를 호출 못하게 메서드로 만들지 않거나, private으로 만든다.
class Legecy {
//Map 기능을 제한하고 싶다.
//public HashMap map = new HashMap();
Wrapper wrapper = new Wrapper();
}
/*****************/
class Wrapper {
private HashMap map = new HashMap();
/*외부에 노출하고 싶은 메서드 정의*/
}
여기서 중요한 것은 Map clear()메서드 따위가 아니다.
Map과 같은 유사한 경계 인터페이스를 여기저기 넘기지 말라는 말이다.
경계 살피고 익히기
외부 코드 사용의 강점은 적은 시간에 많은 기능을 구현할 수 있다는 것
만약 외부코드를 사용하고 싶다면 어디서부터 시작해야할까?
외부 패키지 테스트는 우리 책임이 아니지만 우리 자신을 위해 테스트하는 편이 바람직하다
API문서를 먼저 읽으면서 사용법을 결정 이후 예상대로 동작하는 지 확인이 아닌 반대로
우리 쪽코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익힌다.
이를 학습 테스트라 한다.
학습 테스트는 프로그램에서 사용하려는 방식대로 외부 API를 호출한다. 즉, 사용하려는 목적에 초점을 맞춘다.
학습 테스트는이상이다.
학습 테스트에 드는 비용은 없다. 어쨌든 API를 배워야하기 때문이다.
오히려 필요한 지식만 확보하는 손쉬운 방법이다.
학습 테스트는이해도를 높여주는 정확한 실험이다
패키지가 신규 버전이 나온다면 학습 테스트는 패키지가 예상대로 도는지 검증한다.
패키지가 우리 코드와 호환되리라는 보장이 없기 때문이다.
학습 테스트가 호환되지 않는 코드를 곧바로 밝혀줄 것이다.
아직 존재하지 않는 코드를 사용하기
경계와 관련해 또 다른 유형은 아는 코드와 모르는 코드를 분리하는 경계다.
때로는 우리 지식이 경계를 너머 미치지 못하는 코드 영역도 있다.
때로는 적어도 지금은 알려고 해도 알 수가 없다.
이럴 때 미래 존재할 API 기능을 정의한 인터페이스를 만들고, 작업을 시작한다.
후에 API가 만들어졌으면, ADAPTER 패턴을 이용해 실제 API객체를 사용하도록 만들면 된다.
스프링은 기능은 같지만 서로 다른 라이브러리 호출 방법을 하나의 방법으로 호출하기 위해 어댑터 패턴을 사용한다.
깨끗한 경계
경계에서는 변경이 자주 이루어진다.
소프트웨어 설계가 우수하다면 변경에 많은 비용이 들지 않는다.
통제하지 못하는 코드를 사용할 때는 너무 많은 투자를 하거나 향후 변경 비용이 지나치게 커지지 않도록 각별히 주의해야한다.
예로 라이브러리는 *.class 내가 코드를 통제 못함
따라서, 감싸기 클래스로 해당 클래스 인스턴스를 생성해 우리 메서드안에서 외부클래스 메서드를 호출
경계에 위치하는 코드는 깔끔히 분리한다. 또한 기대치를 정의하는 테스트 케이스도 작성한다.
이쪽 코드에서 외부 패키지를 세세하게 알아야 할 필요가 없다.
통제가 불가능한 외부 패키지에 의존하는 대신 통제가 가능한 우리 코드에 의존하는 편이 훨씬 좋다.
외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자.
Map에서 봤듯이 새로운 클래스로 감싸거나 ADAPTER 패턴을 사용해 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환하자
'IT책, 강의 > 클린코드(Clean Code)' 카테고리의 다른 글
10장 클래스 (0) | 2022.10.26 |
---|---|
9장 단위 테스트 (0) | 2022.10.21 |
7장 오류 처리 (0) | 2022.10.12 |
6장 객체와 자료 구조 (1) | 2022.10.06 |
5장 형식 맞추기 (0) | 2022.10.05 |