2010-03-20 4 views
1

В нашей компании один из основных классов C++ (указатель на подключение к базе данных) реализован как указатель подсчета ссылок. Чтобы быть ясным, объекты не являются самими соединениями DB, а указателями на объект соединения с БД.Зачем использовать объект указателя DB-соединения в качестве указателя подсчета ссылок? (C++)

Библиотека очень старая, и никто, кто ее проектировал, больше не существует.

До сих пор ничтожное я, ни какие-либо эксперты C++ в компании, о которой я просил, придумали вескую причину для , почему этот конкретный дизайн был выбран. Есть идеи?

Вводит некоторые проблемы (частично из-за использования ужасной ссылки указателя), и я пытаюсь понять, действительно ли этот проект имеет некоторые глубокие основные причины?

В настоящее время шаблон использования выглядит так, что объект-указатель соединения DB возвращается классом диспетчера соединений DB, и несколько неясно, были ли разработаны указатели соединений DB независимо от диспетчера соединений DB.

+0

Просьба уточнить (я все еще не понимаю) - указатель на подсчет указателя на объект соединения с БД (имеет смысл) или указатель на указатель ссылки на необработанный указатель на объект соединения с БД (возможно, сумасшедший)? – peterchen

+0

Основываясь на моем чтении кода, это последнее, но я всего лишь на 90% уверен. Это очень запутанный код без комментариев и «самодокументирование» не является одним из его выделенных качеств - и мой опыт на C++ не настолько глубок, особенно с шаблонами :) – DVK

ответ

2

Возможно, это ошибка. Не смотря на код, вы не можете точно знать, но качество реализации указателя-указателя-указателя наводит на размышления. Плохой дизайн, особенно в области управления ресурсами, не является неслыханным в сообществе C++ </bitter sarcasm>.

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

Но если вы правильно поняли, у вас нет единого объекта подключения к базе данных с набором указательных указателей, указывающих на него. Скорее, у вас есть объект подключения к базе данных, коллекция обычных указателей на него и коллекция refcounted указателей этим указателям. Это безумие, и почти наверняка результат путаного мышления со стороны оригинальных разработчиков. Альтернативой является то, что это был акт преднамеренного зла, например. для обеспечения безопасности работы. Если это так, они, должно быть, потерпели неудачу, так как никто из преступников все еще не работает для вашей компании.

+0

Последнее предположение верно, хотя я бы пошел «никогда не приписывайте злобу ...» :) – DVK