이유
인터페이스 규약을 제대로 보여주지 않으면 다른 프로그래머들이 놓치기 십상입니다.
예시 (나쁜 예)
int round(double d)
{
return (round_up) ? ceil(d) : d; // 나쁨 : 감춰진 의존성
}
round_up 이라는 전역 플래그 변수를 통해 함수의 동작이 결정되고 있습니다.
대부분의 사람들은 round() 함수가 어떻게 만들어졌는지 자세히 뜯어보고 싶지 않을 것입니다.
round(7.2) 가 어떤 날은 8 이 나오고 어떤 날은 7 이 나오게 하는 것보단 명백하게 반올림만 하는 것이 훨씬 깔끔합니다.
알아두기
물론 디버그 옵션, 멀티 플랫폼 빌드와 같이 C++ 세계에선 매크로를 통해 외부에서 실행 흐름을 통제하는 것은 흔한 일입니다. 그럼에도 위 예시와 같이 디테일한 코드의 구현을 최대한 해치지 않도록 하는 것이 바람직합니다.
예시 (나쁜 예)
// 나쁨 : fprintf 의 반환 값을 검사하고 있지 않습니다
fprintf(connection, "logging: %d %d %d\n", x, y, s);
사실 fprintf 를 위처럼 많이 사용하지만 출력 스트림에 대한 연결이 항상 보장되진 않는다는 점을 기억해야 합니다.
fprintf 는 출력 도중 오류가 발생하면 음수 값을 반환하는데, 이때는 적절한 예외처리가 필요합니다.
errno 처럼 외부에서 처리되는 값들은 인터페이스를 만들 때 쉽게 무시되는 경향이 있으니 조심해야 합니다.
정리
1. 함수는 외부에 선언된 변수 값을 기반으로 제어 흐름 결정을 내려서는 안 됩니다.
2. 함수 내에 사용될 변수들은 함수 외부에 작성하면 안 됩니다.
3. const 가 아닌 멤버 함수는 다른 멤버 함수에게 자신의 개체 상태를 넘긴다는 의미이기도 하니 주의해야 합니다.
4. 인터페이스는 함수(함수 템플릿) 또는 함수 집합 (클래스, 클래스 템플릿) 이어야 합니다.
참고자료
'C++' 카테고리의 다른 글
[C++ 23] std::basic_string_view<CharT,Traits>::contains 사용하기 (0) | 2024.05.04 |
---|---|
[C++ Core Guidelines] I.2 전역 변수는 상수로 만들자 (0) | 2024.04.30 |
[C++ Core Guidelines] P.12, P.13 도구를 잘 활용하자 (0) | 2024.04.26 |
[C++ Core Guidelines] P.11 지저분하게 코딩하지 말고 캡슐화하자 (0) | 2024.04.26 |
[C++ 20] std::source_location 사용하기 (1) | 2024.04.22 |