Projekt in OOP umwandeln (+kleine Frage zu OOP an sich)



  • Hallo,

    wie vielleicht 1 oder 2 behalten haben bin ich dabei mir einen Vokabeltraienr zu schreiben. Der Anfang funktionniert jetzt auch (als Consoleapp), unter anderem dank der netten Hilfe hier im Forum, recht gut. Unter Anfang verstehe ich das "Menue" (in der main), das Einlesen und Ausschreiben der Vokabeln aus/in Dateien )finout.cpp, 2 Funktionen), das Hinzufuegen von Vokabeln (in addvoc.cpp, 1 Funtkion), das Editieren von Vokabeln (in editvoc.cpp, 1 Funktion) sowie das Testen der Vokabeln (in testvoc.cpp, 1 Funtkion) Die Vokabeln sind abgespeichter in 2 vector<voc> (voc ist ein entsprechendes struct), die meist per const referenz uebergeben werden (zuzueglich der anderen noetigen Parameter)

    Tja, jetzt hab ich mir ueberlegt, bevor ich weitermache, das ganze etwas objektorientierter zu gestalten. Nur... wie fasst man sowas jetzt an (es ist mein erstes Projekt. Davor waren alles immer nur Uebungsaufgaben, meist sogar nur 1 cpp Datei und fertig, recht klein und schnell zu loesen) Die einzige Idee die mir dazu gekommen waere, waere die beiden vector<voc> in eine Klasse "umzuwandeln", und aus den Funtkionen allesamt Memberfunktionen dieser Klasse machen, fin vielleicht in den Konstruktor, fout als Funtkion und ausserdem im den Destruktor aufrufen (Zwischenfrage: ist sowas erlaubt und funktionniert es wie erwartet, also wird quasi diese Funktion beim beenden des Programms und ergo zerstoeren der Variablen automatisch aufgerufen und speichter mir dann alles in meine Dateien??)

    Aber dann bekomm ich eigentlich "nur" eine grosse Klasse, die halt alles regruppiert. Macht es meiner Vorstellung nach zwar etwas leichter und uebersichtlicher, aber auf entsprechende Probleme werde ich auf dem Weg natuerlich stossen (und dadurch an Erfahrung gewinnen. Probleme sind eigentlich das beste was mir aktuell passieren kann, nur dadurch lern ich dazu)

    Tja, nun zur Frage: Wie wuerdet ihr, erfahrene Programmierer, das angehen. Welche Ideen haettet ihr, resp. welche weiteren Infos ueber das Programm soll ich liefern damit ihr euch eine Idee ausdenken koennt?

    Und dann noch zu der angekuendigten "kleinen Frage" aus dem Threadtitel: was kennzeichnet OOP? Ich habe hier im Forum schon regelmaessig gelesen, dass eine Klasse nicht bedeutet, dass man objektorientiert programmiert. Was gehoert dazu?
    Ich erwarte darauf natuerlich nicht eine allgemeingueltige Definition wie "Du brauchst 3 Klassen, 2 structs und 1 Vererbung damits oop ist" das ist natuerlich quatsch. Ein paar subjektive Statements wuerden mir reichen.

    Vielen Dank im voraus,

    Shinja



  • Ich habe den anderen Thread nicht genau verfolgt (und hab im Moment eigentlich auch keine Lust/Zeit die Details nachzulesen). Nur soviel zum Design an sich:

    Was ich machen würde, ist die Vokabeldaten von der Abfrage zu trennen, d.h. du hast zumindestens zwei Klassen:

    Vokabular: Vokabeln mit den nötigen Zugriffsfunktionen (Hinzufügen, Ändern, Löschen?, usw.), Einlesen des Vokabel-Bestands aus einem Stream/Schreiben in einen Stream, aber darüber hinaus keine direkten IO-Funktionen.

    Abfrage: Hat ein Objekt der Klasse Vokabular als Member, enthält Menü-Funktionen und alles, was sonst noch zur Abfrage dazugehört.



  • Erstmal allgemein: OOP ist eine bestimmte Vorgehensweise zur Programmierung - klar nehmen Klassen und Objekte eine wichtige Stellung darin ein, aber wichtig ist vor allem die Art, wie diese zusammenarbeiten. Und nach dem Motto "hauptsache es ist OOP" ein Projekt anzupassen ist imho Unsinn.

    (Zwischenfrage: ist sowas erlaubt und funktionniert es wie erwartet, also wird quasi diese Funktion beim beenden des Programms und ergo zerstoeren der Variablen automatisch aufgerufen und speichter mir dann alles in meine Dateien??)

    Ja, der Destruktor wird aufgerufen, wenn dein Objekt ordnungsgemäß zerstört wird (lokale Variablen am Funktionsende, globale Variablen am Ende der main(), Heap-Variablen beim delete). Problematisch wird es afik höchstens, wenn dein Programm unerwartet abstürzt - oder wenn du irgendwo ein delete vergessen hast.



  • Hallo,

    danke fuer die Antworten
    @Z2: klingt gut, muss mir das mal genau ansehen ob und wie ich das machen koennte und melde mich dann nochmal (werde aber immer wieder reinschneien und schauen ob neue ideen da sind) Nur eine Frage dazu gleich mal: sollte ich nicht vielleicht noch eine Ueberladung des << Operators in die 1. Klasse packen (zum einfachereren ausgeben)

    @CStoll: Es geht mir nicht um "Hauptsache es ist OOP" sondern erstens darum, dass ich Angst habe, vielleicht doch den ueberblick zu verlieren oder so (mangels Erfahrung/Uebung halt, die meisten andern hier wuerden darueber wohl lachen), und Zweitens soll es eine (selbstgestellte) Uebung sein um den Umgang mit Klassen zu ueben. Und ich wuerde halt gerne an dem Beispiel sehen, wie man Klassen richtig verwendet. Irgendwie muss man (resp. will ich) das ja lernen und ich dachte, das hier sei vielleicht ein gutes Beispiel dazu.

    EDIT: Kurze Frage zum Klassendesign: ist es "in Ordnung" die Klasse in einen Header zu schreiben, dann die Memberfuntkionen in verschiedene cpp Dateien und in jede dieser cpp Dateien die Klasse dann zu inkludieren (die Funktionen sind ja alle etwas laenger, darum will ich die nicht alle in eine Date packen.



  • operator>> und operator<< für die Vokabular-Klasse machen sicherlich Sinn, wie ich auch bereits geschrieben habe:

    Einlesen des Vokabel-Bestands aus einem Stream/Schreiben in einen Stream

    Ob das nun Memberfunktionen oder freie Operatoren sind, macht vom Konzept her nicht wirklich einen Unterschied.

    Für eine Header-Datei mehrere Implementations-Dateien zu verwenden, macht IMHO keinen Sinn. Es erfüllt keinen Zweck und du blähst dir damit nur künstlich die Zahl deiner Quelltextdateien auf.


Anmelden zum Antworten