Diciamo che possiedo un ristorante che fa una torta. Voglio tagliare questa torta in base all'input
analizzato dal file. Questo contiene la chiave per le informazioni su come tagliare la torta. Io uso
CircleDividerParser class
per analizzare file.txt.
formato di file:
- pie_cuttin_style_name = è la chiave per la ricerca indietro
- raggio = raggio o torta
- x = coordinata x del centro della torta
- y = coordinata y del centro della torta
- angle_type = l'angolo può essere in gradi o in radianti
- angle_value = valore dell'angolo che può essere radiante o gradi
- direction = in senso orario o antiorario
- from_x = x punto in circolo da dove l'angolo è misurato
- from_y = y punto in circonferenza da dove si trova l'angolo misurata
ad esempio: file.txt
cutting_pattern_1,5,1,2,degree,40,anti-clock,6,2
....
..
Allora ho una classe per fare la logica di analisi:
Class CircleDividerParser{
// does the parsing logic to capture the values
void Dowork(filename){
std::ifstream file_stream.open(filename);
std::string line;
while(std::getline(file_stream, line){
std::string str;
std::stringstream ss(line);
int i = 0;
while(std::getline(ss, str, ',')){
holder[i] = str;
i++;
}
pcc.add_pie_cutting_info(holder);
}
}
private:
std::array<std::string, 9> holder;
PieCutterCreator pcc;
};
// Questa classe esegue la creazione di PieCuttingInfo in base alla matrice di stringa fornita da CicleDividerParser
class PieCutterCreator{
public:
void add_pie_cutting_info(std::array<std::string, 9> arr){
PieCuttingInfo obj;
obj.AddPieCuttingStyleName(arr[0]);
obj.AddRadius(arr[1]);
...
..
}
PieCuttingInfo GetPieCuttingInfo(const std::string& name_to_find);
std::vector<PieCuttingInfo> GetAllPieCuttingInfo() { return collect;}
private:
std::vector<PieCuttingInfo> collect;
};
class PieCuttingInfo{
class enum angle_type {Degree, Radian};
public:
PieCuttingInfo()=default;
void AddPieCuttingStyleName(const std::string& name){ pie_cutting_style_name = name;}
void AddRaius(const std::string& r) {radius = r;}
void AddAngleType(const std::string& at) {
if(at == "degree"){
angle_value = angle_type::Degree;
}else if(at == "radian"){
angle_value = angle_type::Radian;
}else {// error}
}
...
private:
std::string pie_cutting_style_name;
std::string radius;// radius or pie
std::string x;// x-coordinate of pie center
std::string y;// y-coordinate of pie center
std::string angle_type; angle can be either degree or radian
std::string angle_value; value of angle that could be radian or degree
std::string direction; clock wise or anti-clockwise angle
std::string from_x; x point in circle from where the angle is measured
std::string from_y; y point in circle from where the angle is measured
};
class PieCuttingMaching(){
void DoAllThePieCutting(){
save = obj.GetAllPieCuttingInfo();
for(auto& it: save){
// use the info from PieCuttingInfo to do the job
}
}
private:
std::vector<PieCuttingInfo> save;
PieCutterCreator obj;
}
Domande:
- Il design che sto seguendo è corretto o sto creando delle cose compilcated
- È possibile creare una classe PieCuttingInfo anche se tutte le informazioni lo sono non fornito.
- Le variabili della classe PieCuttingInfo devono essere inizializzate durante la sua creazione da passando tutte le variabili contemporaneamente.