📅 TIL (Today I Learned): 2024.02.09
📋 오늘 읽은 범위: 8. 경계, 9. 단위 테스트
😎 책에서 기억하고 싶은 내용을 써보세요.
모든 소프트웨어를 직접 개발하는 경우는 드물기에 때로는 패키지를 사거나 오픈 소스를 이용하게 되는데, 이때 외부 코드를 우리 코드에 깔끔하게 통합해야만 한다. -> 소프트웨어 경계를 깔끔하게 처리하기
프레임워크 제공자는 '적용성을 최대한 넓히려' 하고, 사용자는 '자신의 요구에 집중하는 인터페이스'를 바란다.
이건 코드로 담아야겠다...
Map은 굉장히 많은 역할을 하고 있는데 clear() 기능도 가능하다는 것! 근데,
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);
이렇게 하면 Map이 반환하는 Object를 알맞게 변환할 책임을 클라이언트가 갖게 된다.
그래서 Generics을 사용하면 코드 가독성이 높아지긴 하는데,
Map<String, Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
이렇게 해도 Map<String,Sensor>가 필요하지 않은 기능까지 제공하게 된다.
그래서
public class Sensors {
private Map sensors = new HashMap();
}
경계 인터페이스인 Map을 Sensors 안으로 숨긴다.
이렇게 하면 나머지 프로그램에는 영향을 미치지도 않고, 필요한 인터페이스만 제공할 수 있다.
경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다.
Map 인스턴슬르 공개 API의 인수로 넘기거나 반환값으로 사용하지 않는다.
우리 쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히는 것
법칙 세 가지
1. 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
맞는 얘긴데 때로는 주저 없이 함수 하나에 여러 assert 문을 넣기도 한다.
그래서,
'개념 당 assert 문 수를 최소로 줄여라'와 '테스트 함수 하나는 개념 하나만 테스트하라'로 말할 수 있겠다.
🥺 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.
한 번도 Map을 사용하면서 감싸서 사용할 생각을 안 해봤다. 해본 적은 있는데 그 의도를 생각하면서 사용한 것은 아닐 것이다. 8단원은 짧으면서 무엇보다 중요한 얘기를 담고 있다.
단위 테스트 부분은 이미 관련하여서 책을 읽은 적도 있고 개인 프로젝트 시 적용해서 사용하고 있어서 아는 내용을 한 번 더 복습한 느낌이 들었다. 그래서 8단원 경계가 더 생소하게 느껴졌다.
🤔 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
궁금한 게 없어서 흠이다. 제대로 이해했다면 그 다음 궁금증이 생겨나야 하는데...ㅠ 나중에 한 번 더 읽어야 할 것 같다.
그냥 아무나 3명 골라도 되는 건데 난 또 하나하나 찾아보겠지... 시작...