Voglio creare una classe con costanti statiche che vengono utilizzate ogni volta che una parte di un'applicazione desidera accedere al database in qualsiasi modo. In questo modo voglio rimuovere tutti i numeri magici e stringhe all'interno del mio codice applicazione, tranne in un posto. Quindi in qualsiasi momento è necessario apportare modifiche al modello di database, tutte le regolazioni devono essere eseguite in un punto o il compilatore trova tutte le altre.
Comunque, questo è quello che ho finora
#include <QObject>
class DatabaseModel : public QObject
{
Q_OBJECT
public:
static const QChar SCHEMA_SEPARATOR() { return '.'; }
static const QString qualifiedTableName(const QString &schema, const QString &table) {
return schema + SCHEMA_SEPARATOR() + table;
}
static const QString SCHEMA_VERSION() { return "0.2"; }
static const QString DATA_SCHEMA() { return "core"; }
static const QString DEFAULT_SCHEMA() { return "public"; }
static const QString LOG_SCHEMA() { return "audit"; }
static const QString UNIT_TABLE() { return "unit"; }
static const QStringList UNIT_TABLE_COLS() {
return QStringList() << "id"
<< "name"
<< "abbreviation";
}
};
Esempio di utilizzo
// get the fully qualified database table name
// result: core.unit
DatabaseModel::qualifiedTableName(DatabaseModel::DATA_SCHEMA(), DatabaseModel::UNIT_TABLE());
// get the database column name
// result: name
DatabaseModel::UNIT_TABLE_COLS().at(1);
Problemi risultanti dal mio punto di vista:
- invocazione di funzione piuttosto lunga
- separazione tra la tabella e le sue colonne
Ho provato alcune costellazioni di classe, ma anche il modo non è felice. Quindi la mia domanda : esiste un approccio semplice e piacevole per accedere ai nomi dei database e al qualificatore per un modello di database complesso?
Sto usando Qt (5.6), PostgreSQL con C ++ . Potrebbe essere possibile descrivere una soluzione in puro C ++ perché non ci dovrebbero essere vantaggi nell'utilizzo della funzionalità di Qt.
Modifica: Inoltre, utilizzo Qt's MVC per accedere al database, ovvero il suo QSqlTableModel
.