좋은 클래스를 설계하기 위한 여러 가지 질문들

 

  • 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?
  • 객체 초기화는 객체 대입과 어떻게 달라야 하는가?
    • 초기화와 대입을 헷갈리지 않는게 가장 중요함, 각각에 해당되는 함수 호출이 아예 다르다
  • 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?
    • 어떤 타입에 대해 값에의한 전달을 구현하는 쪽은 복사 생성자이다
  • 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 가질 것인가?
  • 기존의 클래스 상속에 맞출 것인가?
    • 이미 갖고 있는 클래스로부터 상속을 시킨다면, 당연히 이번에 설계한 클래스는 이녀석들에 의해 제약을 받게 된다. 특히 멤버함수가 가상인가 비가상인가 여부가 가장 크다. 
    • 이번에 설계하는 클래스를 다른클래스들이 상속할수 있게 만들고 싶다면, 멤버함수의 가상함수 여부도 고려할 수 있겠지...
  • 어떤 종류의 타입 변환을 허용할 것인가?
    • 암시적인 변환(Implicit)이 가능하게 만들고 싶다면, 타입 변환 함수를 하나 넣어두던가, 인자 한개로 호출될 수 있는 비명시호출(non-explicit) 생성자를 넣어주어야 한다.
    • 명시적(explicit)타입 변환만 허용하고 싶다면, 해당 변환을 맡는 별도 이름의 함수를 만들되 타입변환 연산자 혹은 비명시호출생성자는 만들지 말아야한다.
  • 어떤 연산자와 함수를 두어야 의미가 있을까?
  • 표준 함수들 중 어떤것을 허용하지 말 것인가?
    • private로 선언해야하는 함수들 고려
  • 새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가?
    • 어떤 클래스 멤버를 public/protected/private영역에 둘 것인가
  • '선언되지 않은 인터페이스'로 무엇을 둘 것인가?
    • 내가 만들 타입이 제공할 보장이 어떤종류일까에 대한 질문으로서, 보장할 수 있는 부분은 수행 성능 및 예외 안전성 그리고 자원사용이다. 이들에 대해 보장하겠다고 결정한 결과는 클래스 구현에 있어서 제약으로 작용하게된다.
  • 새로 만드는 타입이 얼마나 일반적인가? 
    • 실상은 타입하나를 정의하는 것이 아닐지도 모른다 동일계열의 타입군 전체일지도 모른다..
    • 그렇다면 새로운 클래스가아닌 새로운 클래스 템플릿을 정의해야 할 것..
  • 정말로 꼭 필요한 타입인가?
    • 기존의 클래스에 비해 기능 몇 개가 아쉬워서 파생클래스를 새로 뽑고잇다면, 차라리 비멤버 함수라던지 템플릿을 정의하는 편이 낫다
복사했습니다!