| | |
| Общий смысл | |
| Придерживайтесь симметрии и принципа стека в своих действиях — это хорошая привычка, которая придает разрабатываемой системе строгость, дисциплинирует и оберегает от совершения ряда ошибок. | |
| | |
| Симметрия | |
| Если вы вступаете во владение ресурсом в конструкторе, освобождайте этот ресурс в деструкторе. Если у вас есть функция Open, напишите функцию Close. Если вы написали отправку в поток, напишите и чтение из потока. Если некоторая система вступила во владение некоторым ресурсом, то пусть эта же система и будет ответственной за его освобождение. И вообще, если вы сделали определенным образом шаг вперед, делайте зеркально противоположным (но в то же время аналогичным по своей сути) образом шаг назад. | |
| Плохо, если для чтения используется мембер-функция, а для записи — поток ввода-вывода. Плохо, если инициализация происходит в конструкторе, а освобождение — в специальной функции. Плохо, если система, вступая во владение некоторым ресурсом и выдавая вам хендл, не котнтролирует его дальнейшую судьбу и оставляет обязанность освободить этот ресурс за вами. | |
| | |
| Стек | |
| Шаги относительно вложенной функциональности старайтесь осуществлять по принципу стека. Открыли поток, открыли файл, закрыли файл, закрыли поток. Начали языковую транзакцию, начали SQL-транзакцию, завершили SQL-транзакцию, завершили языковую транзакцию. В случае исключения откатили SQL-транзакцию, затем откатили языковую транзакцию. Придерживайтесь принципа стека даже если на ваш взгляд не принципиально, в какой последовательности следует выполнить шаги назад. | |
| Принцип стека можно подсмотреть во многих ситуаицях. Конструирование и уничтожение членов класса происходит по принципу стека. Конструирование и уничтожение локальных объектов — по принципу стека. Конструирование и уничтожение глобальных объектов в пределах единицы трансляции — тоже по признаку стека. Конструирование и уничтожение объектов по этажам иерархии — да, и здесь используется этот принцип. И это не случайно — принцип стека наиболее естественен для инициализации и освобождения ресурсов с точки зрения вложенной функциональности. | |
| | |
| Исключения | |
| В некоторых ситуациях удобно объявить конструктор закрытым, а создание объектов поручить статической или дружественной функции. Иногда такой подход окажется удобнее. Однако не забывайте, что подобный подход весьма специфичен, и на его использование должны быть действительно веские основания. | |