C++ Klassendesign



  • Hallo,

    Mh... ich weiß nicht recht wie ich meine Fragen formulieren soll. Da ich mich nun aber schon seit Wochen (nein, inzwischen schon Monate) immer wieder an diesem Problem aufhänge und immer wieder Code produziere den ich dann wieder wegschmeiße versuch ich es einfach mal.

    Ich habe eine Klasse die eine Buchung in einem Konto darstellt. Die Klasse Konto hält eine Liste mit eben diesen Buchungen.

    Nun soll es aber verschiedene Arten von Buchungen geben können. Zum Beispiel Splittbuchung und gezeitete Buchungen - also Daueraufträge. Splittbuchungen bekomme ich noch hin. Bei Daueraufträgen komme ich aber nicht mehr weiter.... ganz zu schweigen von Gegenbuchungen. Kategorien sind ein weiteres Problem. Eine Kategorie ist eine Klasse, jede Buchung kann einer Kategorie zugeordnet sein und jeder Kategorie vielen Buchungen.

    Mein grundlegendes Problem hierbei ist, ich komme aus der Java Welt, meine "Angst" vor Zeigern sowie vor RTTI. Letzteres verwendete ich in Java recht häufig (nun, immer wenn ich es brauchte). Inzwischen habe ich aber häufiger gelesen das die Verwendung von RTTI eher auf schlechtes Klassendesign schließen lässt. Leider zeigten mir die Informationsquellen aber nicht wie es anders geht.

    Den Primer (und andere Einstiegslektüre), GoF und Effektive C++ habe ich gelesen (wobei ich GoF eher als Nachschlagewerk verwende), an Modern C++ (Alexandrescu) versuche ich mich gerade. Was mir aber offensichtlich fehlt ist eine Lektüre zum Thema OO-Design in C++.

    Das lesen fremden Quelltextes zum lösen meines aktuellen Problems hat mir auch nicht weiter geholfen. Wenn ich ein Programm fand das erwartungsgemäß ähnliche Strukturen verwendete wie die die ich zu implementieren versuchte, dann war dieses Programm entweder nicht in C++ geschrieben, oder verwendete eine SQL Datenbank zur Datenhaltung (so z.b. KMyMoney).

    Daher zwei Fragen:

    1. Kennt jemand gute Informationsquellen (Webseiten, Bücher, Quelltexte, etc. pp.) zum Thema OO-Design in C++?

    2. Kann mir jemand, dankenswerterweise, einen Schubs in die richtige Richtung bezüglich meines oben erläuterten Design Problems geben? Ohne drehe ich mich bestimmt auch noch in 3 Monaten immer wieder im Kreis.

    MfG,
    B.Nutzer

    P.S: Frohe Ostern!



  • Sowas wie OOD in C++ gibt es nicht. Es gibt OOD und fertig. Wenn Du Angst vor Pointern hast, solltest du dir Smart-Pointers anschauen, die können dir als Javaist schon viel Arbeit abnehmen. Ist dann "fast" wie in Java.

    Und RTTI zeugt nicht prinzipiell von schlechtem Design, das wird sogar in "Modernes C++ Design" genutzt, wenn ich mich nicht täusche. Kommt darauf an, wo und warum man RTTI benutzt, um zu beurteilen, ob es schlecht ist. Aber in C++ kommt man tatsächlich weniger mit RTTI aus, als in Java, weil du vieles durch Templates umgehen kannst. In Java mußt du bei jedem Pups casten, in C++ kannst du das in 99% der Fälle vermeiden. Um das zu tun, sollte man nicht nach "OOD in C++" suchen, sondern nach Templates, und die haben mit OOD nichts zu tun.

    EDIT: Smartpointer



  • B.Nutzer schrieb:

    Mein grundlegendes Problem hierbei ist, ich komme aus der Java Welt, meine "Angst" vor Zeigern sowie vor RTTI. Letzteres verwendete ich in Java recht häufig (nun, immer wenn ich es brauchte). Inzwischen habe ich aber häufiger gelesen das die Verwendung von RTTI eher auf schlechtes Klassendesign schließen lässt. Leider zeigten mir die Informationsquellen aber nicht wie es anders geht.

    Dann kannst du kein sauberes OOD. Kauf dir doch mal ein OOD-Buch. In C++ hat man Standard-OO-Features, sogar noch mehr als sich manche OOler wünschen (Mehrfachvererbung). Nix OO für C++.



  • Artchi schrieb:

    Sowas wie OOD in C++ gibt es nicht. Es gibt OOD und fertig.

    Ok - danke.

    Artchi schrieb:

    Wenn Du Angst vor Pointern hast, solltest du dir Smart-Pointers anschauen, die können dir als Javaist schon viel Arbeit abnehmen. Ist dann "fast" wie in Java.

    Ok - das könnte es leichter machen. Ich hatte zwar schon im Effektiv C++ davon gelesen, jetzt habe ich aber Boost entdeckt und zudem den netten Artikel aus diesem Forum dazu. Danke.

    Artchi schrieb:

    Und RTTI zeugt nicht prinzipiell von schlechtem Design, das wird sogar in "Modernes C++ Design" genutzt, wenn ich mich nicht täusche.

    So weit bin ich in dem Buch noch nicht. 😉
    Um ehrlich zu sein ist "Modern C++" das erste Buch bei dem ich bei jeder gelesenden Seite erst einmal Schlucken und dann 1 Stunden nachdenken muss, bevor ich weiter lesen kann. Zumindest so oder so ähnlich.

    Artchi schrieb:

    In Java mußt du bei jedem Pups casten, in C++ kannst du das in 99% der Fälle vermeiden. Um das zu tun, sollte man nicht nach "OOD in C++" suchen, sondern nach Templates, und die haben mit OOD nichts zu tun.

    Das hilft mir jetzt sehr. Ich kenne Javas Generics und nein ich dachte nicht das Templates das gleiche sind. Allerdings bestärkt mich diese Aussage nochmals deutlich mich intensiver mit Templates zu beschäftigen.

    Artchi schrieb:

    Dann kannst du kein sauberes OOD. Kauf dir doch mal ein OOD-Buch. In C++ hat man Standard-OO-Features, sogar noch mehr als sich manche OOler wünschen (Mehrfachvererbung). Nix OO für C++.

    Ich geb dir recht - ich kann kein sauberes OOD. C++ macht im Augenblick aber auch mein unsauberes OOD kaputt. 😉

    Mein Problem von oben könnte ich in Java modellieren - soweit reichen meine OOD Kenntnisse. In C++ muss ich aber noch zusätzlich auf die Zeiger achten. Und genau da fangen meine echten Probleme an.

    Artchi schrieb:

    ...Kauf dir doch mal ein OOD-Buch...

    Kannst du mir zufällig eines empfehlen?

    MfG,
    B.Nutzer



  • Um ehrlich zu sein ist "Modern C++" das erste Buch bei dem ich bei jeder gelesenden Seite erst einmal Schlucken und dann 1 Stunden nachdenken muss, bevor ich weiter lesen kann. Zumindest so oder so ähnlich.

    Für einen ungeübten C++ler ist das Buch auch nicht gedacht. Selbst jemand der schon länger mit C++ arbeitet, wird bei ein paar Dingen schlucken. Da vieles dort nichts mit OOD sondern mit Template-Metaprogrammierung zu tun hat, erfordert eine andere Denkweise.
    Ein C++-Einsteiger sollte sich eher intensiv mit der Standard-Library beschäftigen. Kennst du std::sort? Kennst du std::transform? kennst du std::wstring? kennst du std::vector? usw.

    Das hilft mir jetzt sehr. Ich kenne Javas Generics und nein ich dachte nicht das Templates das gleiche sind. Allerdings bestärkt mich diese Aussage nochmals deutlich mich intensiver mit Templates zu beschäftigen.

    Templates sind keine Generics! Sie funktionieren total unterschiedlich und es gibt von Außen eine Überschneidung, die es auf den ersten Blick "gleich" erscheinen lassen. Aber an dem Buch "Modernes C++ Design" solltest du erkannt haben, das Templates eine ganz andere Liga sind. Da werden ja Templates bis zum Erbrechen genutzt. 😉

    Mein Problem von oben könnte ich in Java modellieren - soweit reichen meine OOD Kenntnisse. In C++ muss ich aber noch zusätzlich auf die Zeiger achten. Und genau da fangen meine echten Probleme an.

    Hem, also wo ist denn nun dein Problem? OOD oder Pointer? Pointer sind in Wirklichkeit das einfachste was es gibt: sie Speichern Adressen. Eigentlich nicht Anders als Referenzen in Java. In Java speichert eine Referenz eine Objekt-ID, in C++ speicher ein Pointer eine Objekt-Adresse... und eine Adresse ist ebenfalls eindeutig und somit auch eine ID.

    Gib doch mal ein Bsp. für dein Pointer-Unverständnis. Übrigens neigen Javaisten bei C++-Umstieg gerne dazu, unnötig Pointer zu benutzen (eben weil es sehr ähnlich zu Java Referenzen sind). Dabei kann man in C++ auch öffters ohne Pointer auskommen.


Anmelden zum Antworten