⚠개인적으로 공부하려고 메모해둔것 때문에 정리가안돼있고 깔끔하지않음
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 |
댓글