Designfrage



  • Ich habe eine Klasse Graphics, welche alles nötige hat um auf dem Bildschirm rumzuzeichnen. Und eine weitere Klasse Bitmap, welche eine grafische Resource verwaltet.

    Ist es jetzt sinnvoller der Graphics die Daten der Bitmap zu geben, damit die Graphics die Bitmap zeichnen kann oder der Bitmap die nötigen Informationen zu geben, damit sie sich selbst zeichnen kann?

    Quasi was ist besser:

    instBitmap.Draw(instGraphics.getInfos());
    

    oder

    instGraphics.DrawBitmap(instBitmap.getInfos());
    

    Eine Erklärung warum eins dem anderen vorzuziehen ist wäre auch gut 🙂 oder eine noch bessere alternative.



  • Generell finde ich die 2. Variante schöner, weil es die Aufgabe deiner
    Graphics-Klasse ist das Objekt darzustellen.
    Du sagst ja auch nicht einer Linie: Zeichne dich...

    Wenn man jetzt allerdings z.B. verschiedene Bildtypen hat und die
    Grafik-Klasse performantere (native) Funktionen verwenden kann, würde ich
    persönlich eventuell vom Graphics-Objekt an das Bitmap delegieren und
    von dort wieder zurück (mit dem genauen Typ als Parameter) um die performante
    Implementierung zu verwenden.

    So bleibt meine favorisierte Variante als Funktion der Graphics-Klasse
    unabhängig von genauen Bildtyp mit der Möglichkeit die für den Bildtyp
    optimierte zu nutzen.

    EDIT: Etwa so:

    class Graphic{
    public:
    	void draw(const Image& image){
    		image.drawTo(*this);
    	}
    
    	void draw(const PNG& png){
    		// fast native code
    	}
    
    	void draw(const JPG& jpg){
    		// fast native code
    	}
    
    	// function for images without native code support
    	void drawPixelBased(const Image& image){
    		// slow code, reading every pixel separately
    	}
    };
    
    class Image{
    public:
    	virtual void drawTo(Graphic& graphic) const = 0;
    };
    
    class PNG : public Image{
    public:
    	virtual void drawTo(Graphic& graphic) const{
    		graphic.draw(*this);
    	}
    };
    

    Der Code soll nur das Prinzip darstellen -> Nicht kompilierfähig (z.B. wegen fehlenden forward declarations)

    Gruß,
    XSpille



  • Dependency Inversion. Beide hängen von einer Abstraktion ab.
    Wenn ich das Problem richtig verstanden habe:

    class DrawContext
    {
      // Schnittstelle zum malen
      virtual void Line(von, nach, Color) = 0;
    };
    
    class Graphics
    {
    public:
      virtual void Draw(DrawContext&) = 0;
    };
    
    class Line : public Graphics {};
    
    class Screen : public DrawContext 
    {
      // Implementiert Schnittstelle zum malen auf dem Bildschirm
    };
    
    class Bitmap : public DrawContext 
    {
      // Implementiert Schnittstelle zum malen in ein Bitmap
    };
    
    int main()
    {
      Line l;
      Bitmap bmp;
      l.Draw(bmp);
      l.Draw(Screen->Instance());
      return 0;
    }
    

    edit: Glaub ich habs doch falsch verstanden. Bitmap soll sich in Graphics malen. Ändert aber nichts am Prinzip.


Anmelden zum Antworten