본문 바로가기
C++

[C++ Core Guidelines] I.1 인터페이스를 분명하게 만들자

by 코드쉼터 2024. 4. 30.

I.1: Make interfaces explicit

 

이유

인터페이스 규약을 제대로 보여주지 않으면 다른 프로그래머들이 놓치기 십상입니다.

 

 

예시 (나쁜 예)

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. 인터페이스는 함수(함수 템플릿) 또는 함수 집합 (클래스, 클래스 템플릿) 이어야 합니다.

 

 

참고자료

https://mystyle1057.tistory.com/entry/C%EC%96%B8%EC%96%B4-%EA%B0%95%EC%A2%8C-%EC%98%A4%EB%A5%98%EC%B2%98%EB%A6%AC-errno-strerror-strerrorr