Programmaufbau

Status
Nicht offen für weitere Antworten.

A3XX

Bekanntes Mitglied
Hi

Habe gerade ein sehr interessantes Kapitel wieder mal in meinem Lehrbuch gelesen, nämlich über den Aufbau (verschiedene Klassen etc.) in Java.

Aber ganz schnall ichs noch nicht. Als Übungsaufgabe muss man einen einarmigen Banditen programmieren.Vorgegeben hat er folgende Klassen:

a) SlotMachine (die Hauptklasse, die die weiteren Objektinstanzen erzeugt)
b) accumulatedWin (die zeigt, wie viel der Computer(wenn man verliert, gewinnt immer der Computer) und wie viel der "Human Player" gewonnen bzw. verloren hat)
c) threeNumbers (die Klasse, welche drei Zufallszahlen erzeugt und diese auch anzeigt)
d) immediateWin(die Klasse, welche alle möglichen Kombinationen für einen Gewinn des "Human Players" enthält und schlussendlich herausfindet wer diese Runde gewonnen hat)

Nun, mein Problem ist, wo sind die Daten gespeichert? Da gibt er einem keinen Hinweis.

Ich hab die Daten(also das Spielervermögen) in der Klasse SlotMachine in einem zweidimensionalen Array gespeichert:
player[0][0] -> Computerkonto
player[1][0] -> Player Konto

Wenn man also den "Go" Button klickt werden drei Zufallsnummern in threeNumbers berechnet und direkt an immediateWin übergeben, sowie zwischengespeichert in einer Variable in immediateWin zwischengespeichert, damit Sie dargestellt werden können.

immediateWin ermittelt nun den Gewinner und liefert dies direkt an accumulatedWin zurück. Diese Objektinstanz aktualisiert dann die Konten und liefert sie wieder zurück. Also die Konten sind in SlotMachine gespeichert und werden an alle Methoden etc. übergeben.

DAs ist es eigentlich schon(mein Ansatz). Nun, wo macht es am meisten sinn in so einem Fall die Daten zu speichern? Macht es überhaupt Sinn soviele Klassen zu gebrauchen? Meiner Meinung nach macht es das nur komplizierter.

Bitte helft mir auf die Sprünge.
thx

Gruss
Michael

----------------------------------------------
NACHTRAG
----------------------------------------------

Die nächste Aufgabe ist einen Rechner zu programmieren. Ist ja nicht schwierig. Aber der redet von Klassen. Why?! Ich würde da nur eine machen
 

KSG9|sebastian

Top Contributor
java ist objektorientiert, deshalb ist es immer sinnvol klassen zu machen :)

Zu der Frage nach dem 'warum': Das Ziel ist es, die Daten zu kapseln, nennt sich auch 3-Schichten-Modell und ist so aufgebaut:

Oberfläche (gibt nur sachen aus)
Steuerung ( steuert dein Programm und gibt ausgaben an die Oberfläche weiter)
Datenhaltung ( speichert alle daten damit die steuerung sie abrufen und verarbeiten kann )

D.h. du könntest zum beispiel noch ne Klasse 'spieler' machen, als übergabewert von mir aus den namen des spielers. in dieser klasse speicherst du dann die daten für den spieler, u.a. auch das Konto.
 
B

Beni

Gast
Oje, das sind schwierige Fragen.

Zuerstmal zum Banditen:
Ich verstehe nicht ganz, wieso du einen 2-dimensionalen Array machst. Es sind ja nur zwei Zahlen. Bei sowas kleinem würde ich schon fast einfach zwei normale Variablen nehmen.

Ich würde den Spieler/Computer-Gewinn in der SlotMachine abspeichern. Dann kann man später einfach die SlotMachine benutzen um zu spielen, und muss nichts über ihren inneren Aufbau kennen (dass es jetzt da noch ein threeNumbers, etc gibt, ist ja für den Spieler nicht wirklich wichtig).

Für dieses Problem sind 4 Klassen "genug". Aber man kann so Teile der SlotMachine "austauschen", was eigentlich ganz interessant sein kann. Ausserdem ist es eine Übungsaufgabe, und die sind per Definition unrealistisch :wink:

Zum Rechner
Mein erster wirklich brauchbarer Rechner besteht aus 6 Interfaces und etwa 50 Klassen (hab auch wochenlang daran herumgeschrieben).

Natürlich kannst du alles in eine Klasse quetschen. Aber wenn du das ein bisschen trennst, (z.B. pro Operation eine Klasse), wird es viel einfacher Fehler zu finden, oder neue Möglichkeiten hinzuzufügen.

mfg Beni
 

A3XX

Bekanntes Mitglied
Danke erstmal.

Dann habe ich es also eigentlich richtig gemacht -> Daten in der Hauptklasse, Methoden in den verschiedenen anderen Klassen.

@Beni
Da ich nicht von OO -Sprachen komme, und meistens alles bisschen unschöner aufgebaut war, kann ich diesen Aufbau von gewissen Programmen noch nicht ganz nachvollziehen. Zum REchner: Was packst Du dann in so eine Klasse? Addition -> eine Klasse, Subtraktion -> eine andere Klasse etc.?

Nach welchem Prinzip teilst Du dann die Klassen auf?

Und gibt es dazu noch irgendwas gutes/interessantes/verständliches zum Lesen?
 
O

OO Guru

Gast
Erstmal vorweg - ich bin momentan etwas übermüdet und kann daher für keine sinnvollen Inhalte garantieren.

Beni hat gesagt.:
Ich schreib eigentlich immer eine neue Klasse, sobald ein Teilstück wirklich unabhängig vom Rest ist.

Also ja, für jede Operation eine eigene Klasse.

