Aufbau Projekt | function() const



  • Hallo zusammen,

    ich arbeite seit längerem an einem Projekt und möchte nun nur noch mals sicher gehen. Das Projekt ist im Anhang mal dargestellt. Ich habe darüber mit anderen Programmierern bereits gesprochen, wobei jeder eine eigene Meinung hat. Der Aufbau ist bezüglich Aggregation zu stande gekommen.

    Zu Beginn
    Wie man sieht habe ich drei Hauptklassen (Thermodynamic, Chemistry und Transport). Diese haben Unterklassen. Ich bezieh mich jetzt nur auf die Chemistry, da für die anderen beiden das gleiche gilt.

    In der Chemistry Klasse hatte ich eine Vererbung zu ChemistryData und ChemistryCalc realisiert. Allerdings wurde mir gesagt das es logischer wäre wenn ich eine Aggregation mache (also eine "hat eine" Beziehung aufbaue). Dies ist in meinem Fall auch logischer, da ein Chemistry Objekt eine ChemistryCalc und ChemistryData hat und nicht ist. Somit:

    Chemistry hat ein ChemistryCalc Objekt
    Chemistry hat ein ChemistryData Objekt

    Folgendes ist nicht so logisch:

    Chemistry ist ein ChemistryCalc Objekt
    Chemistry ist ein ChemistryData Objekt

    Dementsprechend habe ich die Vererbung wieder aufgehoben und eine "hat ein" Beziehung verwendet (Implementierung als privates Objekt). Nun die erste Frage. Hat das so seine Richtigkeit? Zweite Frage wäre. Sobald ich bspw. vom Chemistry Objekt eine Berechnung möchte, muss ich die Berechnungsmethode als Weiterleitung zur ChemistryCalc Klasse implementieren. Die Frage ist das so korrekt oder mach ich da rießige Fehler? Ein Beispiel verdeutlicht das ganze:

    //- Header File von Chemistry
    class Chemistry
    {
       private: 
          ChemistryData& chemData_;
          ChemistryCalc& chemCalc_;
    
       //- Weiterleitungsfunktionen / Schnittstelle
       double calculateReactionRate();
    }
    
    //- Source File von Chemistry
    double Chemistry::calculateReactionRate()
    {
       return chemCalc_.calculateReactionRate(chemData_);
    }
    
    //- Header File von ChemistryCalc
    class ChemistryCalc
    {
       public:
          double calculateReactionRate(const ChemData&);
    }
    
    //- Source File von ChemistryCalc
    double ChemistryCalc::calculateReactionRate(const ChemData& chemData)
    {
         //- Mach was
         return Ergebnis;
    }
    

    Manchmal hab ich einfach das Gefühl das das recht unsinnig ist was ich da mache. Angenommen ich hab in ChemistryCalc 30 Berechnungsmethoden, dann muss ich auch 30 Methoden zur Weiterleitung in der Chemistry Klasse einfügen.

    Hier das Projekt: https://media-cdn.ubuntu-de.org/forum/attachments/54/27/7656878-Project.pdf

    Weitere Frage
    Ich verwende in meinem Projekt sehr oft den folgenden Aufbau:

    double myFunction() const;
    

    Ein Kollege von mir meinte, dass er so ein Unsinn noch gar nie gesehen hat und das keine Auswirkung auf den Code hat. Er meinte, dass das const höchstens an den Anfang gestellt werden sollte:

    const double myFunction();
    

    Soweit ich das verstanden habe ist meine Implementierung so zu verstehen, dass die Funktion keine Klassenvariablen ändern und zudem nur Funktionen des gleichen Typs (also function() const) aufrufen darf/kann und die zweite Variante eben ein const double zurückgibt aber prinzipiell Klassenvariablen ändern könnte. Ein Beispiel:

    const double& myValue = myFunction(); //- Geht
    double& myValue = myFunction();       //- Fehler da myValue kein const ist.
    

    Danke fürs durchlesen,
    Grüße Tobi



  • Shor-ty schrieb:

    double myFunction() const;
    

    Ein Kollege von mir meinte, dass er so ein Unsinn noch gar nie gesehen hat und das keine Auswirkung auf den Code hat. Er meinte, dass das const höchstens an den Anfang gestellt werden sollte:

    Sollte er das tatsächlich gesagt haben und myFunction eine Memberfunktion sein, solltest du ihn nichts mehr fragen. Für eine freie Funktion trifft seine Aussage natürlich zu.

    Das const am Ende einer Memberfunktion bedeutet, dass die Funktion am Objekt selber nichts ändert. Das ist sicher nichts exotisches. Freie Funktionen gehören zu keinem Objekt, daher macht das const keinen Sinn.

    const vor dem double ist allerdings immer sinnlos. Vielleicht verwechselst du es mit "const double&"?



  • Shor-ty schrieb:

    Manchmal hab ich einfach das Gefühl das das recht unsinnig ist was ich da mache. Angenommen ich hab in ChemistryCalc 30 Berechnungsmethoden, dann muss ich auch 30 Methoden zur Weiterleitung in der Chemistry Klasse einfügen.

    Kann man so ohne weiteres nicht sagen. Ist auf jeden Fall nicht grundsätzlich unsinnig. Es kann viele Gründe geben, sowas zu wrappen oder zu verstecken. Selbst wenn man das macht, weil man denkt, man könnte das später intern ganz anders lösen, und es dann doch nicht macht, dann ist es auch nicht schlimm.
    Komplett ohne Grund sollte man das aber auch nicht machen, das ist dann nur Boilerplate. Andererseits könnte als Grund auch reichen, dass du Chemistry als API anbieten willst, und nicht die "internen" Klassen ChemistryCalc.

    const hilft halt vor allem dem Programmierer und nicht dem Compiler. Aber das hilft, zusätzliche Fehler zu vermeiden und den Code sauberer zu halten.


Anmelden zum Antworten