База данных Фасад, чтобы обернуть наши существующие запросы?
У нас есть очень большое приложение, написанное на C ++ с использованием среды MFC (миллионы строк кода). Не нужно говорить, что это устаревшая система, но она также поддерживается и обновляется. В этом приложении не хватает архитектуры. Например, у нас есть много классов, которые выполняют запросы непосредственно в базе данных, что создает большие трудности для модульного тестирования.
Я прочитал книгу Эффективная работа с устаревшим кодом и один из самых прежде всего важно создать некоторую архитектуру, чтобы мы могли отделить графический интерфейс от логики и базы данных.
Моя идея идти к этому - создать нечто вроде фасада базы данных. Для этого будет 2 цели:
- Инкапсулировать все вызовы в базу данных за этим фасадом.
- Уметь проверять фасад в пакетном режиме для быстрого обнаружения ошибок в SQL.
Сам фасад базы данных будет реализовывать интерфейс IDatabaseXXXX, поэтому его можно легко высмеять в модульных тестах. Вторая цель будет состоять в том, чтобы иметь возможность запускать все функции на фасаде в пакетном режиме, чтобы проверить, есть ли ошибки в SQL-запросах. Я не считаю их модульными тестами и выполняю их только один раз в день.
Моя основная забота об этом заключается в том, что я не знаю, существует ли существующая структура или библиотека, чтобы позаботиться об этой абстракции. Насколько мне известно, на других платформах, таких как .NET, есть некоторые, но, похоже, для C ++ или MFC вариантов не так много. Как я уже сказал, приложение очень велико, и изменения будут выполняться медленно, в основном, когда к программному обеспечению добавляются новые запросы.
Я думаю, что неплохо добавить, что у нас также есть множество наборов записей (по одному для почти каждого объекта). На данный момент я не знаю, как с ними бороться, поэтому я сохранил их на стороне и решил разобраться с регулярными SQL-запросами. Но если у вас есть предложения по работе с наборами записей, я буду рад их услышать.
Итак, мой главный вопрос: стоит ли целая идея фасад базы данных? Есть ли библиотека рамок, которые помогут мне в этом приключении? Если есть программисты на C ++ /MFC, как вы относитесь к абстракции запроса к базе данных?
Спасибо!
ИЗМЕНИТЬ
Некоторые люди в чате предлагают посмотреть шаблон репозитория, который я знал из мира MVC 3. Любое предложение или учебник о шаблоне репозитория на C ++? Большинство из того, что я нашел, находится в мире .NET.
2 ответа
Как и ваши обновления, шаблон репозитория сможет помочь отделить вызовы базы данных от вашего пользовательского интерфейса. И замена вызовов базы данных вызовами на интерфейс базы данных, безусловно, является улучшением. Шаблон репозитория позволит вам дополнительно абстрагировать извлечение данных во что-то значимое для приложения. UserRepository, ThingRepository и т. Д.
http://msdn.microsoft.com/en-us/library/ff649690.aspx
В качестве подхода к реализации этой архитектуры. Когда мне нужно сделать код, который можно тестировать для рефакторинга, первый тест всегда самый сложный. Найдите хорошо понятую часть кода, которую вы хотите протестировать, и сделайте этот класс /метод проверяемым. После этого настойчивость и терпение позволят вам выполнить задачу по внедрению новой архитектуры в устаревшую систему.
Я прочитал книгу «Эффективная работа с устаревшим кодом» и один из самых важных прежде всего, нужно создать некоторую архитектуру, чтобы мы могли отделить графический интерфейс от логики и базы данных.
Вот как читать устаревший код, а затем переписывать систему на новой платформе. Но вы не можете честно ожидать, что на самом деле это сделаете в самом устаревшем коде. Добавление архитектуры к устаревшему коду после факта ... это просто не кажется возможным в реальном мире.