Стандарты программирования на С++. 101 правило и рекомендация | страница 122
И напротив, код, неоправданно привязанный к деталям, оказывается чрезмерно "жестким" и неспособным к повторному использованию.
• Используйте для сравнения итераторов >!=
вместо ><
. Оператор >!=
более общий и применим к большему классу объектов; оператор ><
требует упорядочения и может быть реализован только итераторами произвольного доступа. При использовании оператора >!=
ваш код проще переносится для работы с другими типами итераторов, такими как одно- и двунаправленные итераторы.
• Лучше использовать итераторы, а не индексы. Многие контейнеры не поддерживают индексный доступ; например, контейнер >list
не в состоянии эффективно реализовать его. Однако все контейнеры поддерживают итераторы. Таким образом, итераторы обеспечивают большую обобщенность кода, и при необходимости они могут использоваться совместно с индексным доступом.
• Используйте >empty()
вместо >size()==0
. "Пуст/не пуст" — более примитивная концепция, чем "точный размер". Например, вы можете не знать размер потока, но всегда можете сказать о том, пуст он или нет; то же самое справедливо и для входных итераторов. Некоторые контейнеры, такие как >list
, реализуют >empty
более эффективно, чем >size
.
• Используйте наивысший класс иерархии, предоставляющий необходимую вам функциональность. При программировании с использованием динамических полиморфных классов не следует делать код зависимым от ненужных вам деталей и привязываться к определенным производным классам.
• Будьте корректны при использовании >const
(см. рекомендацию 15). Передача параметров >const&
накладывает меньше ограничений на вызывающий код, поскольку >const&
охватывает как константные, так и неконстантные объекты.
В некоторых случаях применение индексов вместо итераторов позволяет компилятору лучше оптимизировать код. Однако перед тем как решиться на такой шаг, убедитесь, что вы действительно в нем нуждаетесь и что ваш компилятор действительно при этом лучше оптимизирует ваш код (см. рекомендацию 8).
[Koenig97] §12.7, §17-18 • [Meyers01] §4 • [Stroustrup00] §13, §17.1.1 • [Sutter04] §1, §5, §34
Обработка ошибок и исключения
Обработка ошибок — сложная задача, при решении которой программисту требуется вся помощь, которая только может быть предоставлена.
— Бьярн Страуструп (Bjarne Stroustrup),[Stroustrup94] §16.2
Имеется три способа написать программу без ошибок; но работает только третий способ.
— Алан Перлис (Alan Perlis)
Вопрос не в том, будем ли мы делать программные ошибки. Вопрос в том, будем ли мы что-либо предпринимать, чтобы позволить компилятору и другим используемым инструментам их обнаружить.