4. Designs and Declarations

18. Make interfaces easy to use correctly and hard to use incorrectly.

인터페이스를 올바르게 사용하기 쉽도록, 틀리게 사용하기 어렵도록 만들어라. 자원 누수에 유의하라.

  • 좋은 인터페이스는 올바르게 쓰기는 쉽고 틀리게 쓰기는 어렵다. 이것을 당신의 인터페이스 곳곳에 실현하려 노력하라.
  • 인터페이스가 내장 자료형과 일관된 행동을 하도록 만들어라.
  • 오류를 막는 방법은 새 타입을 만드는 것, 타입에 대한 연산을 제한하는 것, 오브젝트 값을 제한하는 것, 자원 활용 책임을 클라이언트에게 지우지 않는 것 등이 있다.
  • std::unique_ptr, std::shared_ptr을 사용하라.

19. Treat class design as type design.

클래스 설계를 타입 설계처럼 하라. 클래스의 오브젝트가 어떻게 생성되고 어떻게 소멸되는가? 오브젝트 대입과 오브젝트 초기화에는 어떤 차이가 있는가? 값을 통해 전달될 때 어떻게 행동하는가? 새 타입에 대한 올바른 값들의 범위는 어떠한가? 새 타입이 상속 그래프에 걸맞는가? 어떤 타입으로 형변환이 지원되는가? 어떤 연산과 함수를 쓸 수 있나? 불허되어야 하는 기본 함수는 무엇인가? 멤버에 접근해야 하는 클래스들은 무엇인가? 새 타입에서 선언되지 않은 인터페이스들은 무엇인가? 새 타입이 얼마나 일반적인가? 새 타입이 정말로 필요한 타입인가?

  • 클래스 설계는 타입 설계이다. 새 타입을 정의하기 전 이 절에서 다뤘던 내용들을 상기하자.

20. Prefer pass-by-reference-to-const to pass-by-value.

값으로 넘기지 말고 const 참조자로 넘겨라. 이는 슬라이싱 문제도 예방해 준다. 이는 내장 타입이나 STL 반복자에는 적용되지 않는다.

  • 값으로 넘기지 말고 const 참조자로 넘겨라. 이는 복사를 방지하기 때문에 더 효율적이며 슬라이싱 문제도 예방해 준다.
  • 이 규칙은 내장 자료형이나 STL 반복자에는 적용되지 않는다. 이들은 값으로 넘기는 것이 낫다.

21. Don’t try to return a reference when you must return an object.

로컬에 대한 참조나 포인터를 반환하지 말라. 댕글링 참조나 댕글링 포인터가 된다.

  • 오브젝트가 둘 이상 필요할 수 있다면 절대로 로컬 스택 오브젝트에 대한 포인터나 참조를 반환하지 말라. 힙 오브젝트에 대한 참조를 반환하지 말라. 로컬 정적 오브젝트에 대한 포인터나 참조를 반환하지 말라.

22. Declare data members private.

캡슐화를 위해 데이터 멤버는 private로 선언하라.

  • 데이터 멤버를 private로 선언하라. 이는 클라이언트들에게 있어 문법적으로 일관된 데이터 접근 방법을 제공하고, 정밀하게 조정된 제어를 할 수 있게 하고, 클래스 불변 조건을 강제하고, 클래스 제작자에게 구현 유연성을 준다.
  • protected는 private보다 캡슐화를 더 제공하지 않는다.

23. Prefer non-member non-friend functions to member functions.

비 멤버 비 프렌드 함수를 멤버 함수보다 선호하라.

  • 비 멤버 비 프렌드 함수를 멤버 함수보다 선호하라. 이는 캡슐화를 증가시키고, 패키징 유연성을 주고, 기능적 확장성을 높인다.

24. Declare non-member functions when type conversions should apply to all parameters.

함수의 매개변수에 형변환이 필요하다면 그 함수를 멤버 함수로 쓰면 안 된다. 프렌드 함수도 안 된다.

  • 함수의 모든 매개변수에 형변환이 필요할 수 있다면 그 함수는 비-멤버여야만 한다.

25. Consider support for a non-throwing swap.

std::swap에도 사용자 정의 클래스에 대해서는 복사/이동 관련된 문제가 있다. 이럴 때는 std::swap을 커스텀화하라.

  • std::swap이 사용자 정의 클래스에 대해 비효율적이라면 swap을 커스텀화하라. 이 때 예외가 던져지지 않게 하라.
  • 멤버 함수 swap을 쓴다면, 이를 호출하는 비-멤버 swap을 제공하라. 클래스에 대해서는 std::swap도 특성화하라.
  • swap을 호출할 때에는 using std::swap을 한 뒤에 swap을 써라.
  • 사용자 정의 타입에 대해 std 템플릿을 특수화하는 것은 괜찮다. 그러나 std 네임스페이스에 완전히 새로운 것을 추가하면 절대로 안 된다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중