Java Programm Objektorientiert programmieren?

Status
Nicht offen für weitere Antworten.

BoZA

Mitglied
Hi,

das ist mein erster Post also biite nicht gleich schimpfen.

Ich studiere Wirtschaftsinformatik in Berlin und muss sehr viel in Java programmieren.
Ich musste nun ein Projekt abgeben und mir wurde vorgeworfen das ich prozedural programmiere.

Nur leider kann ich mir nix weiter unter OOP vorstellen. Könnt ihr mir vllt. dabei helfen?
Achja meine Dokumentation wurde auch bemängelt. Habe schon viel bei google.de gesucht und viel nachgelesen. Nur leider weiß ich auch nicht, wie ich was richtig kommentieren soll.

Für eure hilfreichen Tipps würde ich euch sehr dankbar seine.

Ich stelle mal mein Programm hier rein.

Klasse Generator
Code:
import java.io.IOException;
/** Die Klasse [i]Generator[/i] 

* Ist die Klasse in der das Objekte Var sowie Ran anlegt wird

* [i]----- Kurzbeschreibung der Klasse -----[/i]
* @author xy
* @version Aufgabe xy */
public class Generator
{ /** Das private Attribut [i]Variablen[/i] erzeugt das neue Objekt [i]Var[/i] mit dem Startwert "null" */
  private Variablen Var = null;
  /** Das private Attribut [i]MeinRandom[/i] erzeugt das neue Objekt [i]Ran[/i] mit dem Startwert "null" */
  private MeinRandom Ran = null;
  /** Das private Attribut [i]ZufallX[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"[/i]*/
  private int ZufallX = 0;
  /** Das private Attribut [i]ZufallY[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"[/i]*/
  private int ZufallY = 0;
  /** Das private Attribut [i]AdditionsErgebnis[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"[/i]*/
  private int AdditionsErgebnis = 0;
  /** Das private Attribut [i]MultiplikationsErgebnis[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"[/i]*/
  private int MultiplikationsErgebnis = 0;
  /** Der Oeffentliche Konstruktor [i]Generator[/i] legt die folgenden Methoden an
   *  trageRanAngabenEin(); trageRandomEin(); legeAdditionAn(); legeMultiplikationAn(); schreibeRechnungen(); legeGroesserKleinerAn(); legeUngleichAn(); 
   *  trageVarAngabenEin() sowie VergleicheErgebnisse();*/  
  public Generator() throws IOException
  {
  	trageRanAngabenEin();
  	trageRandomEin();
  	legeAdditionAn();
  	legeMultiplikationAn();
  	schreibeRechnungen();
  	legeGroesserKleinerAn();
  	legeUngleichAn();
  	trageVarAngabenEin();
  	VergleicheErgebnisse();
  }
  /** Die Oeffentliche Methode [i]schreibeRechnungen[/i] besitzt Attribute der MeineAusgabe.Class um die Rechnung auszugeben  */
  public void schreibeRechnungen() throws IOException
  {
  	MeineAusgabe.schreibeString("Ich habe zwei ganze Zahlen x und y zwischen 1 und 20 erzeugt!\n\n");
  	MeineAusgabe.schreibeString("Es ist x + y = ");
  	MeineAusgabe.schreibeInt(AdditionsErgebnis);
  	MeineAusgabe.schreibeString(".\nEs ist x * y = ");
  	MeineAusgabe.schreibeInt(MultiplikationsErgebnis);
  	MeineAusgabe.schreibeString(".\nEs ist x ");
  }
  /** Die private Methode [i]legeAdditionAn[/i] rechnet [i]AdditionsErgebnis = ZufallX + ZufallY[/i]*/
  private void legeAdditionAn() throws IOException
  {
  	AdditionsErgebnis = ZufallX + ZufallY;
  }
  /** Die private Methode [i]legeMultiplikationAn[/i] rechnet [i]MultiplikationsErgebnis = ZufallX * ZufallY[/i]*/
  private void legeMultiplikationAn() throws IOException
  {
  	MultiplikationsErgebnis = ZufallX * ZufallY;
  }
  /** Die private Methode [i]legeGroesserKleinerAn[/i] beinhaltet 4 if Bedingungen von der bei Übereinstimmung ein Ergebnis ausgegeben wird[/i]*/
  private void legeGroesserKleinerAn() throws IOException
  {
  	if(ZufallX < ZufallY)
  	{
  	  MeineAusgabe.schreibeString("< y.\n");
  	}
  	else if(ZufallX <= ZufallY)
  	{
  	  MeineAusgabe.schreibeString("<= y.\n");
  	}
    else if(ZufallX > ZufallY)
  	{
  	  MeineAusgabe.schreibeString("> y.\n");
  	}
  	else if(ZufallX >= ZufallY)
  	{
      MeineAusgabe.schreibeString(">= y.\n");
  	}
  				
  }
  /** Die private Methode [i]legeUngleichAn[/i] beinhaltet 1 if Bedingung und eine else Bedingung von der bei Übereinstimmung ein Ergebnis ausgegeben wird[/i]*/
  private void legeUngleichAn() throws IOException
  {
  	if(ZufallX != ZufallY)
  	{
  	  MeineAusgabe.schreibeString("Es ist x != y.\n\n");
  	}
  	else if(ZufallX == ZufallY)
  	{
  	  MeineAusgabe.schreibeString("Es ist x = y.\n\n");
  	}
  }
  /** Die Oeffentliche Methode [i]legeVergleicheErgebnisse[/i] beinhaltet 1 if Bedingung und eine else Bedingung von der bei Übereinstimmung ein Ergebnis ausgegeben wird[/i]*/
  public void VergleicheErgebnisse() throws IOException
  { 
  	if(ZufallX==Var.liefereX() && ZufallY==Var.liefereY())
  	{
  	  MeineAusgabe.schreibeString("Sehr gut! Sie haben die Zahlen erraten!");
  	}
  	else
  	{
  	    MeineAusgabe.schreibeString("Ihre Antwort ist leider flasch! Hier ist die richtige Antwort: (");
  	    MeineAusgabe.schreibeInt(ZufallX);
  	    MeineAusgabe.schreibeString(",");
  	    MeineAusgabe.schreibeInt(ZufallY);
  	    MeineAusgabe.schreibeString(")");
  	}	
  }
  /** Die private Methode [i]trageRandomEin[/i] erzeugt die Zufallszahlen[/i]*/
  public void trageRandomEin() throws IOException
  {
  	ZufallX = Ran.nextInt(1,20);
  	ZufallY = Ran.nextInt(1,20);
  }  
  /** Die Private Methode [i]trageVarAngabenEin[/i] legt das neue Objekt [i]Var[/i] der Klasse [i]Variablen[/i] an  */
  private void trageVarAngabenEin() throws IOException
  {
  	Var = new Variablen();
  }
  /** Die Private Methode [i]trageRanAngabenEin[/i] legt das neue Objekt [i]Ran[/i] der Klasse [i]MeinRandom[/i] an  */
  private void trageRanAngabenEin() throws IOException
  {
  	Ran = new MeinRandom();
  }
}
Klasse GeneratorMain
Code:
import java.io.IOException;
 /** Die Klasse [i]GeneratorMain[/i] 

* Ist die Hauptklasse in der das Objekte Gen anlegt wird

* [i]----- Kurzbeschreibung der Klasse -----[/i]
* @author xy
* @version xy */
public class GeneratorMain
{   /** Die statische Methode [i]main[/i] dient als Startpunkt der Applikation 
    *  Der Java-Interpreter lädt beim Starten das angegeben Klassenobjekt.
    *	 In diesem Fall [i]new Gleichung[/i]
    */	
  public static void main(String[] args) throws IOException
  {
    Generator Gen = new Generator(); 
  }
}

