Design Patterns Schwierigkeiten



  • Immer wenn ich vor neuen größeren Projekten in C++ stehe, frage ich mich wie ich das Entwurfsmuster gestallten könnte. Klar, wenn ich zwei Klassen namens "Mercedes" und "VW" habe könnte ich das ganze abstrahieren und von der Klasse "Auto" ableiten, das ist bei größeren Programmen aber leichter gesagt als getan. Ich überlege immer stundenlang und im Endeffekt kommt nichts dabei raus... Kann man das irgendwie trainieren oder gibt es gute Lektüre die sich nur mit dem Thema OOP beschäftigt und nicht zu sehr auf die jeweilige Sprache eingeht?

    Außerdem gab mir mal jemand den Tipp: "Schreibe eine Klasse für nur genau eine Aufgabe!". Kann man das so akzeptieren, oder kann eine Klasse auch zwei Methoden beinhalten, die für ganz unterschiedliche Aktionen benötigt werden?

    Kurzes Beispiel was ich meine...
    Eine Klasse die für Themen eines Forum gedacht wird, dabei gibt es die Aufgaben Themen zu erstellen und zu schreiben. Sollte ich jetzt...

    • eine Klasse "Thema" mit zwei Methoden namens "schreibeThema(...)" und "leseThema(...)" erstellen, oder
    • zwei Klassen die jeweils "SchreibeThema" und "LeseThema" heißen und beide Methoden haben um die jeweile Aktion durchzuführen.

    Wie man sieht gibt es bei mir echt jede Menge unklarheiten bezüglich der OOP, vielleicht nehme ich das ganze auch zu ernst und mache mir zu viel Gedanken darüber.

    Ich hoffe hier findet sich einige die sich zu dem Thema äußern können. Schönes Wochenende wünsche erstmal!

    Liebe Grüße,
    Marc



  • Die deutsche Ausgabe des Buchs ist schrecklich 👎



  • Was für ein Buch wenn ich fragen darf? Verstehe dein Post nicht so ganz, was hat das mit meinem Thema zu tun? 😃 Kann sein das du dich im Thema vertan hast?



  • dpatternp schrieb:

    Eine Klasse die für Themen eines Forum gedacht wird, dabei gibt es die Aufgaben Themen zu erstellen und zu schreiben. Sollte ich jetzt...

    • eine Klasse "Thema" mit zwei Methoden namens "schreibeThema(...)" und "leseThema(...)" erstellen, oder
    • zwei Klassen die jeweils "SchreibeThema" und "LeseThema" heißen und beide Methoden haben um die jeweile Aktion durchzuführen.

    Weder noch. Ein Thema zu schreiben ( = Thema-Objekt erstellen) ist nicht Aufgabe der Klasse Thema. Genauso macht es keinen Sinn, dass ein Thema sich selbst lesen soll. Ein User könnte dagegen Themen erstellen und lesen.



  • Michael E. schrieb:

    dpatternp schrieb:

    Eine Klasse die für Themen eines Forum gedacht wird, dabei gibt es die Aufgaben Themen zu erstellen und zu schreiben. Sollte ich jetzt...

    • eine Klasse "Thema" mit zwei Methoden namens "schreibeThema(...)" und "leseThema(...)" erstellen, oder
    • zwei Klassen die jeweils "SchreibeThema" und "LeseThema" heißen und beide Methoden haben um die jeweile Aktion durchzuführen.

    Weder noch. Ein Thema zu schreiben ( = Thema-Objekt erstellen) ist nicht Aufgabe der Klasse Thema. Genauso macht es keinen Sinn, dass ein Thema sich selbst lesen soll. Ein User könnte dagegen Themen erstellen und lesen.

    Also einer Klasse "User" eine Methode "leseThema(...)" geben, ist aber sehr komisch.

    Ich würde das mehr technisch betrachten. Also eine Klasse für die Persistenz (schreiben, lesen), eine (oder mehrere) zur Darstellung (HTML erzeugen...). Einem User würde ich Namen und Berechtigungen geben.



  • huch?? schrieb:

    Michael E. schrieb:

    dpatternp schrieb:

    Eine Klasse die für Themen eines Forum gedacht wird, dabei gibt es die Aufgaben Themen zu erstellen und zu schreiben. Sollte ich jetzt...

    • eine Klasse "Thema" mit zwei Methoden namens "schreibeThema(...)" und "leseThema(...)" erstellen, oder
    • zwei Klassen die jeweils "SchreibeThema" und "LeseThema" heißen und beide Methoden haben um die jeweile Aktion durchzuführen.

    Weder noch. Ein Thema zu schreiben ( = Thema-Objekt erstellen) ist nicht Aufgabe der Klasse Thema. Genauso macht es keinen Sinn, dass ein Thema sich selbst lesen soll. Ein User könnte dagegen Themen erstellen und lesen.

    Also einer Klasse "User" eine Methode "leseThema(...)" geben, ist aber sehr komisch.

    Ich würde das mehr technisch betrachten. Also eine Klasse für die Persistenz (schreiben, lesen), eine (oder mehrere) zur Darstellung (HTML erzeugen...). Einem User würde ich Namen und Berechtigungen geben.

    Natürlich bekommt der Außer die Funktion. Wer sollte denn sonst die Threads lesen?
    (Technisch betrachtet ist eine Funktion lesen überflüssig, da das Programm dafür nichts tun muss. aber der User hätte dann eine request_wirf o.ä.)



  • Nathan_logoff schrieb:

    huch?? schrieb:

    Michael E. schrieb:

    dpatternp schrieb:

    Eine Klasse die für Themen eines Forum gedacht wird, dabei gibt es die Aufgaben Themen zu erstellen und zu schreiben. Sollte ich jetzt...

    • eine Klasse "Thema" mit zwei Methoden namens "schreibeThema(...)" und "leseThema(...)" erstellen, oder
    • zwei Klassen die jeweils "SchreibeThema" und "LeseThema" heißen und beide Methoden haben um die jeweile Aktion durchzuführen.

    Weder noch. Ein Thema zu schreiben ( = Thema-Objekt erstellen) ist nicht Aufgabe der Klasse Thema. Genauso macht es keinen Sinn, dass ein Thema sich selbst lesen soll. Ein User könnte dagegen Themen erstellen und lesen.

    Also einer Klasse "User" eine Methode "leseThema(...)" geben, ist aber sehr komisch.

    Ich würde das mehr technisch betrachten. Also eine Klasse für die Persistenz (schreiben, lesen), eine (oder mehrere) zur Darstellung (HTML erzeugen...). Einem User würde ich Namen und Berechtigungen geben.

    Natürlich bekommt der Außer die Funktion. Wer sollte denn sonst die Threads lesen?
    (Technisch betrachtet ist eine Funktion lesen überflüssig, da das Programm dafür nichts tun muss. aber der User hätte dann eine request_wirf o.ä.)

    Hä? Welches Programm hat nicht zu tun? Ich denke es geht darum die HTML Seite für ein Thema zu generieren.



  • Danke für die Beträge, ich bin am überlegen mir ein Buch zu kaufen. Drei Bücher die ich gefunden habe...

    http://www.amazon.de/Patterns-Elements-Reusable-Object-Oriented-Software/dp/0201633612/ref=sr_1_1?ie=UTF8&qid=1374367516&sr=8-1

    http://www.amazon.de/Effective-Specific-Addison-Wesley-Professional-Computing/dp/0321334876/ref=cm_cr_pr_product_top

    http://www.amazon.de/Modern-Generic-Programming-Patterns-Applied/dp/0201704315/ref=sr_1_5?s=books-intl-de&ie=UTF8&qid=1374368294&sr=1-5

    Welches Buch ist davon zu empfehlen? Die scheinen doch recht halt zu sein, oder macht das nichts aus? Kennt ihr vielleicht andere gute Bücher?



  • Modern C++ Design wird dir bei deinem Problem glaube ich nicht viel helfen.

    Schau dir auch mal das Design von bestehenden Libraries und Programmen an.



  • Pattern Hatching | ISBN: 0201432935

    Gerade wenn man lernen will wie man Design Pattern jetzt wirklich einsetzen soll, ist das Buch super.



  • Hallo Marc,
    Eine Klasse Auto, um "Mercedes" und "VW" zu abstrahieren - was hat das für dich mit Entwurfsmustern zu tun?

    Ich würde das eher als "OOP-Basics" bezeichnen.

    "Schreibe eine Klasse für nur genau eine Aufgabe!". Kann man das so akzeptieren, oder kann eine Klasse auch zwei Methoden beinhalten, die für ganz unterschiedliche Aktionen benötigt werden?

    Ich hätte jetzt persönlich eher den Begriff "Concern" verwendet (Zuständigkeit) und dies auch nicht auf Klassen begrenzt,
    sondern auf alles:
    - verwende eine Variable nur für einen Wert (also speichere nicht in der Variable iSomething einmal das Alter einer Person,
    später noch einen allgemeinen Zähler und am Schluss noch einen Magic-Wert für irgendeine Berechnung),
    - mache keine Funktionen, die per Flag mal dies, mal was völlig anderes tun,
    - mach Klassen, die eine klare Zuständigkeit haben (und ja, das sollte nur eine sein).

    Zu deinem Beispiel: ich würde vorschlagen, eine Klasse "Thema" zu machen. Warum? Eine Klasse sollte immer ein "Ding" (ein
    Nomen bzw. Substantiv) repräsentieren, kein Verb (im Normalfall).
    Eine Methode leseThema sollte es schon rein vom Namen her nicht geben (eher eine Methode namens "lesen" und du schreibst
    dann "meinThemaOjekt.lesen()".
    Ob das jetzt sinnvoll ist, darüber will ich jetzt nicht urteilen - aber ich persönlich finde, dass ein Thema nichts darüber wissen sollte, wie es "gelesen" wird (ich nehme an, du meinst lesen=von DB lesen). Ansonsten musst du deine Thema-Klasse anpassen, wenn sich die die Art ändert, wie das persistent gemacht ist - und das würde auf ein schlechtes Design hindeuten. Ich kann dir als Beispiel die Vertex-Klassen aus meinem eigenen Hobby-Projekt (ein 3d-Viewer) nennen; die Klasse behandelt rein vertex-spezifische Dinge, aber sie hat keine Ahnung, wie ihre Daten persistiert werden - dafür gibts einen (oder mehrere) Loader. Hat auch noch den Vorteil, dass man 3d-Objekte für Testzwecke auch hardcodieren oder statt aus Files aus einer Db laden kann.

    Wie man das lernt? Durch jahrelange Erfahrung. Die meisten Entwürfe müssen immer wieder überdacht werden, selten ist der
    erste Wurf das Gelbe vom Ei. Noch ein Wort zu Patterns: Patterns sind erprobte Lösungen zu häufig auftrenden Problemen,
    man sollte sie also erst in Betracht ziehen, wenn das Problem vorhanden ist.


Log in to reply