Дизайн класса C ++ из схемы базы данных - PullRequest
3 голосов
/ 17 сентября 2008

Я пишу Perl-скрипт для анализа схемы базы данных MySQL и создания классов C ++, когда это необходимо. Мой вопрос довольно простой, но мы кое-что, чего я на самом деле раньше не делал и не знаю общей практики. Любой объект любого из созданных классов должен иметь методы «get» для заполнения этой информации. Так что мои вопросы двоякие:

  1. Имеет ли смысл вызывать все методы get в конструкторе, чтобы объект сразу имел данные? В некоторых классах их будет много, так что при необходимости может иметь смысл. У меня сейчас два строителя. Тот, который заполняет данные, а другой - нет.
  2. Должен ли я иметь другой метод "get", который получает копию данных объекта, а не копию db.

Я мог бы пойти в обе стороны на # 1, и я склоняюсь к да на # 2. Любые советы, указатели будут высоко оценены.

Ответы [ 5 ]

2 голосов
/ 17 сентября 2008

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

Кроме того, в общем, ваши методы get * должны быть объявлены как const, то есть они не изменяют базовый объект, поэтому их выход в базу данных для заполнения объекта может нарушить это (что вы могли бы разрешить, сделав переменные-члены изменяемые, но это, в основном, лишает цель const).

Чтобы разбить вещи на конкретные шаги, я бы порекомендовал:

  • Пусть ваш конструктор вызовет отдельный метод init (), который запрашивает базу данных и заполняет элементы данных вашего объекта.
  • Объявите ваши методы get * как const, и просто попросите их вернуть элементы данных.
1 голос
/ 17 сентября 2008

Сначала поймите, что вы заново изобретаете колесо здесь. Существует несколько приличных библиотек объектно-реляционного отображения для доступа к базам данных практически на каждом языке. Для C / C ++ вы можете посмотреть:

http://trac.butterfat.net/public/StactiveRecord
http://debea.net/trac

Хорошо, с этим, возможно, вы захотите создать статический метод в вашем классе, который называется find или search, который является фабрикой для построения объектов и выбора их из базы данных:

Artist MJ = Artist::Find("Michael Jackson");
MJ->set("relevant", "no");
MJ->save();

Обратите внимание на метод save, который затем берет измененный объект и сохраняет его обратно в базу данных. Если вы действительно хотите создать новую запись, вы должны использовать метод new, который будет создавать пустой объект:

Artist StackOverflow = Artist->new();
StackOverflow->set("relevant", "yes");
StackOverflow->save();

Обратите внимание, что методы set и get здесь просто устанавливают и получают значения из объекта, а не из базы данных. Для фактического хранения элементов в базе данных вам необходимо использовать статический метод Find или метод save объекта.

0 голосов
/ 18 сентября 2008

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

Не знаю, сколько таблиц мы говорим, так что это может взорвать сферу вашего проекта.

0 голосов
/ 17 сентября 2008

Я бы не советовал использовать ваши методы get в базе данных, если это абсолютно не необходимо для вашей конкретной проблемы. Это создает гораздо больше мест, в которых что-то может пойти не так, и, возможно, много ненужных операций чтения в вашей БД, и может непреднамеренно связать ваши объекты со специфичными для БД функциями, теряя многие преимущества многоуровневой архитектуры. Что касается модели вашего домена, база данных не существует.

edit - это для # 2 (очевидно). Для № 1 я бы сказал, нет, по многим из тех же причин.

0 голосов
/ 17 сентября 2008

Существуют инструменты, которые конвертируют БД в Java (и, возможно, другие языки). рассмотрите возможность использования одного из них и преобразования его в c ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...