Java Schön/Sauber und OO programmieren? Mal paar Fragen... + Inspiration gesucht :)

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo,

man macht eine Klasse, schreibt eine Main Funktion rein und klatsch ALLES, aber wirklich alles was man codet da rein => unschön, unsauber, nix OO - kennt ihr das? Ja, so haben wir doch alle mal angefangen zu programmieren :) Leider programmiere ich noch zu oft auf diese art und weise. Nagut, die Pascal und VB Zeiten sind vorbei, wenn ich mit Java genau so coden würde, dann wäre das natürlich Fatal. "Man soll in Java so viele Klassen machen wie es nur geht", wurde mir geraten, schließlich macht das dann die ganze Code schöner + später ist es leichter Sachen zu ändern. Das ist mir eigentlich auch klar, aber irgendwie arbeite ich dennoch recht unschön und nicht OO - irgendwie bin ich froh, dass ich ein Programm schreiben kann, was das macht was ich möchte und richtig funktioniert, dabei ist mir leider egal wie das gecodet wurde, hauptsache es funktioniert. So kann das nicht wirklich weiter gehen :/

Nehmen wir mal an, ich möchte Schön + OO loslegen. Dann schreibe ich mir erstmal eine Klasse Main. Von da aus sollen dann die anderen Klassen aufgerufen werden. Das ist schon mal schön oder? - Ich betrachte mal Klassen wie Funktionen... ist das okey? Nehmen wir an ich arbeite nicht OO und habe quasi nur eine "Klasse". Dann schreibe ich da viele viele Funktionen und die werden durch die Main Funktionen alle einzel aufgerufen, so müsste man das auch unter Java mit Klassen machen(?) Also wiegesagt habe ich eine Main Klasse und möchte das genau so machen. Leider klappt das noch nicht so ganz. In Pascal/C oder sonstwo würde man das so schreiben:

PHP:
int rechnung(int zahl) {

  zahl = zahl * zahl;

  return zahl;
}

int main() {

  int i = 5;

  printf("ausgabe von i mal sich selbst: ", int rechnung(i));

  return 0;
}

Okey das mag jetzt nicht perfekt sein, aber ich hoffe ihr versteht das. Also hier klatsche ich nicht alles in meine Main rein, sondern baue dafür extra Funktionen. Nehmen wir an, das möchte ich jetzt mit Java auch so machen, nur mit den Klassen. Gut sagen wir mal ich habe meinen Class Main wo ich nicht wirklich weiß was ich rein schreiben soll, ausser eine mainfunktion:

PHP:
public class Main {

	public static void main(String[] args) {
		
		
	}
}

Dann mache ich mir noch eine zweite Klasse, wo die Rechnung durchgeführt werden soll:

PHP:
public class Rechnung {

	public static void main(String[] args) {
		
		int i = 5;
		
		i = Rechnung(i);
		
		System.out.println("Ausgabe von i mal i:"+ i);	
	}
	
	public static int Rechnung(int zahl) {
		
		zahl = zahl * zahl;
		
		return zahl;
	}
}

1. Ich weiß nicht wie ich von meine Main Klasse aus die Klasse Rechnung aufrufen kann 2. Wenn ich jetzt aus der Klasse Rechnung starte, funktioniert das ganz toll nur wurde mir auch gesagt, dass man immer zusehen sollte ohne static zu arbeiten. Wie könnte man das ganze jetzt ohne public static int Rechnung machen? (also dass da nur "public in Rechnung(int zahl)" steht? Wäre das sonst okey so weiter zu machen bzw. der richtige weg zum schönen und OO programmierung?

Habe dann noch etwas, wie müsste das ganze aussehen, wenn ich jetzt schon von der Klasse Main aus die Zahlen mitgeben möchte? Weil in mein Beispiel kommen ja die Zahlen erst ab der Klasse Rechnung, da kann man alles ändern usw. - das wäre doch eigentlich noch schön schon bei der Klassenaufruf von Rechnung eigene Zahlen mitgeben zu können oder?

Tja... bevor ich jetzt noch weitere Sachen schreibe, warte ich mal auf die viele Verbesserungsvorschläge :) und ja natürlich lese ich die Tutorials, aber zu oft scheint das mit den einfachsten Sachen nicht zu klappen. Das Open Book: Java ist auch nur eine Insel ist wirklich sehr schön, aber daraus konnte ich immer noch richtig sauber und OO Java programmieren :/ Eig. habe ich schon ein Programm was läuft nur möchte ich das schöner und OO gestalten. Mir fällt schön + OO zu programmieren schwerer als die eigentliche Aufgabe (jetzt nur vom Programmablauf) hinzukriegen, was natürlich sehr schade ist

