Supponiamo di avere alcuni dati in file CSV come
ObjectName, PropertyA, PropertyB, PropertyC
"Name1", 3, 1, 4
"Name2", 1, 5, 9
"Name3", 2, 6, 5
...
e una domanda tipica a cui vorrei rispondere sarebbe
For which Object is PropertyX maximal?
Ho due approcci per questo e sarei grato per alcuni Input.
Approccio 1
Definisco una classe come
struct Object {
std::String name;
int a;
int b;
int c;
};
Archivia i dati in una classe come
class ObjectCollection {
std::vector<Object> collection;
}
E fornire due funzioni
size_t ObjectCollection::getMaxIndexOfA()
size_t ObjectCollection::getMaxIndexOfB()
size_t ObjectCollection::getMaxIndexOfC()
Ora queste funzioni sarebbero essenzialmente uguali e assomigliano a
size_t maxIndex = -1;
int max = std::numeric_limits<int>::min();
for (size_t i = 0; i < collection.size(); ++i) {
if (collection[i].a > max) {
maxIndex = i;
max = collection[i].a;
}
}
return maxIndex;
Mi dà fastidio che dovrei scrivere e mantenere lo stesso codice due volte.
Approccio 2
Archivia i dati in una classe come
class ObjectCollection {
std::vector<String> names;
std::vector<int> a;
std::vector<int> b;
std::vector<int> c;
}
Quindi potrei fornire metodi come
const std::vector<int>& ObjectCollection::getA() const;
const std::vector<int>& ObjectCollection::getB() const;
const std::vector<int>& ObjectCollection::getC() const;
E usa una singola funzione per trovare il massimo che devo chiamare come
getMaxIndex( collection.getA() );
dove size_t getMaxIndex(const std::vector<int>&)
sarebbe essenzialmente uguale all'approccio 1.
Penso di preferire il secondo approccio, ma mi dà fastidio che in questo caso non ci sia una classe che rappresenta un singolo oggetto.
È strano / cattivo design per archiviare i dati come nel secondo approccio? C'è un altro approccio intelligente a cui non ho pensato?
A proposito, sono più interessato alla scelta tra questi due approcci che al fatto che probabilmente dovrei usare std::max_element
per trovare l'indice.