Семантика констант для доступа к базе данных или файловой системе

Я регулярно использую const при работе со структурами данных в памяти и сохраняю свой код const-правильным, но я не уверен, как const должны применяться к более сложным объектам, таким как следующие:

  • объекты, представляющие подключения к удаленным системам
  • объекты, поддерживаемые базой данных (которые могут загружать части из базы данных по запросу)
  • объекты, поддерживаемые на диске дерево каталогов (с доступом к дереву каталогов, управляемым отдельной иерархией объектов)

Что должны означать методы const для таких объектов? Я могу придумать пару возможностей:

  • "strict" const - методы, которые не изменяют никакое состояние в памяти, являются константными. Однако это могло бы нарушить инкапсуляцию, поскольку для этого необходимо, чтобы вызывающие абоненты знали, какие методы изменяют состояние соединения, а какие - нет.
  • "logic" const - методы, которые не изменяют логическое состояние объекта, являются константными. Однако это потенциально может потребовать пометки большого количества переменных состояния и кеширования как изменяемых . Хотя я понимаю, что mutable предназначен для этого, его использование похоже на взлом.Кроме того, учитывая, что const означает «Я обещаю не изменять это», кажется неправильным применять его, когда методы могут изменять состояние соединения странным и замечательным образом (при условии, что они поддерживают инкапсуляцию), результаты кешируются как сколько бы они ни захотели, генерируют исключения в случае сбоя соединения и т. д.
  • Нет const - В свете предыдущих проблем, неужели const просто не имеет большого значения для более сложных объектов?

Какой подход наиболее полезен? Какой из них наиболее распространен?

7
задан Josh Kelley 11 January 2012 в 14:50
поделиться