8 Симметрия и стек

      Комментарии к записи 8 Симметрия и стек отключены

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 4 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #3583

    Общий смысл

    Придерживайтесь симметрии и принципа стека в своих действиях — это хорошая привычка, которая придает разрабатываемой системе строгость, дисциплинирует и оберегает от совершения ряда ошибок.

    Симметрия

    Если вы вступаете во владение ресурсом в конструкторе, освобождайте этот ресурс в деструкторе. Если у вас есть функция Open, напишите функцию Close. Если вы написали отправку в поток, напишите и чтение из потока. Если некоторая система вступила во владение некоторым ресурсом, то пусть эта же система и будет ответственной за его освобождение. И вообще, если вы сделали определенным образом шаг вперед, делайте зеркально противоположным (но в то же время аналогичным по своей сути) образом шаг назад.

    Плохо, если для чтения используется функция-член, а для записи — поток ввода-вывода. Плохо, если инициализация происходит в конструкторе, а освобождение — в специальной функции. Плохо, если система, вступая во владение некоторым ресурсом и выдавая вам дескриптор, не контролирует его дальнейшую судьбу и оставляет обязанность освободить этот ресурс за вами.

    Стек

    Шаги относительно вложенной функциональности старайтесь осуществлять по принципу стека. Открыли поток, открыли файл, закрыли файл, закрыли поток. Начали языковую транзакцию, начали SQL-транзакцию, завершили SQL-транзакцию, завершили языковую транзакцию. В случае исключения откатили SQL-транзакцию, затем откатили языковую транзакцию. Придерживайтесь принципа стека даже если на ваш взгляд не принципиально, в какой последовательности следует выполнить шаги назад.

    Принцип стека можно подсмотреть во многих ситуациях. Конструирование и уничтожение членов класса происходит по принципу стека. Конструирование и уничтожение локальных объектов — по принципу стека. Конструирование и уничтожение глобальных объектов в пределах единицы трансляции — тоже по признаку стека. Конструирование и уничтожение объектов по этажам иерархии — да, и здесь используется этот принцип. И это не случайно — принцип стека наиболее естественен для инициализации и освобождения ресурсов с точки зрения вложенной функциональности.

    Исключения

    В некоторых ситуациях удобно объявить конструктор закрытым, а создание объектов поручить статической или дружественной функции. Иногда такой подход окажется удобнее. Однако не забывайте, что подобный подход весьма специфичен, и на его использование должны быть действительно веские основания.

Для ответа в этой теме необходимо авторизоваться.