Hilfe beim Klassenentwurf

honkitonk

Lt. Commander
Registriert
Juli 2004
Beiträge
1.733
Hallo CB-Community,

ich bin gerade dabei mich in die OOP einzuarbeiten. Ich programmiere derzeit kleinere Dinge mit C#. Leider gefallen mir meine Ergebnisse nicht wirklich. Mir fehlt derzeit das Verständnis für das Klassendesign. Ich weiß was Klassen sind, schaffe es aber nicht aus einem Problem die nötigen/möglichen Klassen zu extrahieren.

Ich suche also derzeit nach Hilfsmitteln oder Hilfestellungen, die mir helfen diesen Schritt zu verstehen. Also von der Aufgabenstellung zum Klassendiagramm. Auch über Buchempfehlungen wäre ich nicht böse. Ich möchte aber nicht zum hundertsten mal lesen, wie eine Klasse aufgebaut ist, sondern wie ich das Problem analysieren kann um am Ende die Klassen entwerfen zu können. Und mir bitte nicht mit dem Autobeispiel kommen. Für evtle. Beispiele sollte schon eine gewisse Komplexität vorhanden sein, damit die OOP auch Sinn macht.

Danke
 
honkitonk schrieb:
Hallo CB-Community,

ich bin gerade dabei mich in die OOP einzuarbeiten.

die Klassen entwerfen zu können. Und mir bitte nicht mit dem Autobeispiel kommen. Für evtle. Beispiele sollte schon eine gewisse Komplexität vorhanden sein, damit die OOP auch Sinn macht.

Aha, aber gerade Auto oder Wald sind gut geeignet fuer den Ainstieg in die OOP. Alles andere folgt den selben mechanismen und haengt dann von der eigenen Abstrahierbarkeit ab.

Nun egal, wenn du Auto nicht magst, gib du uns ein bsp. ;)
 
Okay, dann geb ich mal nen Beispiel vor und ihr/du erklärt mir dann bitte warum ihr welche klassen nutzen/erstellen würdet.

Also...nehmen wir nen imaginären Partyservice:

Ich brauche ne Software in der ich verschieden Dinge die bestellbar sind, auswählen kann. (z.B. Hauptspeisen, Desserts, Getränke, Unterhaltung [ne Band oder so]. Das alles wird mit Bestellnummern und Beschreibung oder so in einer DB verwaltet. Diese Auswahl passeirt in einem Formular. In einem anderen muss ich dann persönliche Daten usw. angeben zwecks Rechnung etc. eingeben können.
Am Ende solls z.B. nen Formular geben auf dem alles nochmal zusammengefasst wird. Ich könnte mir auch noch ein Feature vorstellen, wo man eine Statistik der bestellten Dinge sieht.

Ich hoffe das macht jetzt einigermaßen Sinn. Was bräuchte man hier für Klassen? Und wie kommst du / kommt ihr darauf.

eine Klasse wäre sicherlich Kunde oder so. Den Rest überlasse ich euch.

PS: Ich kann mich erst heute nachmittag melden, also drängt das zeitlich jetzt nicht sooo dolle. Wenn die Aufgabe nicht ganz klar sein sollte, einfach was dazu erfinden (und dann bitte erwähnen) oder vll auch ne eigene aufgabe ausdenken. Und wie gesagt, wie eine einzelne Klasse aufgebaut ist etc. weiß ich, nur nicht wich ich mir die ganzen Klassen ausdenke, die ich zur Lösung einer Aufgabe brauche.
 
honkitonk schrieb:
Den Rest überlasse ich euch.
ich glaub, das solltest du eher machen, anstatt es uns zu überlassen, denn du willst schließlich etwas lernen und nicht wir!

@topic:
du hast doch schon alles genannt, was man gebrauchen könnte. speisen, getränke, desserts, .... was also ist das problem? desweiteren: mach lieber alles in der konsole, wenn du gerade beginnst, denn das erspart lästige designarbeit des formulars, was zum lernen der thematik eh kaum vorteilhaft ist.

z.b.
Code:
# baum
  - nadel
    * tanne
    * ...
  - laub
    * eiche
    * ...
die eigenschaften kannst du dir ja dann selbst überlegen, was zu wem und wohin gehört. liefer uns doch erst mal ein paar ergebnisse anstatt uns arbeiten zu lassen. dann können wir ggf. korrigieren und verbessern.
 
Eigentlich hast Du doch schon alles beschrieben :)

Eine Bestellung besteht aus einzelnen Bestellpositionen, die verschiedene Eigenschaften haben.

