A, B 라이브러리가 있다.
A와 B가 모두 사용자에게 보이지만, A는 B에 종속적이라고 알고 있기 때문에 사용자는 A만 이용하려 한다.
사용자는 A의 a 함수를 호출하며 A는 내부적으로 B의 b 함수를 이용한다.
사용자가 위와 같이 a 함수를 사용했다고 하자. 리턴 값은 true였다. 그러나 실제로 아무 것도
수행되지 않았다.
사용자는 왜 이러는지 한참을 고민한다. 자기 코드에 문제가 있는 건 아닌가 하고...
그러나, 디버깅 결과는 많은 공부가 되었다.
A의 a 함수 호출 시 내부에서 호출되는 B의 b 함수를 이용하려면, 그 전에 아래와 같이 B를 초기화해줘야 했다.
하지만, 사용자는 이 사실을 몰랐던 것이다.
이 문제는 사실 B 라이브러리의 버그이다.
이 경우 B가 초기화 되기 전에 b 함수를 실행한다면, 리턴 값으로 true를 주는 것은 엄연한 버그다.
즉, 초기화가 되지 않은 상태에서, 아래의 수행 결과는 당연히 false여야 한다는 것이다.
그래야 사용자는 함수 호출이 왜 실패 했는지를 되짚어 볼 수 있다.
하지만,
근본적인 문제는 버그에 있다기 보다는 라이브러리 설계에 있다고 할 수 있다.
사용자는
- A를 이용함에 있어 B의 기능이 필요한 점을 모를 수 있고,
- B의 존재를 안다고 해도 초기화를 해야 하는지 역시 모를 수 있다.
물론 A의 API 설명서에 이런 내용을 명시한다면야 사용자의 잘못이라고 할 수 있겠으나,
현업에 종사하다 보면 API 설명서가 제대로 되어 있는 라이브러리를 찾아보기란 애인을 사귀는 것 만큼이나매우 어렵다.
위와 같은 문제를 해결하기 위해 본인이 생각하는 solution은
1. 사용자는 A를 사용하므로, A의 초기화가 필요하단 사실은 쉽게 짐작할 수 있다.
2. 그러므로, A의 초기화 함수 내부에 B의 초기화도 같이 수행하도록 한다.
3. B의 초기화 시 외부 인자가 필요하다면, A 초기화 함수 인자에 해당 인자들을 포함하도록 한다.
도식화하면 아래와 같다.
본인은 현업에 종사하면서 이 원칙을 가지고 개발에 임하고 있다.
누가 알아주는 것은 아니지만, 자기 만족이랄까...
하지만, 내가 생각하는 것이 꼭 정답은 아니므로, 자신의 가진 생각과 잘 융화 시키는 것이 더욱 유익하리라 생각한다.
- Review 2020. 2. 5
. 다시 읽어보니 감회가 새롭다. 역시 탄탄한 기초는 매우 중요하다. 마지막 줄의 유보적인 코멘트는 빼고 싶을 정도로 옳은 방식이다. 이런 올바른 생각들이 켜켜이 쌓여 현재의 나를 만든 것이라고 믿는다.
. 파사드(Facade) 패턴의 일부 개념에 대한 설명이므로, 패턴명도 붙여 보았다.
'Fundamentals' 카테고리의 다른 글
Array(배열)의 Subscript(첨자)와 Index(색인) (4) | 2020.02.09 |
---|---|
프로그래밍의 좋은 습관/나쁜 습관 2 - 코드 체크인(커밋) 직전 코드 수정 - 2012/4/1 (0) | 2020.02.06 |
프로그래밍(코딩)을 잘하고 싶다면 (나만의 개발자 십계명+1) - 2004/7/9 (0) | 2020.01.30 |