본문 바로가기
개발일기

[개발일기] 인터페이스 설계는 '제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게' 하자 #Qt #EffectiveC++

by S나라라2 2020. 12. 16.
반응형

 

스콘 마이어스 - Effective C++ 제3판

2020년 1년 동안 간간히 Effective C++ (제3판) 책을 보고 있다.

읽으면 읽을수록 이 책이 왜 유명하고 잘 알려진지 알 것 같다.

정말 유익하고, 다시 읽을 때마다 새로운 안목?을 제공한다.

가끔 지루하고 이해하기 어려울 때가 있어서 노트를 하며 열심히 읽어 나가고 있다.

 

모든 챕터가 재밌지만 그 중 뇌리에 박혔던 부분은 Chapter 4 - 항목 18이다

Chapter 4 설계 및 선언

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

 

해당 항목을 조금 인용해보자

어떤 인터페이스를 설계하든지 막론하고 아마 가장 중요할 것 같은 지침, '제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게'로 포문을 열려고 합니다.

 

어떤 인터페이스를 어떻게 써 봤는데 결과 코드가 사용자가 생각한 대로 동작하지 않는다면 그 코드는 컴파일되지 않아야 맞습니다. 
거꾸로 생각해서 어떤 코드가 컴파일 된다면 그 코드는 사용자가 원하는 대로 동작해야 할 것이고요.

 

인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있습니다.

 

사용자 쪽에서 뭔가를 외워야 제대로 쓸 수 있는 인터페이스는 잘못 쓰기 쉽습니다.

예.
이 함수를 사용할 때는, 자원 누출을 피하기 위해 createInvestment에서 얻어낸 포인터를 나중에라도 삭제해야 합니다.
그런데 이 점 때문에 사용자가 실수를 최소한 두 가지나 저지를 가능성이 만들어집니다.
포인터 삭제를 깜박 잊을 수 있고, 똑같은 포인터에 대해 delete가 두 번 이상 적용될 수 있거든요

 

이 부분에 격하게 공감하였다. 고오럼! 설계할 때는 사용자가 가져다 사용할 때를 고려해야지! 내부는 몰라도 동작 방식은 간단하고 명쾌해야지!

이걸 읽은 후에는 새로 클래스를 설계할 때 "제대로 쓰기엔 쉽게 엉터리로 쓰기엔 어렵게"를 되뇌며 진행하였다.

 

개인적으로 생각하는 가장 중요하면서도 멍청한 실수는 함수 호출 순서에 따라 다르게 동작하는 설계이다.

 

 

위의 규칙을 잘 지킨 Qt의 메서드

 

그리고 오늘 Qt 의 메서드를 하나 보는데 정말 똑똑하구나 감탄을 한 게 있었다. 

누가 이런 천재적인 센스있는 메서드를 짠거지? 정말 별거아닌것 같으면서도 너무나 대단해!!!

사용자 측에서 범할 수 있는 실수(에러)를 사전에 차단하는 메서드이다. 

 

QMap에서 key에 매칭되는 value를 리턴하는 함수이다.

 

여기서 센스 포인트가 정말 많다. 

 

첫 번째는, defaultVaule를 파라미터로 전달받는다. 따라서 해당 key와 연결된 item이 없다면 defaultValue를 리턴한다.

보통 item이 없다면 null을 return하거나 쓰레기값, 혹은 클래스 내부에서 지정해놓은 기본값을 리턴할텐데 여기서는 사용자 측에서 기본값을 지정할 수 있게 만들었다. 너무 센스있음!!!!!!

 

두 번째는, defaultValue=T() 초기화하였다. 사용자가 필수 지정 파라미터가 아니고 선택이 가능하도록 하였다.

 

세 번째는, 모든 변수에 const를 붙이고 참조자를 붙인 것

 

네 번째는, key에 매칭되는 item이 많은 경우, 최근에 넣은 아이템 하나가 반환하도록 한 것이다. 모든 경우의 수도 처리하고 있다!

 

사실 첫 번째 포인트가 가장 놀라웠다. 나머지는 다른 메서드에서도 흔히 보이고, 그냥 아마 첫번째 포인트가 내가 가장 고려못한 부분이라서 그런 듯 하다.

 

이래서 Qt opensource를 보고 공부하라는 조언을 듣는건가보다. 2021년에는 Qt 내부를 공부해볼까나? ^0^

신나느 코딩세계

반응형