Danke schonmal für die tips!

Gruss
 
Naja zunächst einmal: Stell dir die Frage/Beantworte die Frage was objektorientiertes Programmieren eigentlich ausmacht... Du hast einen wesentlichen Vorteil in deinem Post schon erwähnt: die einfache Editierbarkeit im Nachhinein.
Grundsätzlich wird das erreicht durch eine übersichtliche Strukur, ein sinnvolles Auslagern von Funktionen und Klassen und der sinnvolle Einsatz von Beziehungen(Vererbungen/Polymorphismus).

Deine Ideen dazu sind schon mal gar nicht schlecht. Allerdings würde ich dir im Bezug auf dein Problem folgendes empfehlen:
Wenn du ein Problem gestellt bekommt, welches es zu lösen gilt, mach dir im Vorfeld Gedanken welche Steps/Milestones du zur Lösung des Problem brauchst und implementiere diese nacheinander. Fange nicht an parallele Baustellen zu eröffnen sofern diese nicht notwendig sind. Lass dir sinnvolle Klassennamen/Bezeichner einfallen und arbeite mit Standardzugriffsmethoden. Deklariere Variablen grundsätzlich private, ausser du musst diese public machen.

Mein Problem bei deinem Beispiel ist dass man nicht ohne weiteres ins Detail gehen kann, da der Umfang einfach viel zu klein ist und nur die objektorientierten Methoden/Praktiken im Ansatz veranschaulicht werden können.

"Objektorientierter" könnte es wie folgt aussehen:
Code:
public class Calculation {
	
	/**
	 * 
	 * @param val a number to multiply with
	 * @return the result when multiplying val with itself
	 */
	public int multiply(int val){
		return val * val;
	}

}



public class ProgrammMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// Instanziierung der Klasse Calculation
		Calculation c = new Calculation();
		
		// entweder
		System.out.println(c.multiply(5));
		
		// oder erst in variable sichern und dann ausgeben:
		int result = c.multiply(5);
		System.out.println(result);	
	}

}

So, das ist jetzt bei einer solch einfachen Anwendung vielleicht ein bisschen mit Kanonen auf Spatzen schießen... Desto komplexer allerdings die Anwendungen werden, desto dankbarer bist du dafür, dass du dir möglichst wenig Code anschauen musst wenn Änderungen vornimmst oder Features dazu implementierst.

Achja eine Kleinigkeit die mir spontan einfällt:
Ich arbeite momentan an einem Projekt, nennt sich JIRA. Ich muss leider feststellen dass die die Entwickler nicht viel beim Coden gedacht haben, da auf 100 Zeilen Code maximal eine Zeile Kommentar kommt, stellenweise. Das ist ziemlich nervig, denn Programme von solcher Komplexität gehören nunmal ordentlich dokumentiert.
Dies möchte ich dir auch von vorne rein ans Herz legen. Wenn du kommentierst, dann schreibe nicht ellenlange Sätze und auch nicht was du machst, sondern warum du es machst. Das fällt dir am Anfang sicher ein bisschen schwer, aber glaub mir, wenn du dir von vorne rein einen ordentlichen Programmierstil angewöhnst, hast du es später leichter deinen eigenen Code zu lesen und zu verstehen und andere natürlich auch. Benutze hierzu am besten Javadoc. Aber das ist Geschmackssache muss man ehrlich sagen...

Ansonsten viel Spass beim Coden! :)
 
Zuletzt bearbeitet:
Hi,

danke für die Erklärungen!

Firestorm- schrieb:
...wenn du dir von vorne rein einen ordentlichen Programmierstil angewöhnst, hast du es später leichter deinen eigenen Code zu lesen und zu verstehen und andere natürlich auch.

Ja das Problem ist, dass ist vorne rein eine schlechte Stil angewöhnt habe ;) ... aber um das zu ändern ist ja mein Ziel

Gruss

Edit: Natürlich freue ich mich über weitere Anregungen :) , jeder sieht das ganze anders und erklärt es auch so.
 
Zuletzt bearbeitet:
Also ich finde, man sollte bevor man anfängt zu programmieren sich gedanken über das Problem machen, welches man probiert zu lösen. Immerhin geht es ja bei OOP darum ein Problem mit Hilfe von Objekten zu lösen, sprich die reale Welt durch Objekte abzubilden. Hat man die wesentlichen Objekte identifiziert, die am Problem "beteiligt" sind, gilt es deren Verantwortlichkeiten zu klären, sprich welche Aufgabe sie übernehmen. Auch muss man sich überlegen, welche Informationen diese Objekte speichern sollen, welche Zustände sie einnehmen können und welche Schnittstellen diese Objekte haben, um ihre Informationen nach außen zu tragen^^. Mit einem Blatt Papier lässt sich diese Plannung oftmals schon gut durchführen. Wenn man dann noch "Patterns" kennt und andere "Best Practises" kann man meist schon ein gutes OO Design auf die beine stellen.
 
Kauf dir (wie ich) ein Whiteboard, hänge es dir an die Wand und schreibe erstmal auf was alles (evtl. auch schon wovon) bearbeitet werden soll, also den gesamten Funktionsumfang.
Dann gehst du hin, legst deine einzelnen Komponenten fest und verteilst die Funktionen darauf. Letzter Schritt ist dann die Umsetzung.
Notfalls gehen auch DinA3-Blätter. Aber das war mir persönlich dann auf Dauer zu viel Papierkram. ^^
 
kelox schrieb:
Immerhin geht es ja bei OOP darum ein Problem mit Hilfe von Objekten zu lösen, sprich die reale Welt durch Objekte abzubilden.

Ja, das ist was mir noch schwer fällt. Alles als Objekte anzusehen... die Welt als voller Objekte zu sehen, für mich ist ein Buch und Messer ein Objekt :)

Cyba_Mephisto schrieb:
Kauf dir (wie ich) ein Whiteboard, hänge es dir an die Wand ...

Hej! Genau an sowas dachte ich auch mal ;) ... ich schmiere eigentlich sehr viel zeug auf Blättern und das nervt, vorallem ist das reine verschwendung, da ich die am ende eh wegwerfe. Leider ist mein Zimmer recht klein... aber sowas wäre echt nicht schlecht.
 
@Zeboo:

"Die Welt als Objekte sehen"...

Dazu ein kleiner Tipp wenn du eine Problemstellung vor dir liegen hast:
Generell handelt es sich um eine mehr oder weniger ausführliche Spezifikation. Aus dieser Spezifikation identifizierst du die Substantive und nimmst an das dies deine Klassen sind. Anschließend überlegst du dir anhand der Spezifikation was diese "Substantive können müssen" und welche Eigenschaften sie besitzen; daraus ergeben sich deine Methoden und Attribute. Im Folgenden könntest du dir noch überlegen wie man eine sinnvolle und übersichtliche Struktur einarbeitet, beispielsweise Vererbung, generische Klassen, etc...
 
Zeboo schrieb:
Hej! Genau an sowas dachte ich auch mal ;) ... ich schmiere eigentlich sehr viel zeug auf Blättern und das nervt, vorallem ist das reine verschwendung, da ich die am ende eh wegwerfe. Leider ist mein Zimmer recht klein... aber sowas wäre echt nicht schlecht.

60*90cm sind nicht soooo groß, dass ein kleines Zimmer nicht reichen würde. Hab´ glaube ich 60€ bezahlt für das Teil, ist noch mit dieser Magnetknopf-Funktion.
 
Zeboo schrieb:
1. Ich weiß nicht wie ich von meine Main Klasse aus die Klasse Rechnung aufrufen kann 2. Wenn ich jetzt aus der Klasse Rechnung starte, funktioniert das ganz toll nur wurde mir auch gesagt, dass man immer zusehen sollte ohne static zu arbeiten. Wie könnte man das ganze jetzt ohne public static int Rechnung machen? (also dass da nur "public in Rechnung(int zahl)" steht? Wäre das sonst okey so weiter zu machen bzw. der richtige weg zum schönen und OO programmierung?
Ein klassisches Missverständnis, das viele haben die mit Java programmieren lernen. Es ist keine gute Lösung objektorientiert der um Objektorientierung willen zu programmieren. Dein Problem erfordert nunmal keine Klassen und da jetzt krampfhaft eine Vererbungshierarchie drumherum aufbauen zu wollen ist keine gute Idee. Was du willst ist eine Funktion, da Java keine Funktionen kennt, musst du statische Methoden nehmen, objektorientiert wird das ganze davon aber nicht. Du hast das in deinem Beispiel schon gut gelöst.

Aufrufen sollte so in der Art funktionieren:
PHP:
import Rechnung;

public class Main { 

    public static void main(String[] args) { 
          Rechnung.Rechnung(3)
    } 
}
Aber das sollte auch in jedem Java-Buch stehen.
 
Rossibaer schrieb:
Ich kann mich da täuschen aber das sieht aus wie die deutsche Ausgabe von Head First Design Patterns:

Entwurfsmuster von Kopf bis Fuß

Grüße

... und es kostet nur knapp 14€ mehr wie die englische, also nur 49€ :> Ich finde es gibt onlinetutorials die reichen müssten
 
... und es kostet nur knapp 14€ mehr wie die englische, also nur 49€ :> Ich finde es gibt onlinetutorials die reichen müssten
Der Preis/Buch ist Geschmackssache, ich würde an Stelle von Zeboo, eh erstmal schauen ob es da günstigere Anbieter als amazon gibt, z.B. buch.de, wenn ich Geld für ausgeben möchte. Vielleicht gibt es auch eine Bibliothek in der Nähe, die das Buch hat, dann wäre es für 4 Wochen kostenlos oder gegen geringe Gebühr. Man kann sich ja dann später entscheiden, ob man das Buch auch wirklich braucht. Ich bin da eher der Typ, der mehr auf die dicken Wälzer in klassischer Schreibweise steht...

Onlinetutorials sind brauchbar, wenn man zumindest einen groben Einblick in die Materie hat und sich somit speziell raussuchen kann, was man braucht. Leider leiden viele Tutorials darunter, das zuviel Information auf einen einprasselt, die sehr ins Detail gehen und den Anfänger schnell als Außenseiter stehen lassen. der Schreibstil ist dabei entscheidend. Revo, kannst du ein paar Links zu den Tutorials posten? Aber bitte nicht das was Google sagt, sondern das was dir mal geholfen hat in diesem Bereich. Das wäre hilfreich für die Leser des Threads ...

Darii:
Ein klassisches Missverständnis, das viele haben die mit Java programmieren lernen. Es ist keine gute Lösung objektorientiert der um Objektorientierung willen zu programmieren.

Wahre Worte! Goldene Regel beim Programmieren: Am schnellsten ist der Code der nicht vorhanden ist. Ebenso macht dieser Code auch keine Fehler.
 
Zuletzt bearbeitet:
Zurück
Oben