Die Eigenschaften der Positionen solltest Du einfach mal niederschreiben, so kommst Du zur Überlegung, ob Dir ein simples Bestellpostion-Objekt mit ein paar Eigenschaften reicht oder ob Du eine komplexere Struktur brauchst, sei es durch Vererbung oder Aggregation.

Daten des Bestellers ist ein weiteres Objekt - oder mehrere, je nachdem wie komplex Du das aufziehen willst. Ausserdem könntest Du Dir Gedanken machen, ob Du die Kunden als Kunden verwalten möchstest oder einfach nur an jede Bestellung anhängen (dann hat man wiederkehrende Kunden halt mehrfach gespeichert). Beides möglich und nur vom Auftraggeber/Aufgabenbesteller zu beantworten. Kundenverwaltung als solche kann aber hochkomplex werden, um die Kunden wiederzufinden (Tippfehler als Stichwort).

Die Objekte haben jeweils Eigenschaften, die z.T. aus der Datenbank kommen (z.b. Eigenschaften von Bestellpositionen), z.T. vom Benutzer gemacht werden (Angaben vom Besteller) und z.T. vom System (z.B. Auftragsdatum).

Dein Formular oder die Formulare werden dann entsprechend gefüllt und die Eingabedaten werden nach ein paar Prüfungen (z.B. Telefonnummer enthält nur Ziffern und evtl. +/-) den Objekten zugeordnet.

Für die Datenbank musst Du Dir evtl. noch Gedanken über das objekt-relationale Mapping machen (http://de.wikipedia.org/wiki/Objektrelationale_Abbildung).

Also, wie sind wir bis hierher gekommen? Einfach die Anforderungen klar und geordnet aufschreiben. Substantive sind dann häufig Objekte, Verben zu implementierendes Verhalten.
 
grundsätzlich gilt: versuche immer, möglichst zu abstrahieren. in deinem fall also gemeinsamkeiten von klassen zu finden, um anschließend abstrakte klassen zu erstellen, von denen du dann ableiten kannst. außerdem bietet es sich auch an, stets gegen ein interface zu implementieren. der vorteil liegt auf der hand: man kann dadurch verschiedene (konkrete) implementierungen austauschen, was wichtig ist, wenn man im team arbeitet. zu schnell? hier kannst du alles wesentliche nachlesen:

http://openbook.galileocomputing.de/oo/
http://openbook.galileocomputing.de/javainsel7/

das wichtigste überhaupt: versuche immer, bevor du was größeres implementieren möchtest, die klassen und deren beziehungen untereinander zu visualisieren. möglich ist das mit der uml - unified modeling language. glaub mir, es lohnt sich, sich da einzulesen. sonst kann man sehr schnell mal den überblick verlieren.

weitere informationen sowie modellierungs-tools findest du hier:

http://de.wikipedia.org/wiki/Unified_Modeling_Language
http://www.jeckle.de/umltools.htm
http://www.uml.org/

wenn du interesse daran hast und ich mal zeit habe, kann ich mal ein diagramm posten, das deinen anforderungen entspricht.
 
honkitonk schrieb:
Okay, dann geb ich mal nen Beispiel vor und ihr/du erklärt mir dann bitte warum ihr welche klassen nutzen/erstellen würdet.

So war das nicht gemeint, erstelle ein Klassen modell und wir schauen ob ok. So lernst Du am besten.
 
Genau, anhand des Klassenmodells kann man am besten erkennen wo deine Probleme liegen.
Gerade sowas wie abstraktes denken etc. :)

Geht ja dann schon fast richtung Normalisieren in Datenbanken
 
Ui, so viele Antworten hab ich jetzt nicht erwartet. Vielen Dank dafür. Schade, dass es nicht geklappt hat, dass ihr die Arbeit macht ;) Ich hab mir das Beispiel oben heute morgen in 5 min aus den Fingern gesaugt. Mal sehen, was ich da machen kann. Heute oder morgen wird es wahrscheinlich nichts mit einem Klassendiagramm von mir, weil ich noch etwas anderes fertigstellen muss - konnte ja nicht ahnen, dass so schnell so viele Antworten kommen. Ich werde mein Ergebniss aber die Tage hier posten.
 
ichhalt123 schrieb:
..erkennen wo deine Probleme liegen.
Gerade sowas wie abstraktes denken etc. :)
Sry, aber das sind kein Probleme. Ist einfach viel uebung dabei.

Ausserdem koennen die wenigsten auf Anhieb OOP wirklich konsistent nutzen, andere uebertreiben es sogar und versuchen alles in Klassen abzubilden.



honkitonk schrieb:
Ich werde mein Ergebniss aber die Tage hier posten.

Wir sind gespannt ;)
 
Zurück
Oben