C++: Ska man endast skapa klasser om man tänker objektorienterat?
Jag har länge kört C och jag gillar språket. Det är enkelt, minimalt, men man får ändå jobbet gjort. Det tar dock lång tid att programmera, men kvaliteten blir hög på koden.
Nu har jag börjat med C++ för jag ska göra skrivbordsapplikationer och mobila applikationer igenom QT. Jag stöp direkt. Trots detta så är jag väldigt van att skriva Java kod då jag använder Spring Boot väldigt mycket för servrar.
Men det jag märkte när jag använde C++ är hur krångligt det var att få till en fin projektstruktur. Man skulle ha en klass för allt.
Jag är väldigt noga med att ett projekt ska ha en tydlig och logisk struktur, annars blir det skit på slutet.
Så till att börja med så vill jag ställa er fråga:
Om ni använder klasser som enbart funktioner, skulle ni då gå över till funktionsprogrammering då?
Exempelvis detta är en databasklass i C++.
Database_handling::Database_handling(){}
Database_handling::Database_handling(QString SQL){
this->qSqlDatabase = QSqlDatabase::addDatabase(SQL);
if(!this->qSqlDatabase.isDriverAvailable(SQL)){
QMessageBox::information(nullptr, "Driver", "Driver " + SQL + " is missing", QMessageBox::Ok);
}
}
bool Database_handling::connect_SQL(const QString& hostname, const int port, const QString& schema_name, const QString& table_name, const QString& username, const QString& password){
/* Set connections */
this->qSqlDatabase.setHostName(hostname);
this->qSqlDatabase.setPort(port);
this->qSqlDatabase.setDatabaseName(schema_name);
this->qSqlDatabase.setUserName(username);
this->qSqlDatabase.setPassword(password);
/* Open the database */
if(this->qSqlDatabase.open()){
/* Create table if not exist */
create_table(table_name);
return true;
}
return false;
}
Men jag skulle enkelt kunna skriva om ovan till detta nedan. Så vad föredrar ni om ni endast ska använda klasser som en samling av funktioner? Ska man använda klasser om man verkligen ska använda objekt t.ex. bilar, eller ska man använda funktionsprogrammering?
Jag känner att funktionsprogrammering är den bästa metodiken här då static QSqlDatabase qSqlDatabase; är redan privat och jag kommer inte kunna komma åt den, om jag inte skapar en QSqlDatabase get_qSqlDatabase() [return qSqlDatabase;} funktion.
Ett problem jag ser med koden ovan är att man måste ständigt tänka "Dependency Injection", medan, det behöver man inte i denna kod nedan. Då är det bara anropa, för fälten är redan statiska.
static QSqlDatabase qSqlDatabase;
void create_SQL_database(QString SQL){
qSqlDatabase = QSqlDatabase::addDatabase(SQL);
if(!qSqlDatabase.isDriverAvailable(SQL)){
QMessageBox::information(nullptr, "Driver", "Driver " + SQL + " is missing", QMessageBox::Ok);
}
}
bool connect_SQL_database(const QString& hostname, const int port, const QString& schema_name, const QString& table_name, const QString& username, const QString& password){
/* Set connections */
qSqlDatabase.setHostName(hostname);
qSqlDatabase.setPort(port);
qSqlDatabase.setDatabaseName(schema_name);
qSqlDatabase.setUserName(username);
qSqlDatabase.setPassword(password);
/* Open the database */
if(qSqlDatabase.open()){
/* Create table if not exist */
create_table(table_name);
return true;
}
return false;
}