Mam do napisania program, który będzie generował raporty PDF. Każdy raport będzie (lub nie- w zależności od wyboru) składać się z kilku sekcji:
- Sekcji tytułowej
- Sekcji pomiarowej kształtu
- Sekcji pomiarowej odległości
- Sekcji pomiarowej płaskości
- Sekcji podsumowania.
Każda z sekcji pomiarowych będzie się składać z kilku identycznych(dla danej sekcji) bloków z różnymi informacjami (liczba powstałych sekcji i bloków może być różna dla każdego raportu, dane te będę otrzymywał w jednej zbiorczej strukturze). Każdą sekcję pomiarową będzie kończyć podsumowanie, a sekcja podsumowania będzie zbiorem wszystkich podsumowań z sekcji pomiarowych.
Mam problem z ułożeniem sobie w głowie szkieletu tego programu.
Wymyśliłem, że zrobię tak:
class FilePDF
{
private:
HPDF_Doc pdf;
std::vector<HPDF_Page> page;
std::vector<TitleSection*> ts;
std::vector<MeasurementDistance*> md;
std::vector<MeasurementShape*> ms;
std::vector<MeasurementFlatness*> mf;
std::vector<Resume*> rm;
private:
FilePDF();
bool createFile(void);
public:
~FilePDF();
bool saveFile(void);
static FilePDF& getInstance(void);
bool createTitleSection(void);
bool createMeasurementSectionShape(void);
bool createMeasurementSectionDistance(void);
bool createMeasurementSectionFlatness(void);
bool createResume(void);
}
class TitleSection{
private:
HPDF_Doc *pdf;
HPDF_Page *page;
public:
bool createTitleBox(void);
TitleSection(HPDF_Doc &pd, HPDF_Page &pa);
};
class MeasurementDistance{
private:
HPDF_Doc *pdf;
HPDF_Page *page;
public:
bool createDistanceBox(void);
MeasurementDistance(HPDF_Doc &pd, HPDF_Page &pa);
};
class MeasurementShape{
private:
HPDF_Doc *pdf;
HPDF_Page *page;
public:
bool createShapeBox(void);
MeasurementShape(HPDF_Doc &pd, HPDF_Page &pa);
};
class MeasurementFlatness{
private:
HPDF_Doc *pdf;
HPDF_Page *page;
public:
bool createFlatnessBox(void);
MeasurementFlatness(HPDF_Doc &pd, HPDF_Page &pa);
};
class Resume {
private:
HPDF_Doc *pdf;
HPDF_Page *page;
public:
bool createResume(void);
Resume(HPDF_Doc &pd, HPDF_Page &pa);
};
//przykładowe wywołanie funkcji createXXX
FilePDF::createMeasurementSectionShape(void) {
for (int j = 0; j < size/3; j++) {
page.push_back(HPDF_AddPage(pdf));
for(int i = 0; i < 3; i++) {
ts.push_back(new MeasurementShape(pdf, page[page.size()-1]));
ts[ts.size() - 1]->createShapeBox();
}
}
rm.push_back(new Resume(pdf, page[page.size()-1]));
}
Stworzyłem klasę nadrzędną FilePDF
, która tworzy mi dokument (wykorzystałem wzorzec singleton). Klasa ta definiuje metody to tworzenia poszczególnych sekcji createTitleSection()
, createMeasurementSectionShape()
, createMeasurementSectionDistance()
, createMeasurementSectionFlatness()
,createResume()
. W metodach tych tworzę dynamicznie obiekty klas podrzędnych, odpowiadających za tworzenie bloków (kompozycja). Na razie nie zadeklarowałem jeszcze parametrów funkcji, dlatego wszędzie jest void
. Czy to jest dobry kierunek i dobry tok rozumowania? Nie mogę sobie wyobrazić jak inaczej podjeść do problemu. Słabą stroną mojego rozwiązanie jest to, że w konstruktorach klas podrzędnych muszę przekazywać parametry odnoszące się do całego dokumentu.(pdf
, page
, font
...).