Funktion oder Klasse?



  • Hi,

    fange gerade an mich in cpp einzuarbeiten und tue mich derzeit (nachdem ich mein dickes Buch nun fast zu Ende habe und so langsam mit dem Praktischen anfangen will) noch etwas schwer mit Gefühl für (effizientes und sauberes) Desgin.
    Das Buch verrät mir auf welchen Wegen ich zum gewünschten Ziel komme, nur leider sagt es mir nicht, welcher denn der Beste ist 😉

    Also:
    Ich arbeite nun an einer Klasse, die einen beliebigen (ASCII) Text als Input erhält, manipuliert und wieder ausgeben soll.

    Klasse obj;
    obj = "TEXT";
    cout << obj; // > Neuer TEXT
    

    Um den Text zu manipulieren, müssen mehrere Schritte unternommen werden - nun stellt sich mir die Frage, wie ich das am besten verpacke.
    Sollte ich die Manipulation als private Memberfunktionen deklarieren und dann einfach hintereinander ausführen, sobald ein Text zugewiesen wird?

    Klasse& Klasse::operator=(string &inputtext)
    {
    	_text = inputtext;
          dothis(_text);
          dothat(_text);
    	return *this;
    }
    

    Oder sollte ich vielleicht _text selbst als interne/verschachtelte Klasse innerhalb meiner äußeren Klasse definieren (quasi ein veränderter String Container, der eben nicht nur speichert, sondern auch automatisch meine Manipulationen ausführt)

    class MyString
    {
    public:
          MyString(string &text)
          {
                // text manipulieren
          }
    }
    

    Ist es überhaupt schlau, den Text immer direkt zu manipulieren (ich weiß nichts über dessen Größe und damit die eventuelle Laufzeit der Bearbeitung) sobald etwas zugewiesen wird oder schlimmer sogar wenn er ausgegeben werden soll (weil dann die Ausgabe eben lange dauern kann).
    Damit will ich halt eine Lösung á la:

    obj = "TEXT";
    obj.manipulate();  //doof
    cout << obj;
    

    vermeiden.

    Während ich das so zusammentippe kommt mir nun auch die Idee das ganze Zuweisungszeugs wieder rauszuschmeißen und stattdessen einfach ein operator() zu definieren

    string txt("TEXT);
    cout << obj(txt);
    

    Also wie man vielleicht sieht, verzweifle ich da noch ein wenig 🙂
    Falls meine Fragen doof sind, ignoriert mich einfach 😉 ansonsten wäre ich froh, mal ein paar Meinungen zu hören, wie hier die Vorlieben und Konventionen sind eine solche Problemstellung umzusetzen.

    Zu späterer Stunde, nachdem ich nichtmehr jede Konstruktion nachschlagen muss, werde ich mir auf jeden Fall auch mal Lektüre zu Designrichtlinien zu Gemüte führen - bis dahin will ich aber nicht dumm sterben...



  • Generelle Richtlinien gibt es für das Design nicht, sondern es kommt auf das Problem und die Anwendung an.

    Für deine Stringmanipulationsklasse würde ich beides implementieren (in Bezug auf Zeitoptimierung), d.h. z.B. mittels eines Flags im Konstruktor, ob alle Manipulationen automatisch angewandt werden sollen oder ob der Anwender (der Klasse) die einzelnen Manipulationen selbst aufruft.

    So hat die Klasse die größtmögliche Flexibilität...



  • Und dann die Manipulationen wie gehabt als normale Member und dann beim Zuweisen ausführen (falls vom Benutzer so gewünscht)...

    Ich weiß nicht ob das ein Problem ist - ich habe auch einen >> Operator implementiert.

    // ist friend von Klasse
    istream& operator>>(istream& in, Klasse &obj)
    {
    	in >> obj._text;
          obj.dothis(obj._text);
          obj.dothat(obj._text);
    	return in;
    }
    

    Nur zum Verständnis, die Manipulation wird dann erst ausgeführt wenn der Inputstream beendet ist und nicht etwa bei jedem Zeichen des Streams, oder?!



  • Ich würde mich nach dem Design der Stdlib richten. Also einen Algorithmus entwickeln, der ein std::string entgegen nimmt und diesen dann manipuliert.

    Schau dir mal das als Beispiel an:
    http://www.boost.org/doc/html/string_algo/usage.html#id1290660

    Ist so, wie die Stdlib auch designed wurde.

    Wenn dein "Klasse" wirklich nur ein String-Ersatz sein soll, dann würde ich diese Klasse garnicht definieren, sondern einen Algo bauen der eben einen std::string oder std::wstring manipuliert.

    Ich würde nur dann einen Algo in eine Klasse implementieren, wenn sie auch nur für diese Klasse Sinn macht.



  • Ziel der Klasse soll sein, einen Text zu formatieren, Blocksatz, feste Breite, Silbentrennung und dergleichen.
    Auf Anhieb hätte ich das natürlich ohne Klasse gemacht, aber auch nur weil ich bisher mein Leben lang alles ohne Klasse gemacht habe :p
    Das soll quasi mein Einstieg in den Klassenmechanismus sein...


Anmelden zum Antworten