Anfänger: OOP Probleme mit Abbildung in Klassen



  • Hallo

    ich bin zzt. am Einstieg in C/C++. Mit der algemeinen Syntax komme ich langsam klar. Jetzt kommt der Einstieg in Klassen bzw OOP.
    Ich habe als ein altes Projekt von mir aus der Schublade geholt, welches ich damals in BASIC sowie PASCAL geschrieben hatte.

    Ein Decompressionsprogramm fürs Tauchen (ich tauche gerne, viel und tief).

    Eigendlich ist das recht simpel.

    Es gibt 3 Gleichungen die beschreiben wie das Gas sich im Körper löst. Bei dem konkreten Beispiel wird der Körper modellhaft durch 16 Gewebe dargestellt. Diese Gewebe unterscheiden sich eigendlich nur durch ihre Halbwertzeit.

    Man kann mit verschiedenen Gasen Tauchen, die sich nur in dem Mischungsverhältniss ihrer drei Komponenten unterscheiden.

    Es gibt ein Tauchprofil, welches praktisch ein 2D-Array ist aus Tiefe und Zeit.

    Jetzt will ich das ganze in Klassen verpacken.

    Ich dachte an:

    Klasse Taucher, dieser besteht aus Geweben: also ist Gewebe eine Klasse in der Klasse Taucher.

    Die eigendliche Berechnung wollte ich in die Klasse ZLH16 (Name des konkreten Algorhytmus) packen.

    Die Profildaten in die Klasse Tauchprofil, also aus Datei lesen und an die ZLH16 übergeben.

    Klasse Gas, welche mit den konkreten Mischungsverhältnissen initialisiert wird.

    Jetzt mein Problem:

    Das oben ist alles Mist, glaube ich.

    Die Gewebe müsssen je nach verwendetem Algorhytmus verschieden initialisiert werden. Also währe es doch sinniger diese in die Klasse ZLH16 zu packen. Aber dann mußte ich diese für jeden noch folgenden Algorhytmus neu schreiben. Will ich aber nicht, weil der Sinn den ich in OOP sehe ist die wiederverwendbarkeit von Code.
    Aber von der Äußeren Betrachtung her gehören die Gewebe zum Taucher.

    Irgendwie drehe ich mich im Kreis. Das Originalprogramm (welches funktionierte) hatte knapp 550 Zeilen Code bei ca 30% Kommentaranteil. Ich habe das Gefühl das mit OOP die Komplexität nur weiter steigt aber nicht sinkt.

    Oder wo mache ich den Denkfehler?

    Danke

    Christian



  • Also ich würde sagen du für Gewebe eine abstrakte Basisklasse machen kannst und dann die verschiedenen Gewebe davon ableitets. Dann kannst du das ganz einfach an den Algorithmus übergeben und mithilfe der Basisklasse kannst du lediglich auf die Schnittstelle zugreifen, welche die verschiedenen Gewebe gemeinsam haben (was, wie ich annehme lediglich Datenunterschiede sind). Hier wahrscheinlich Overkill, weil du die Daten auch einfach in einer Klasse haben kannst und dann die Werte z.B im Konstruktor mitgeben kannst, allerdings wäre das so in etwa den Weg, den du zur Laufzeit einschlagen kannst. Dann gäbe es da noch Templates, mit denen du das ganze zur Kompilierzeit machen kannst. Hier kannst du völlig verschiedene Klassen schreiben, welche die verschiedenen Typen von Geweben darstellen, allerdings eine eine gemeinsame Schnittstelle haben (respektive eine Funktion, die immer drin sein muss).

    Abstrakte Basisklasse und Laufzeitpolymorphie

    class GewebeBase
    {
     public:
     virtual Data getData () = 0;
    };
    
    class Gewebe1 : public GewebeBase
    {
     public:
     Data getData(){..}
    };
    
    class Gewebe2 : public GewebeBase
    {
     Data getData(){..}
    };
    
    void algo ( GewebeBase* b )
    {
    Data = b.getData(); 
    ...
    }
    ...
    
    Gewebe2 g;
    algo ( &g ); //Zeiger automatisch in die Basisklasse umgewandelt
    

    Templates und Kompilierzeit polymorphie

    class Gewebe1
    {
     public:
     Data getData(){..}
    };
    
    class Gewebe2
    {
     Data getData(){..}
    };
    
    template<class T>
    void algo ( T t )
    {
    Data = t.getData(); 
    ...
    }
    
    ..
    Gewebe1 g;
    algo ( g ); //Der Compiler erstellt hier eine 
                //Funktion und setzt dort den Typen Gewebe1 ein
    

    Sei gesagt bei der Laufzeitpolymorphie hast du einen gewissen Overhead zur Laufzeit bei den Templates hast du zur Laufzeit keinen zusätzlichen Overhead, aber längere Kompilierzeit und eine grössere Binary. (Weil da halt Codeverdopplung vorkommt durch die Benutzung von Templates).


Anmelden zum Antworten