Hur tycker ni att man ska skriva ett bibliotek i OOP? Språket är C++

Permalänk

Hur tycker ni att man ska skriva ett bibliotek i OOP? Språket är C++

wxWidgets som jag använder, har olika bibliotek tillgängliga ute på SourceForge och GitHub...men enligt mig känns dom mest dåligt skriva. Exempelvis wxMathPlot med sina 4000 rader spagettikod...känns inte lockande.

Så jag tänkte skapa eget bibliotek! Men jag vill diskutera strukturen på den.
Mitt mål är att om jag har en sådan klass.

#pragma once #include <string> #include <vector> // Here the plot type enumeration must be placed typedef enum { WXPLOT_TYPE_LINE_PLOT, }WXPLOT_TYPE; // This class is the general class for all types of plots class wxPlot { private: // General plot information unsigned int plotWidth; unsigned int plotHeight; unsigned int fontSize; std::string title; std::string xLabel; std::string yLabel; std::vector<std::string> legend; // Flags bool gridOn; bool legendOn; bool xLabelOn; bool yLabelOn; bool titleOn; public: // Constructor wxPlot(WXPLOT_TYPE wxPlotType, unsigned int plotWidth = 100, unsigned int plotHeight = 100); // Deconstructor ~wxPlot(); // General functions void setPlotWidth(unsigned int plotWidth); void setPlotHeight(unsigned int plotHeight); void setFontSize(unsigned int fontSize); void setGridOn(bool gridOn); void setLegendOn(bool legendOn); void setXLabelOn(bool xLabelOn); void setYLabelOn(bool yLabelOn); void setTitleOn(bool titleOn); void setTitle(std::string& title); void setXlabel(std::string& xLabel); void setYlabel(std::string& yLabel); void setLegend(std::vector<std::string>& legend); // This function must be called to draw the plot void drawNow(); };

När jag anropar konstruktören wxPlot så ska jag bestämma vad för typ av plot t.ex line eller bar eller annat.
Frågeställning:

Min tanke är att jag ska använda enumereringen för styra vilken plottyp det ska vara.
Ska jag använda mig av polyformism här? Eller tycker ni att jag ska använda mig av funktionspekare eller liknande för att sätta adresser till fält-funktioner som man sedan anropar?

Men vi säger om det är olika funktioner på bar och line då för att sätta data?

Kanske man ska använda sig av templates här?
Beroende på vilken typ av klass man sätter, så kommer datan att tolkas annolunda beroende på plottyp.
Om man har en line-plot så kommer första dataraden tolkas som X-axel, andra dataraden kommer tolkas som Y-axel.
Men är det bar-plot, då kommer varje datarad i dataList tolkas som Y-axel endast. Jag bara stormar lite med idéer.

public: void setData(dataClass<?> dataList);

Eller ska man vara lite mera tydlig i sin C++ kod och skriva utan templates?

public: void setPlotData(std::vector<std::vector<float>> plotData);

Mål:

  • Clean Code™

  • Senaste C++23 standard

  • Matlab-lik

  • Det ska finnas ett mönster i koden, så det blir enkelt för andra att lägga till sin egen plot

Permalänk
Medlem

Hade jag gjort det där i ett språk jag kan, inte C++, så hade jag:

Använt arv.

Skippat enumen.

Protected, inte private, på lämpliga ställen.

Använt standardbibliotekets klass/struct för tvådimensionell koordinat.

Använt standardbibliotekets klass för sorterbar samling objekt.

Kanske eller kanske inte valt att ha en abstrakt klass var som bas för de olika typerna av data man kan tänka sig (tänk bar, pie, line som exempel), ovanpå den faktiska (rimligen abstrakta) basklassen du redan skissat på.