Klasse MeineAusgabe
Code:
import java.text.DecimalFormat;
/** Die Klasse [i]MeineAusgabe[/i] 
ist die Klasse, die den eingegebene Text ausgibt

* [i]----- Kurzbeschreibung der Klasse -----[/i]
* @author xy
* @version xy */
public class MeineAusgabe
{ /** Die Oeffentliche statische Methode [i]DecimalFormat[/i] erstellt die Variable [i]zahlAchtstellen[/i] welche das
    * Objekt [i]new DecimalFormat("#.#")[/i]*/
  private static DecimalFormat zahlZweistellen = new DecimalFormat("#.#");
  /** Die statische Methode [i]schreibeString(String Text)[/i] [i]---- Gibt die Anweisung,
  * den Text auf dem Bildschrim auszugeben[/i] */	
  public static void schreibeString(String text)
  {
    System.out.print(text);
  }
  /** Die statische Methode [i]schreibeDouble(double zahl)[/i] [i]---- Gibt die Anweisung,
    * die Zahl auf dem Bildschrim auszugeben[/i] */
  public static void schreibeDouble(double zahl)
  {
    System.out.print(zahlZweistellen.format(zahl));
  }
  /** Die statische Methode [i]schreibeInt(int zahl)[/i] [i]---- Gibt die Anweisung,
    * die Zahl auf dem Bildschrim auszugeben[/i] */
  public static void schreibeInt(int zahl)
  {
  	System.out.print(zahlZweistellen.format(zahl));
  }
}

Klasse MeineEingabe
Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
/** Die Klasse [i]MeineEingabe[/i] 

* Kann Eingaben einlesen

* [i]----- Kurzbeschreibung der Klasse -----[/i]
* @author xy
* @version xy */
public class MeineEingabe
{/** Die statische Methode [i]BufferedReader[/i] ist ein Filter der die Performance beim Lesen von ext. Datein erhöht */
 private static BufferedReader eingabe =
 	new BufferedReader(new InputStreamReader(System.in));
 /** Die statische Methode [i]erfasseText[/i][i] Kann den Text einlesen[/i]*/		
 public static String erfasseText() throws IOException
 {
  return eingabe.readLine();
 }
 /** Die statische Methode [i]erfasseInt[/i][i]Kann ganze Zahlen einlesen[/i]*/
 public static int erfasseInt() throws IOException
 {
  return Integer.parseInt(erfasseText());
 }
 /** Die statische Methode [i]erfasseDouble[/i][i]Kann Komma Zahlen einlesen[/i]*/
 public static double erfasseDouble() throws IOException
 {
  return Double.parseDouble(erfasseText());
 }
}

Klasse MeinRandom
Code:
import java.util.Random;
/** Die Klasse [i]MeinRandom[/i] 

* Ist die Klasse die Zufallszahlen ermittelt werden

* [i]----- Kurzbeschreibung der Klasse -----[/i]
* @author xy
* @version xy */
public class MeinRandom extends Random
{/** Der Oeffentliche Konstruktor [i]MeinRandom[/i] legt die folgenden Methoden an
   *  super();[/i]*/
  public MeinRandom()
  {
  	super();
  }
  /** Die Oeffentliche Methode [i]nextInt[/i] erzeugt die Zufallszahl*/
  public int nextInt(int min, int max)
  {
  	return this.nextInt(max - min + 1) + min;
  }
}

Klasse Variablen
Code:
import java.io.IOException;
/*  Die Klasse [i]Variablen[/i] 

* Ist die Klasse in der die privaten Atrribute x, y,exsistieren

* [i]----- Kurzbeschreibung der Klasse -----[/i]
* @author xy
* @version xy */
public class Variablen
{ /** Das private Attribut [i]x[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"[/i]*/
  private int x = 0;
  /** Das private Attribut [i]y[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"[/i]*/
  private int y = 0;
  /** Der Oeffentliche Konstruktor [i]Variablen[/i] legt die folgenden Methoden an
   *  [i]leseXEin[/i], [i]leseYEin[/i]*/		
  public Variablen() throws IOException
  {
	leseXEin();
	leseYEin();
  }
  /** Die Oeffentliche Methode [i]liefereX[/i] gibt den Rückgabewert von [i]x[/i] an*/
  public int liefereX()
  {
  	return x;
  }
  /** Die Oeffentliche Methode [i]liefereY[/i] gibt den Rückgabewert von [i]y[/i] an*/
  public int liefereY()
  {
  	return y;
  }
  /** Die private Methode [i]leseXEin[/i] liest [i]x[/i] ein */
  private void leseXEin() throws IOException
  {
  	MeineAusgabe.schreibeString("Welchen Wert hat x? ");
  	x = MeineEingabe.erfasseInt();
  }
  /** Die private Methode [i]leseYEin[/i] liest [i]y[/i] ein */
  private void leseYEin() throws IOException
  {
  	MeineAusgabe.schreibeString("Welchen Wert hat y? ");
  	y = MeineEingabe.erfasseInt();
  }
}

MfG

BoZA
 
/** Die private Methode legeUngleichAn beinhaltet 1 if Bedingung und eine else Bedingung von der bei Übereinstimmung ein Ergebnis ausgegeben wird*/[/i]

:shock:

1) Welche Übereinstimmung? Bedingung des if's oder des else's?
2) Was für ein Ergebnis wird ausgegeben?

Sorry, aber diese Art Kommentar ist wirklich nichtssagend. 🙁
 
Leroy42 hat gesagt.:
/** Die private Methode legeUngleichAn beinhaltet 1 if Bedingung und eine else Bedingung von der bei Übereinstimmung ein Ergebnis ausgegeben wird*/[/i]

:shock:

1) Welche Übereinstimmung? Bedingung des if's oder des else's?
2) Was für ein Ergebnis wird ausgegeben?

Sorry, aber diese Art Kommentar ist wirklich nichtssagend. 🙁

Absolute kein Problem!!

Sogar fördernd!!

zu 1) Wenn if bei der Bedingung ZufallX ungleich gegenüber ZufallY so wird...
zu 2) ..."Es ist x != y.\n\n" ausgegeben

Okay danke für den Link aber was genau ist damit gemeint?
Soll ich in der Main Klasse OOP alle Objekt erzeugen und dann ausgeben?

MfG BoZA und Danke für eure Hilfe im voraus
 
BoZA hat gesagt.:
Ich weiß nicht in wie fern man das dokumentieren soll bzw. in wie weit man ins detail gehen soll, wollte es etwas allgemeiner machen.
Auf gar keinen Fall im Kommentar das schreiben, was aus dem Quelltext ohnehin ersichtlich ist.
Code:
Das private Attribut [i]ZufallX[/i] hat den Datentyp [i]int[/i] und den Startwert [i]"0"
Das ganze ist im Code kürzer und lesbarer. Ein Kommentar muss das sagen, was aus dem Coder nicht so ohne weiteres ersichtlich ist. Er muss eine logische Sicht beschreiben. Wozu ist Zufall gut? Wofür wird diese Variable benötigt? Was sagt sie aus?

Im Fall von Methoden: Was soll die Methode machen (aus fachlicher Sicht), nicht wie macht sie es. Bsp:
Code:
/** Die private Methode [i]leseYEin[/i] liest [i]y[/i] ein */
In Kommentaren nie den Methoden-, bzw. Variablennamen wiederholen. Was ist y? Welche Bedeutung hat y? Ist es Teil einer Koordinate?

Um gute Kommentare zu schreiben, schau dir einfach die Java API an. Diese kannst du in der Regel als gutes Beispiel nehmen und dich daran orientieren. Die Dokumentation zu javadoc kann dir auch gut dabei helfen, gute Kommentare zu schreiben.

BTW: Variablennamen sollten klein geschrieben werden.
 
cool Danke hupfdule... werde ich mir näher anschauen... habe ich vorher nicht gewusst bzw. die Sun Seite war mir immer etwas zuviel für den ersten Blick.


Aber jetzt noch zu dem OOP.

Soll ich aus der Main Klasse alle anderen Klassen ansprechen können. Ich soll auch keine Klassen erstellen die reine Datenhalter sind :shock:

Was fällt euch dazu ein?

MfG BoZA
 
BoZA hat gesagt.:
Soll ich aus der Main Klasse alle anderen Klassen ansprechen können.
Nicht zwangsläufig. Kommt auf die Anforderungen an. Wichtig ist, dass durch Klassen klar definierte Zuständigkeiten haben.

Ich soll auch keine Klassen erstellen die reine Datenhalter sind
Das finde ich doch recht fragwürdig. Es gibt quasi in jedem Programm Klassen, die nichts anderes tun, als zusammengehörige Daten zusammenzufassen, damit man diese als einzelne Objekte behandeln kann.
Aber vermutlich ist damit gemeint, dass man den Objekten auch sinnvolle Methoden geben soll.

Im Großen und Ganzen kann ich zu deinem Code nicht sagen, was verbessert werden könnte, da es mir zu viel zum Lesen ist und mir nicht klar ist, was dein Code denn überhaupt tun soll. (Mit guten Kommentaren wäre das anders gewesen. ;-))
 
Variablennamen schreibt man klein.
Die Klasse "Variablen" und "MeinRandom" sind IMHO ziemlich überflüssig. Statt die Methoden leseXEin/leseYEin in die Variablen-Klasse zu legen, könntest du in der MeineEingabe-Klasse auch eine Methode anbieten wie
Code:
public int erfasseInt(String name)
{
     MeineAusgabe.schreibeString("Welchen Wert hat "+name+"? ");
     return MeineEingabe.erfasseInt();     
}
oder die Ausgabe direkt dort machen, wo auch die Eingabe hingeht.

Was schon kritisiert wurde:
/** Die private Methode legeGroesserKleinerAn beinhaltet 4 if Bedingungen von der bei Übereinstimmung ein Ergebnis ausgegeben wird*/ [/i]
Sollte eher sowas sein wie

/**
* Schreibt einen String, der angibt, ob ZufallX größer, größergleich, kleiner oder kleinergleich ZufallY ist
*/

(oder so).

Solche Kleinigkeiten wie
Der Oeffentliche Konstruktor Generator legt die folgenden Methoden an ...
dass Methoden nicht "angelegt" werden, und es keinen Sinn macht, den Code im Kommentar in textueller Form vorwegzunehmen, wurde schon gesagt...
 
Das Problem was man vom Umstieg von Prozeduraler auf OOP hat.. ist sich unter Objekten und Klassen nichts wirkliches vorstellen zu können. Klassen sind nichts greifbares sondern eher ein Bauplan.

Objekte dagegen sind Abbildungen (Instanzen) die nach der Klasse konstruiert werden. Ich kenne leider deinen Kenntnisstand nicht aber hier mal ein nettes OOP Tutorial von Jolinah aus dem B-Forum... ist eigentlich für BlitzMax gedacht aber könnte dir vllt weiterhelfen!

http://zehr.de/downloads/BlitzMax-OOP.pdf

Nur soviel vorab: Java ist streng objektorietiert was heissen soll dass du ohne dich damit zu beschäftigen nicht weit kommen wirst. Vererbung, Überschreiben (Overwrite), Überladen (Overload) sind sachen die du mal Googlen solltest weil sie eben Elementar für die Objektorientierung sind.

Grüße
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben