Рецензии на книгу
"Стандарты программирования на С++. Серия "C++ In-Depth""
21.10.2005
RSDN.RU (портал)
Алексей Кирюшкин
http://www.rsdn.ru/res/book/cpp/cppstandards.xml
Интересно было читать эту книгу на фоне местных страданий о необходимости ASSERT-ов, глобальных битв за заблаговременную и против преждевременной оптимизации, а также периодически возникающих дискуссий исключения vs коды возврата.
Если в отношении assert авторы не испытывают никаких сомнений ("Трудно переоценить всю мощь assert" - Рекомендация 68. Широко применяйте assert для документирования внутренних допущений и инвариантов), то с оптимизацией все не так однозначно.
Да, "Преждевременная оптимизация - корень всех бед в программировании", да, "Гораздо, гораздо проще сделать корректную программу быстрой, чем быструю - корректной" (Рекомендация 8. Не оптимизируйте преждевременно), но и "При прочих равных условиях ... ряд эффективных шаблонов проектирования и идиом кодирования должны естественым образом "стекать с кончиков ваших пальцев" и быть не сложнее в написании, чем их пессимизированные альтернативы. Это не преждевременная оптимизация, а избежание излишней пессимизации." Под преждевременной пессимизацией авторы понимают, например: передачу параметров по значению там, где применима передача по ссылке (рекомендация 25) использование постфиксной ++ там, где с тем же успехом можно воспользоваться префиксной версией (рекомендация 28) использование присваивания в конструкторах вместо списка инициализации (рекомендация 48) В качестве приемов, позволяющих сделать программу одновременно и яснее и эффективнее приводятся использование готовых алгоритмов вместо явных циклов (find, sort), а также абстракций и библиотек (vector, map, list).
Что касается pro и contra исключений я обратил внимание на один аргумент "за", может и звучавший при обсуждении этого вопроса в наших форумах, но явно затерявшийся на фоне рассуждений о негативном влиянии исключений на производительность, а именно: "Исключения не возможно проигнорировать. Самое слабое место кодов ошибок заключается в том, что по умолчанию они игнорируются; чтобы уделить хотя бы минимальное внимание кодам ошибок, вы должны явно писать код, который опрашивает код ошибки и отвечает на него. Весьма распостраненная среди программистов практика - случайно (или из-за лени) забыть опросить код ошибки. Исключения же невозможно просто проигнорировать; чтобы проигнорировать исключение, вы должны явно перехватить его (даже если вы сделаете это при помощи единственной инструкции catch(...)) и ни как на него не отреагировать." (Рекомендация 72. Для уведомления об ошибках следует использовать исключения.) В целом книга местами пересекается с книгой Макконелла Совершенный код, однако, в отличии от нее целиком посвящена C++ и написана гораздо более сжато, и книгами Майерса Эффективное использование C++, Наиболее эффективное использование C++ и Эффективное использование STL, но в отличии от них больше напирает на идеологию, а не на технику дела. Впрочем, авторы и позиционируют свою книгу именно как концентрацию опыта всего сообщества программистов по написанию высококачественного кода на C++, разбросанного по частям по самым разным книгам.