steckl: C++: wie mache ich richtiges OO-Design?

Beitrag lesen

Hi,

Erstmal danke, fuer die Versuche mir das Ganze etwas naeher zu bringen, aber ich bin wohl immernoch ziemlich weit von der Loesung entfernt.

Die Idee dahinter ist, dass du das Verhalten von dem was du programmieren willst erst mal (mündlich oder schriftlich) beschreibst. Aus dieser Beschreibung lässt sich dann relativ einfach ein OO Diagramm ableiten.

Aber wohl nur wenn man darin schon geuebt ist.

(Etwas übertriebenes) Beispiel:
Ein TASCHENRECHNER hat ein EINGABEFELD und ein DISPLAY. Auf dem EINGABEFELD kann ich die ERSTE ZAHL EINGEBEN und die ZWEITE ZAHL EINGEBEN sowie eine RECHENOPERATION FESTLEGEN (+,-,/,*). Wenn ich auf die ERGEBNIS TASTE DRÜCKE zeigt das DISPLAY das ERGEBNIS AN.

Die wichtigen wörter habe ich hier hervorgehoben.
Prinzipiell hast du drei Klassen: Taschenrechner, Eingabefeld und Display. Taschenrechner ist sozusagen das "Überkonstrukt" und wird als Mittler zwischen Display und Eingabefeld fungieren.
Das Eingabefeld hat drei Methoden: setZahl1(int), setZahl2(int) und setRechenmethode(char). (Anmerkung: Eventuell könntest du die Rechenmethode selbst nochmal zu ner Klasse machen, die eine Methode int calculateResult(int, int) hat und dafür sorgt, dass jede Rechenoperation für den Taschenrechner immer identisch ist, aber das wäre für dieses Beispiel nun *wirklich* zu aufwändig)
Des weiteren gibt es noch die Methode calculateResult(), die das Ergebnis ausrechnet und die Methode showResult(int) vom Display, dass zu dem Taschenrechner gehört, zu dem auch das Eingabefeld gehört, aufruft.

Ich habe mal versucht, aus deinem Ansatz ein Klassendiagramm zu machen. Es sieht bis jetzt so aus:
3 Klassen:
-Rechner:
  Enthaelt die Attribute zahl1:int, zahl2:int, rechenart:char und ergebnis:float)
  Fuer jedes Attribut gibt es noch eine entsprechende get- und set-Methode.

  • Eingabefeld
      Enthaelt die Methoden setZahl1(void):void, setZahle2(void):void, setRechenart(void):void und berechne(void):void
      Die set-Methoden haben keine Argumente, weil die Eingabe auf der Kommandozeile erfolgen soll.
      Die berechne-Methode koennte vielleicht auch in die Rechner-Klasse?
  • Display
      Enthaelt die Methode zeigeErg(void):void

Eingabefeld und Display enthalten jeweils noch ein Attribut rechner:Rechner, mit dem sie ueber die get-Methoden von Rechner dann auf dessen Attribute zugreifen koennen.
Ich habe also jeweils eine gerichtete Assotiation von Display, bzw. Eingabefeld auf Rechner (1 zu 1 Beziehung).

So erscheint es mir aber irgendwie unlogisch. Spricht irgendwas dagegen, das alles in eine Klasse zu packen? Weil ich ja eh nur 1 zu 1 Beziehungen habe sollte man das doch zusammenfassen koennen, oder?

Vererbung von Rechner auf die beiden anderen Klassen bringt in diesem Fall wohl auch nichts, weil die beiden ja zur selben Instanz des Rechner-Objekts gehoeren?

Hoffe es ist nicht aussichtslos.

mfG,
steckl