Daten und Funktionen trennen



  • Sagen wir ich habe ein struct:

    struct Car
    {
        std::string name;
        std::string hersteller;
        ....
    };
    

    Normalerweise schreibe ich jetzt einer Manager Klasse in der ich alle Funktionen wie speichern, laden, ausgeben und löschen implementiere.

    Ich habe mal gelesen dass das nicht die beste Möglichkeit ist oder sogar ein schlechter stil ?



  • Normalerweise hast du ein Objekt aus der realen Welt (oder der fachlichen Welt in der du dich bewegst), was du mit Objektorientierter Programmierung nachbilden willst.
    D.h. du guckst wie das Objekt aufgebaut ist und wodraus es besteht.

    In deinem Fall ist das Auto ein Objekt und das hat einen Hersteller und einen Namen (soll mal grad reichen).

    Nun soll dein Objekt aber auch etwas können, je nach Anwendungsfall sind das verschiedene Dinge. Du fragst aber ja grade explizit nach Speichern, Laden und Ausgeben (löschen ist unklug*), aber das sind alles keine guten Beispiele. Ich nehme also nur mal grad die ausgeben Methode im folgenden Beispiel

    Okay, dann sorgst du einfach dafür, dass dein Objekt eben diese Dinge kann, das könnte dann so aussehen:

    class Car
    {
    //private: // ist implizit schon da
    	std::string name;
    	std::string manufacturer;
    
    public:
    	Car(std::string const& name = "911", std::string const& manufacturer = "Audi");
    
    	void print(std::ostream & os) const
    	{
    		os << manufacturer << " " << name;
    	}
    }
    

    Das Speichern, Laden oder Löschen ist ein Sinn, der nicht dem Auto obliegt, sondern dem, der es verwaltet, z.B. einem Autobesitzer. Der steckt sein Auto z.B. in die garage (speichern) oder holt es heraus (lädt es wieder) oder verkauft/verschrottet (löscht) es, das macht nicht das Auto.



  • @Skym0sh0: finde ich jetzt etwas weit hergeholt und so einfach ist die Frage auch nicht. Eine Klasse Auto, die man in die Garage stellen kann usw. macht praktisch keinen Sinn und die wird wohl kaum von ihrem Besitzer verwaltet. Ich könnte mir eher andere Anwendungsfälle vorstellen, z.B. eine Werkstatt, ein Zulieferer, Fuhrparkverwaltung, PDM System usw. Und da braucht man schon Funktionen zum Speichern, Laden, Löschen usw. Ein schlechtes Beispiel ist es also nicht, und die Frage wie man das sauber implementiert ist auch nicht so einfach.



  • Deine Antwort ist aber auch nicht mehr als eine Verwalter Klasse( Manager ) zu erstellen oder?

    Wenn das Beispiel schlecht ist wie wäre es mit einem Adressbuch:

    struct Person
    {
        std::string vorname;
        std::string nachname;
        std::string email;
        ...
    }
    


  • Du kannst ja ne Funktion machen

    loadPersonFromFile(const std::string& filename, Person& person)
    

    und eben je nachdem, mit welchem Format du das abspeicherst, ließt du die Werte und weist sie auf die einzelnen fields zu. Is ja alles public beim struct



  • Mechanics schrieb:

    @Skym0sh0: finde ich jetzt etwas weit hergeholt und so einfach ist die Frage auch nicht. Eine Klasse Auto, die man in die Garage stellen kann usw. macht praktisch keinen Sinn und die wird wohl kaum von ihrem Besitzer verwaltet. Ich könnte mir eher andere Anwendungsfälle vorstellen, z.B. eine Werkstatt, ein Zulieferer, Fuhrparkverwaltung, PDM System usw. Und da braucht man schon Funktionen zum Speichern, Laden, Löschen usw. Ein schlechtes Beispiel ist es also nicht, und die Frage wie man das sauber implementiert ist auch nicht so einfach.

    Ja, es kommt halt ganz drauf an. Es kommt komplett drauf an, was der TE vorhat, denn seine Frage ist alles andere als spezifiziert. Sie ist sehr schwammig und ungenau


Log in to reply