인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔어렵게 하자

Bogoomi·2022년 6월 9일
0

EffectiveC++

목록 보기
4/24

항목18 - 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔어렵게 하자

인터페이스 설계를 제대로 하고싶다면 우선, 저지를 만한 실수의 종류를 머리에 넣어두어야한다!

아래 코드와 같이 매개 변수를 잘못 넣을 수 있다.

class Date{
public:
  Date(int month, int day, int year);
};

Date d(30, 3, 1995) ; 	// 3과 30을 잘못씀
Date d(3, 40, 1995); 	// 30을 넣어야했는데 오타로 40

해결책 
새로운 타입을 넣어 매개변수를 구분!

아래 코드와 같이 struct를 사용해 일 월 년 구분
// 일 타입
struct Day{
   explicit Day(int d) : val(d) {}
   int val;
};

// 월 타입
struct Month{
   explicit Month(int m) : val(m) {}
   int val;
}

// 년 타입
struct Year {
   explicit Year(int y) : val(y) {}
   int val;
}

// Date 클래스 재정의
class Date{
public:
  Date(const Month& m, const Day& d, const Year& y);
};
Date d(Month(3), Day(30), Year(1995));

또한 아래코드처럼 타입에 제한을 걸어 오류를 방지

class Month{
public:
   static Month Jan() {return Month(1);}
   ...
   static Month Dec() {return Month(12);}
private:
  explicit Month(int m);
};

Date d(Month::Mar(), Day(30), Year(1995));

_explicit : 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드이다.


잊지말자!
1. 인터페이스를 만들 때는 이 특성을 지닐 수 있도록 고민하고 또 고민합시다.

  • 사용자가 저지를 만한 실수를 생각
  • 새로운 타입으로 제약하여 실수를 예방
  1. std::tr1::shared_ptr은 교차 DELL 문제를 막아주며,
    뮤텍스 등을 자동으로 잠금해제하는데 쓸 수 있도록, 소멸자를 지정해서 쓸 수 있다.

느낀점
아직 뮤텍스나 스마트포인터에 대해 상세하기 알지 못해 무슨 소리인지 감이 잘안잡힌다. 스마트포인터를 익히고 다시 봐야 제대로 이해할 수 있을 것 같다.

profile
개에에에바알

0개의 댓글