Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вопрос по ООП


Автор: DrunkPacifist 18.8.2013, 10:33
Здравствуйте. Пожалуйста, помогите с оформлением класса, обеспечивающего доступ к БД. Дело в том, что у меня не очень богатый опыт работы с ООП в Delphi.

Есть программа, которая должна работать с базами данных через UniDAC (или ADO, не суть важно), при этом сами базы могут отличаться - это может быть как SQL Server, так и Oracle, так и любая другая. Само собой, это подразумевает наличие специфических для каждой БД особенностей и запросов - например, для получения списка всех таблиц в базе данных SQL Server предполагается использовать, например, 'EXEC sp_databases', который естественно не будет работать с Oracle.

На мой взгляд хорошим решением было бы создание класса, в котором хранятся все методы работы с базой данных, а при его создании в конструкторе Create указывать тип БД (SQLServer или Oracle)
Код

constructor TDBEngine.Create(AProvider : TDBProviderName);

и чтобы в зависимости от этого параметра при последующем выполнении, скажем, функции, которая бы отображала список всех баз данных на сервере
Код

Function TDBEngine.GetServerStructure : TTreeNode;

выполнялась функция, соответствующая текущему типу БД, т.е.
GetServerStructure заменялась бы на функции GetOracleStructure или GetSQLServerStructure, содержащиеся в том же классе.

Вопрос - можно ли это реализовать и как именно? Заранее благодарен!

P.S. Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими, и при создании экземпляра из главной формы выбирать тот, который нужен?
Код

//что-то вроде этого
Case ProviderName of
dbSQLServer : DB := TDBSQLEngine.Create;
dbOracle : DB := TDBOracleEngine.Create;
End;

P.P.S. Надеюсь я изложил проблему не слишком сумбурно, если что, то поправьте меня

Автор: k0rvin 18.8.2013, 10:37
Цитата(DrunkPacifist @  18.8.2013,  10:33 Найти цитируемый пост)
Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими

Возможно и именно так и нужно сделать.

Автор: 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)