본문 바로가기
memo

[clean_code] 08장.경계

by 바까 2022. 7. 15.
반응형

⚠개인적으로 공부하려고 메모해둔것 때문에 정리가안돼있고 깔끔하지않음


01.외부코드사용하기

 

ex) java.util.getMealPerDiem

//Sensor라는 객체를 담는 Map
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);


Map이 반환하는 오브젝트를 올바른 유형으로 변환할 책임은 Map을 사용하는 클라이언트에게 있음.
위와 같은 코드는 의도도 분명히 드러나지 않는다.
대신 다음과 같이 제네릭스를 사용하면 코드 가독성이 크게 높아진다.

Map<String, Sensor> sensors = new HashMap<Sensor>();
...
Sensor s = sensors.get(sensorId);


하지만 위 방법도 Map<String, Sensor>가 사용자에게 필요하지 않는 기능까지 제공하는 문제를 해결하지 못함.
프로그램에서 Map<String, Sensor> 인스턴스를 여기저기로 넘긴다면, Map 인터페이스가 변할 경우, 수정할 코드가 상당히 많아진다.

//깔끔한 코드
public class Sensors {
    private Map sensors = new HashMap();

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

    //이하생략
}

 

- 경계 인터페이스인 Map을 Sensors안으로 숨긴다. 따라서 Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다.

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

- Map 인스턴스를 공개 API의 인수로 넘기거나 반환값으로 사용하지 않는다.

02.경계 살피고 익히기

 

<학습 테스트>

: 외부 코드는 익히고, 통합하기 어렵기 때문에
곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히는것
- 학습 테스트는 프로그램에서 사용하려는 방식대로 외부 API를 호출
- 통제된 환경에서 API를 제대로 이해하는지 확인하는 셈
- 학습 테스트는 API를 사용하려는 목적에 초점을 맞춘다.

 

03.log4j익히기

//아파치의 log4j 패키지 사용

//화면에 hello를 출력하는 테스트 케이스
@Test
public void testLogCreate() {
    Logger logger = Logger.getLogger("MyLogger");
    logger.info("hello");
}

 

-> Appender라는 결과가 필요하다는 오류 발생

@Test
public void testLogAddAppender() {
    Logger logger = Logger.getLogger("MyLogger");
    ConsoleAppender appender = new ConsoleAppender();
    logger.addAppender(appender);
    logger.info("hello");
}

 

-> Appender에 출력 스트림이 없다는 사실을 발견

@Test
public void testLogAddAppender() {
    Logger logger = Logger.getLogger("MyLogger");
    logger.removeAllAppenders();
    logger.addAppender(new ConsoleAppender(
        new PatternLayout("%p %t %m%n"),
        ConsoleAppender.SYSTEM_OUT)
    );    
    logger.info("hello");
}

 

-> ConsoleAppender 에게 콘솔에 쓰라고 알려야한다니 수상
-> ConsoleAppender.SYSTEM_OUT 인수를 제거했더니 문제가 없다.
-> 하지만 PatternLayout을 제거했4더니 또 다시 출력 스트림이 없다는 오류가 뜬다.


//간단한 콘솔로거를 초기화하는 방법 - 단위테스트

public class LogTest{
    private Logger logger;

    @Before
    public void initialize(){
        logger = Logger.getLogger("logger");
        logger.removeAllAppenders();
        Logger.getRootLogger().removeAllAppenders();
    }

    @Test
    public void basicLogger(){
        BasicConfigurator.configure();
        logger.info("basicLogger");
    }

    @Test
    public void addAppenerWithStream(){
        logger.addAppender(new ConsoleAppender(
            new PatternLayout("%p %t %m%n"),
            ConsoleAppender.SYSTEM_OUT
        ));
        logger.info("addAppenderWithStream");
    }

    @Test
    public void addAppenderWithoutStream(){
        logger.addAppender(new ConsoleAppender(
            new PatternLayout("%p %t %m%n")
        ));
        logger.info("addAppenderWithoutStream")'
    }
}

 

04.학습테스트는 꽁짜 이상이다.

//학습테스트는 이해도를 높여주는 정확한 실험이다.
//패키지 새 버전이 나온다면 학습 테스트를 돌려 차이가 있는지 확인한다.
//새 버전이 내 코드와 호환되지 않으면 학습 테스트가 이 사실을 밝혀낸다.

 


Copyright 2022. GA-YOUN. All rights reserved

 

반응형

'memo' 카테고리의 다른 글

[clean_code] 07장.오류처리  (0) 2022.07.05
[clean_code] 06장.객체와 자료구조  (0) 2022.07.05
sql 문제 모음  (0) 2022.05.11
[엑셀]주간 업무일지 파일 공유  (0) 2021.10.01
Visual Studio Code 설치하기(한국어 변경)  (0) 2020.03.12

댓글