본문 바로가기

책 정리/Exceptional C++ Style

(42)
Exceptional C++ Style (익셉셔널 C++ 스타일 : ECPPS ) 목차 제1장 일반적 프로그래밍과 C++ 표준 라이브러리 1. vector의 올바른 용법과 잘못된 용법 2. 문자열 포매팅, 1부: sprintf 3. 문자열 포매팅, 2부: 표준의 세련된 대안들 4. 표준 라이브러리 멤버 함수 5. 여러 수준의 일반성, 1부: 기초 6. 여러 수준의 일반성, 2부: 충분히 일반적인가? 7. 함수 템플릿을 특수화하지 말아야 하는 이유 8. 템플릿 친구 만들기 9. export의 한계, 1부: 기초 10. export의 한계, 2부: 상호작용, 유용성 문제, 지침들 제2장 예외 안전성 문제와 기법 11. try와 catch 12. 예외 안전성: 추구할 가치가 있는가? 13. 예외 명세에 대한 실용적인 고찰 제3장 클래스 설계, 상속, 다형성 14. 순서의 중요성 15. 접근 권한..
항목 40 : 일체적 클래스의 해악, 4부 : std::string 대미 ( 난이도 : 6 ) 1 ) std::string::erase가 비멤버 함수가 될 수 있을까? 2 ) std::string의 나머지 멤버 함수들을 분석하고, 비멤버 함수들로 만들 수 잇는지(또는 그렇게 하는 것이 좋은지) 설명하라 a. replace b. copy와 substr c. compare d. find 군(find, find_*, rfind ) 이렇게 질문이 있는데, 하나의 진리에서 나온 것들이다. "클래스 구현시, non-member, non-friend function 으로 만들 수 없는 함수만, member 함수로 만들어라." 이번 항목의 요약을 책에서 그대로 옮긴다. 분활과 캡슐화는 좋은것이다. 특히 C++의 경우에는, 알고리즘과 컨테이너를 분리시키는 것이 좋다. STL도 대부분 그런 원칙에 따라 만들어 졌다..
항목 39 : 일체적 클래스의 해악, 3부 : std::string 살 빼기 ( 난이도 : 5 ) 1 ) string::resize가 비멤버 함수가 될 수 있을까? 설명하라. 될 수 있다. 공개 인터페이스로 확장시켜 놓고 swap 시키면 되는데 소스코드를 보자. template void resize( std::basic_string& s, typename Allocator::size_type n, charT c ) { if( n > s.max_size() ) throw std::length_error( "won't fit"); if( n
항목 38 : 일체적 클래스의 해악, 2부 : std::string 리팩토링 ( 난이도 : 5 ) 저번 항목에 이어서, 이번 항목은 리팩토링이다. 때 마침 리팩토링 관련 서적을 읽고 있던 터라, 그 필요성을 알게 되었었터라 "무엇을 어떻게 리팩토링 할까?" 에 대해서 생각해 보게 된다. 1 ) std::string의 멤버 함수들 중 멤버가 아니면 안되는 것들은 무엇이 있고, 왜 그런가? 멤버가 아니면 안되는 함수들은, 생성자, 소멸자, 할당 연산자, operator[] 연산자들이 있다. 이것은 멤버가 아니면, 어찌 할 수 없는 것들이다. 왜 생성자와 소멸자, operator=과, operator[] 연산자들은 왜 멤버로 놔야 할까? 여기서 중요한 개념을 짚어 봐야 한다. 스콧 마이어스는 "멤버로도 구현할 수 있고, 비친구 비멤버로도 구현 할 수 있는 함수가 있다면, 비친구 비멤버를 선호 해야 한다" ..
항목 37 : 일체적 클래스의 해악, 1부 : std::string의 사례 ( 난이도 : 3 ) 이번 항목은 std::string 의 스타일을 알아보고, 한가지 설계 지침을 통하여, 이 스타일을 간략하게 비평해 본다. 1 ) 일체적(monolithic) 클래스란 무엇이며, 왜 나쁜지 설명하라. 일체적(monolithic) 클래스란? 클래스가 매우 크고 무거워 더 이상 나눌 수 없는 클래스를 뜻한다. 매우 크다고 무겁다는 뜻은, 코드가 매우 방대하다는 뜻이다. 이게 왜 나쁜가? 코드의 량이 방대하면, 우선, 사용하기 힘들고, 수정하기 힘들며, 추가하기 힘들다. 이는 유지 보수가 무척이나 까다롭다는 것을 뜻한다. 예를 들자면, 1. 잠재적으로 개별적인 가능성을 한 클래스 안에서 집어 넣는다. 이는 다른 형식들과 함께 사용 할 가능성을 막아 버리는 것이므로, 사용 범위가 무척이나 좁아 진다. 2. 새로운..
항목 36 : 생성되는 객체를 가진 공용체 ( 난이도 : 4 ) 이번 항목은 공용체란 무엇이고, 남용 될 수 있는 사례를 들어 보고, 생각해 보게 한다. 1 ) 공용체는 무엇이고 어떤 목적으로 쓰이는가? 공용체 union 은 같은 메모리 공간을 여러개의 객체들이 공유하는 구조체이다. 아래 코드를 봐 보자. #include union U { int i; float f; }; int main( void ) { U u; u.i = 42; std::cout
항목 35 : 일반적 콜백 ( 난이도 : 5 ) 일반화 프로그래밍의 가장 큰 매력은 코드의 재사용이다. 이번 항목은 "어떻게 좀 더 일반화 시킬 수 있지?"를 생각해 보는 항목이다. 1 ) 일반적 클래스나 함수를 설계하고 작성할 때 추구해야 할 사항들로는 무엇이 있는지 설명하라. 내 경우는 간단함과 직관적인 함수명, 마지막으로 재사용 이다. 책에서는 필요 이상의 형식 제한을 피하고, 필요 이상의 기능성을 제하고, 필요 이상의 일체적 설계를 피하는 것을 추구해야 한다고 한다. 2 ) 다음 코드는 콜백 함수를 감싸는 흥미롭고도 유용한 관용구를 보여준다. 좀 더 자세한 설명은 원래의 글[Kalev01]을 참고하기 바란다. 다음 코드를 비평하고 다음을 지적해라. #include template < class T, void (T::*F)() > class ca..
항목 34 : 색인 테이블 ( 난이도 : 5 ) 이번 항목부터 40 항목까지 스타일에 대한 이야기를 한다. 1 ) 명료하고 이해하기 쉬운 코드는 누구에게 도움이 될까? 당연히 누구에게나 도움이 된다. 그 중 가장 도움이 되는 사람은 바로 자기 자신일 것이다. 예전에도 그랬고 지금도 그런데, 일화로 3주일 전에 짠 코드를 다시 볼 일이 생겼었다. 코드를 보니, 최적화를 한다고 여기 저기 if 들이 있었고, 변수명과 함수명으로는 도저히 감을 못잡겠다. 더군다나 어떻게 돌아가는지 몰라서, 결국 실행해 보면서 코드를 쫒아 보는 사태가 발생했다. .. 이 경험을 통해서 한가지 교훈을 얻게 되었는데, "나 때문에 코드를 간단하게 만들자." 로 되었다. 2 ) 다음 코드는 기존 컨테이너들에 대한 색인 테이블 생성을 위한 흥미롭고 유용한 관용구를 보여준다. 색인 테..