| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Вопрос по ООП |
| Автор: DrunkPacifist 18.8.2013, 10:33 | ||||||
| Здравствуйте. Пожалуйста, помогите с оформлением класса, обеспечивающего доступ к БД. Дело в том, что у меня не очень богатый опыт работы с ООП в Delphi. Есть программа, которая должна работать с базами данных через UniDAC (или ADO, не суть важно), при этом сами базы могут отличаться - это может быть как SQL Server, так и Oracle, так и любая другая. Само собой, это подразумевает наличие специфических для каждой БД особенностей и запросов - например, для получения списка всех таблиц в базе данных SQL Server предполагается использовать, например, 'EXEC sp_databases', который естественно не будет работать с Oracle. На мой взгляд хорошим решением было бы создание класса, в котором хранятся все методы работы с базой данных, а при его создании в конструкторе Create указывать тип БД (SQLServer или Oracle)
и чтобы в зависимости от этого параметра при последующем выполнении, скажем, функции, которая бы отображала список всех баз данных на сервере
выполнялась функция, соответствующая текущему типу БД, т.е. GetServerStructure заменялась бы на функции GetOracleStructure или GetSQLServerStructure, содержащиеся в том же классе. Вопрос - можно ли это реализовать и как именно? Заранее благодарен! P.S. Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими, и при создании экземпляра из главной формы выбирать тот, который нужен?
P.P.S. Надеюсь я изложил проблему не слишком сумбурно, если что, то поправьте меня |
| Автор: Poseidon 18.8.2013, 12:02 |
| Заведи поле у своего класса. К примеру FDbProviderName. В конструкторе присваевай этому полю значение AProvider. В GetServerStructure проверяй значение FDbProviderName и в соответствии с ним выполняй или GetOracleStructure, или GetSQLServetStructure. Это самый простой вариант. Можно сделать с наследниками и перекрытием методов, но это будет более трудозатратно. Нужно детально оценить, а стоит ли игра свеч? Для данной озвученной задачи я бы не стал так делать. Но если где-то там "за кулисами" прячется огромная работа, то может и стоит сделать класс-родитель и два наследника. |
| Автор: Akella 18.8.2013, 23:40 |
| Я думаю, что не нужно писать свой лисапед, а использовать UniDAC. Думаю, что там много уже чего реализовано. |
| Автор: Дмитрий Каруна 6.12.2013, 08:21 |
| Этот подход реализован в ORM фреймворках. Как пример TMS Aurelius. Сурсы можно найти в нете. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Вопрос-по-ООП-id521079636ccc196a57000002#findElement_E7045_52a15ed6ae20156459f7c4cf_0 |