c++ aufgabe - wie anfangen???? :(



  • @Werner: Also ich find dein Code ja super, aber würde diese Zeile nicht gegen eine der Prinzipien aus "Effective STL" von Scott Meyers verstoßen:

    return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    Avoid writing "write-only" Code ?

    Ich interpretiere meine Fähigkeiten in C++ schon auf ziemlich gut, aber der Code braucht echt ne Weile um zu sacken :D:D



  • Meiner bescheidenen Meinung nach ist das ganz und gar kein write-only code.
    Eine Klasse (Person) und überladene Operatoren für Ein- und Ausgabe der Daten. Eigentlich ein Standardvorgehen.



  • Ja ein Standardvorgehen auf jedenfall. Mit write-only meinte ich auch eher das man diesen Code runterschreibt und es beim schreiben alles logisch ist, jedoch wird es beim nachträglichen lesen etwas umfangreicher herauszufinden was der Autor damit meinte. Vielleicht gehts mir nur so, ist nur ein persönliches empfinden.


  • Mod

    Ach, wenn man das ein paar mal gesehen hat, dann ist das eigentlich auch ganz gut zu lesen. Das einzige was man braucht um den Code zu verstehen, ist, dass die ganzen Leseaktionen auf die Streams den Stream selbst zurück geben. Und das nutzt man sowieso dauernd, auch wenn man es vielleicht nicht bemerkt.

    return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    Das ist:

    in >> p.m_nr >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    Ist das jetzt viel besser?
    Oder ganz streng genommen müsste man machen:

    in >> p.m_nr;
    in >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht;
    in >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    Jetzt hat man gar keine Aneinanderreihungen mehr.



  • Ist jetzt auf jedenfall schneller nachvollziehbarer 😉
    Aber das ist alles ja nur ne persönliche Einschätzung, ich weiß ja nicht wie das andere sehen.



  • SeppJ schrieb:

    in >> p.m_nr >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    Ist das jetzt viel besser?

    Ja, ist es. Es geht auch nicht darum, den Rückgabewert der Einlesefunktionen nicht zu verwenden, sondern die Funktionsaufrufe zu schachteln bis niemand mehr durchblickt welche Klammer jetzt eigentlich wozu gehört. Von mir aus könnte man das operator >> noch in getline packen, aber die getline untereinander verschachteln? Lieber nicht.



  • Firefighter schrieb:

    @Werner: Also ich find dein Code ja super, aber würde diese Zeile nicht gegen eine der Prinzipien aus "Effective STL" von Scott Meyers verstoßen:

    return getline( getline( getline( in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    Ja - Du hast Recht. Dieser Code verstößt gegen Item 47 "Avoid producing write-only code". Dort steht unter anderen

    Scott Meyers schrieb:

    Whether code is write-only depends on who's reading it.

    Unter diesem Aspekt (hhjoni liest ihn) ist das definitiv ein Verstoß gegen diese Regel.
    Die Variante von SeppJ ist in dieser Hinsicht besser; und für hhjoni bleiben ohnehin sicher genug Fragen offen.

    :xmas2: Werner



  • @ Werner: Touché 😃



  • .. was haltet Ihr denn von so was?

    // ---  Einlesen einer Person
        return getline( getline( getline(
            // Format:
            //    Pers.#             Name_______,                Vorname_______;       m/w               (________Kenntnisse_______)
            in >> p.m_nr >> std::ws, p.m_name, ',' ) >> std::ws, p.m_vorname, ';' ) >> p.m_geschlecht >> klammer, p.m_kenntnisse, ')');
    

    :xmas2:



  • :D:D Grad musst ich etwas lachen 🙂

    Schöne Lösung, aber sagt man nicht das Code so geschrieben werden soll das man ohne Kommentare arbeiten kann? Jeder Kommentar im Code deutet darauf hin das man hier etwas nicht ordentlich genug "codiert" hat 🙂

    Aber dennoch, gekonnte Umformulierung des Codes.



  • danke schon mal 😃 hab schon bisschen rumprobiert aber bin noch nicht zu einer lösung gekommen... schrecklich, aber ich probier weiter 🙂



  • Werner Salomon schrieb:

    .. was haltet Ihr denn von so was?

    In dem Fall musste ich alle Kommentare entfernen um zu verstehen, was die getlines da eigentlich machen. Jetzt ist zwar das Dateiformat etwas klarer, aber was der Code selbst bedeutet wurde noch weiter verdeckt.

    (ja, ich habe zuerst Seite 2, dann Seite 1 gelesen)

    Was den Code noch etwas schwieriger zu verstehen macht ist, dass getline meistens eingesetzt wird um (wie der Name bereits nahe legt) einzelne Zeilen der Datei auszulesen. Semantisch wird das hier ganz krumm. Natürlich geht es, aber der Code spricht nicht mehr wirklich.



  • ich raff das nicht


  • Mod

    hhjoni schrieb:

    ich raff das nicht

    Aber raffst du:

    in >> p.m_nr;
    in >> std::ws;
    getline(in, p.m_name, ',');
    in >> std::ws;
    getline(in, p.m_vorname, ';' );
    in >> p.m_geschlecht;
    in >> klammer;
    getline(in, p.m_kenntnisse, ')');
    return in;
    

    ?

    Oder verstehst du ganz allgemein nicht, was Werner da gemacht hat (also mit Klassen, Operatorüberladung, Iteratoren und Algorithmen)?



  • für mich ist es ganz schwer diese aufgaben zu lösen. ich kenn wohl einzelne funktionen aber das war es auch schon. das ist überhaupt nicht mein ding.... ich glaub ich brauch jemanden der mir das schritt für schritt erklärt

    ... habs nun 🙂


Anmelden zum Antworten