Sieh dir mal die Java API Dokumentation an.
z.B. die BigDecimal Klasse.
Da haben die doch tatsächlich sämtliche Operationen in die selbe Klasse gepackt, anstatt sie auf zig Klassen aufzuteilen. Die sollten sich mal ein Beispiel an die nehmen und am besten jede einzelne Programmzeile in eine eigene Klasse packen. Dann schaffen sie es auch über die 1 Millionen Klassen Grenze. Die magische Grenze ab der ein Programm wirklich als professionell gilt.

Also merken:
-Je mehr Klassen desto besser.
-Am besten eine Klasse pro Codezeile.
-Extra Punkte gibt es wenn du es schaffst eine Codezeile auf mehrere Klassen zu verteilen.
-Punktabzug für die Verwendung einer neuen Instanz einer bereits vorhandenen Klasse, wenn man genausogut auch eine ganz neue Klasse erstellen könnte.
-Massiver Punktabzug für das Nutzen von mehr als einer Methode pro Klasse.

Für deinen einarmigen Banditen heisst das also, eine neue Klasse für jede der möglichen Kombinationen.
Wenn du z.B. 3 Zufallszahlen hast und jede liegt zwischen 1 und 7 dann hast du schon 7 hoch 3 = 343 Kombinationen. Da kannst du richtig viele Klassen machen. Wow. Da wird jeder, der das sieht sofort begeistert sein.

Frage an alle: Gibt es eigentlich einen obfuscated OO Contest?

@Beni: Tschuldigung. War nicht perönlich gemeint.
 

Jaraz

Bekanntes Mitglied
Hast du OO Troll dir das Programm überhaupt angeschaut, bevor du uns hier mit deinem Sarkasmus beglückst?

Falls ja, was ich allerdings stark bezweifle, könntest du uns ja mal erklären wie du das anders gemacht hättest.

Gruß Jaraz
 
B

Beni

Gast
:lol: nur keine Angst, ich nimm das nicht persönlich.

Aber eine Erklärung wie Jaraz sie will, würde mich auch interessieren.

mfg Beni
 

A3XX

Bekanntes Mitglied
Also jede Operation eine eigene Klasse..ok. Bin eben im Geschäft, deswegen kann (darf) ich momentan dein File nicht anschauen.

Mach ich dann am Abend.
Aber dann machst du:

z.B. Subtraktion sub = new Subtraktion(13, 14);

sub.display(g); ?

Oder wie?
 
B

Beni

Gast
Nein nein, das ist alles rein textbassiert.

Ich habe alle möglichen Operationen in einem Array. Sobald der Parser eine Zeichenfolge findet, die einer Operation entspricht, wird diese Operation genommen, und eine Methode mit dem entsprechenden Argumenten aufgerufen (im Sinne von addition.calc( double a, double b) )
 

A3XX

Bekanntes Mitglied
aber soweit ich das jetzt verstehe, ist es am optimalsten so:

a) eine Klasse (z.B. mit dem Applet), die eine Instanz einer "Hauptklasse" (b) aufruft. Je nach Event ruft es Methoden der Hauptklasse auf
b) die Hauptklasse, die zum einen alle Daten enthält und zum anderen viele verschiedene einezelne Objektinstanzen erzeugt.
c) die vielen verschiedenen Einzeklassen
...

verstehe ich das soweit richtig?
 
O

OO Guru

Gast
Beni hat gesagt.:
:lol: nur keine Angst, ich nimm das nicht persönlich.

Aber eine Erklärung wie Jaraz sie will, würde mich auch interessieren.

mfg Beni

Nun, in deinem Programm macht es durchaus noch Sinn, obwohl ich mich frage wieso die Methoden nicht static deklariert sind.
Ich denke ich würde das vielleicht so abändern, dass man beliebig viele Operationen in eine Klasse packen kann.
Die Klassen könnten dann so heissen: Arithmetik.class, Trigonometrie.class
Oder man nimmt doch eine Klasse pro operation aber kappselt das mehr.
z.B.

Code:
public class BasicArithmetic {

  private static String[] signs=new String[] { "+", "-", "*", "/" };
  
  public static containsOperation(String op) {
    for(int i=0; i<signs.length; i++)
        if(op.equals(signs[i])) return true;
    return false;
  }
  
  public static Operation getOperation(String op) {
  
     if(op.equals("+")) return new Operation() {
        public double calc(double[] left, double[] right) {
           return left[0] + right[0];
        }
     };
     
     else if(op.equals("-")) return new Operation() {
        public double calc(double[] left, double[] right) {
           return left[0] - right[0];
        }
     };
     
     else if(op.equals("*")) return new Operation() {
        public double calc(double[] left, double[] right) {
           return left[0] * right[0];
        }
     };
     
     else if(op.equals("/")) return new Operation() {
        public double calc(double[] left, double[] right) {
           return left[0] / right[0];
        }
     };
  }
}
 
B

Beni

Gast
@A3XX

Ich denke schon, dass das so funktioniert. (Man könnte für die Daten noch eine Klasse schreiben, aber das ist dann schon ein bisschen übertrieben für diese Aufgabe).

Probier doch verschiedene Möglichkeiten aus, dann findest du am ehsten heraus, welche Variante am besten geht.

@OO Guru
Wäre auch eine Möglichkeit, mit static.
Über solche Details kann man sich dann natürlich unendlich lange streiten, persönlich habe ich eine Abneigung gegen static, weil man "normale" Methoden einfacher Überschreiben, und so auch ganze Klassen ersetzen kann. (Und Interfaces haben static auch nicht so gerne).

Werde das vielleicht bei der nächsten Variante so machen, das Zusammenfassen ist eine gute Idee.

mfg Beni
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben