Voglio scrivere una classe che offra due sequenze di elementi ai suoi utenti. Il primo (chiamiamolo "primario") è il principale della classe e verrà utilizzato l'80% delle volte. Il secondo (chiamiamolo "secondario") è meno importante, ma deve comunque essere nella stessa classe. La domanda è: quale interfaccia dovrebbe offrire la classe ai suoi utenti?
Guardando lo stile STL, una classe con una singola sequenza di elementi dovrebbe offrire le funzioni begin () e end () per attraversare e funzionare come insert () e cancella () per le modifiche.
Ma come dovrebbe la mia classe offrire la seconda sequenza?
Per ora, ho due idee:
- Esporre i due contenitori all'utente (per quanto riguarda la legge di Demeter ?)
- Fornire il contenitore principale con l'interfaccia STL ed esporre solo il secondo.
Ecco un esempio.
#include <vector>
class A {
public:
std::vector<int>& primary();
std::vector<char>& secondary();
private:
std::vector<int> m_primary;
std::vector<char> m_secondary;
};
class B {
public:
std::vector<int>::iterator begin();
std::vector<int>::iterator end();
std::vector<char>& secondary();
private:
std::vector<int> m_primary;
std::vector<char> m_secondary;
};
// Classes implementation
// ...
int main() {
// --------------------------------------------------
// Case 1
// --------------------------------------------------
A a;
for(auto it = a.primary().begin(); it != a.primary().end(); ++it) {
// ...
}
for(auto it = a.secondary().begin(); it != a.secondary().end(); ++it) {
// ...
}
// --------------------------------------------------
// Case 2
// --------------------------------------------------
B b;
for(auto it = b.begin(); it != b.end(); ++it) {
// ...
}
for(auto it = b.secondary().begin(); it != b.secondary().end(); ++it) {
// ...
}
}
Qual è il modo più c ++ di farlo? È uno dei migliori dell'altro o esiste un'altra soluzione?
Contesto
Questo problema è venuto nel contesto di un esercizio in cui sto scrivendo un semplice framework di accesso al database. Ecco le classi coinvolte nella domanda:
- tabella
- Colonna
- riga
- campo
La classe della tabella consiste in una sequenza di colonne e un'altra sequenza di righe. L'uso principale della tabella è la manipolazione (accesso, aggiunta e rimozione) delle righe.
Più profondo nella gerarchia, una riga è fatta di colonna e campo in modo che un utente possa chiedere il valore (campo) corrispondente a una determinata colonna o nome di colonna. Ogni volta che una colonna viene aggiunta / modificata / rimossa dalla tabella, ogni riga dovrà essere modificata per riflettere la modifica.
Voglio che l'interfaccia sia semplice, estensibile e che combini bene con il codice esistente (come STL o Boost).