2017-07-18 2 views
0

Ich habe eine Klasse, die ziemlich groß ist, und ich will wichtige Teile spalten, aber ich weiß nicht, ob mein Code-DesignKlassen, die sich Code-Design Referenz

class Something 
{ 
public: 
    void draw() 
    { 
     m_drawer.draw(); 
    } 

private: 
    SomethingDrawer m_drawer; 
} 

class SomethingDrawer 
{ 
public: 
    SomethingDrawer(Something* something) : 
     m_something(something) 
    {} 

    void draw() 
    { 
     drawSomethingObject(); 
     drawSomeOtherObject(); 
    } 

private: 
    void drawSomethingObject(); 
    void drawSomeOtherObject(); 

    Something* m_something; 
} 

bevorzugt wird, oder sollte ich nur passieren die Objekte, die zum Zeichnen auf drawSomethingObject/drawSomeOtherObject benötigt werden, ohne dass SomethingDrawer einen Verweis auf Something benötigt.

Antwort

1

Während die "bevorzugte" Methode ist eine Frage der Meinung und kann auf die Details von dem, was Sie erreichen wollen, die single responsibility principle schlägt vor, dass es besser sein sollte, nicht Ihre Schublade als Instanz Attribut und stattdessen zu wickeln Übergeben Sie Ihre "Something" -Objekte nach Bedarf an ein "Drawer". Wenn die Verantwortung eines "Etwas" darin besteht, Daten über etwas zu speichern, dann ist es nicht notwendig, ihm die zusätzliche Verantwortung zu übertragen, diese Daten in irgendeiner Form zu übertragen.

Tatsächlich nutzt das Entwurfsmuster Model-View-Controller (MVC) genau diese Unterscheidung aus. Wenn "Etwas" Ihre Daten enthält (ist das Modell) und Sie später entscheiden, dass Sie mehrere Möglichkeiten zum Zeichnen (Anzeigen) dieser Daten haben möchten, dann wird Ihnen durch die Vermeidung der Kopplung zwischen Zeichnungs- und Datenhaltungsklassen eine größere Flexibilität gegeben.

Eine andere Sache, die hier in Betracht gezogen werden sollte, ist, dass, wenn die Schublade nicht auf bestimmte "Something" -Daten halten muss (was schon ein bisschen Code-Geruch wäre), Sie wahrscheinlich nur eine Schublade erstellen und übergeben können "Somethings" wie benötigt, anstatt für jede Something-Instanz eine zu erstellen.

Verwandte Themen