Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Leute,
bin hier ziemlich frisch im Forum und hab auch erst seit ein paar Monaten Programmieren.
Während den Programmierwochen ist mir aufgefallen, dass ich ziemlich lange brauche, um Methoden zu schreiben(solche, die als Aufgabe im Buch zB stehen).
Ein paar Beispiele wären:
- Die Methode soll nur Großbuchstaben zählen,
- " soll die Anzahl aller Zeichen eines Strings ausgeben, etc.
Im Buch sind solche Aufgaben immer noch mit Bedingungen geknüpft, wie zB:
- als Parameter soll ein Array übergeben werden,
- die Methode soll vom Typ void, long etc. sein.
Für gewöhnlich schaffe ich die Aufgaben. Aber auch erst nach vielem hin und er und eben vielen stunden.
Jetzt zur meiner Frage:
Habt ihr eine Idee, wie ich es angehen könnte, Methoden zu schreiben. Ich muss zugeben die oberen Beispiel waren wirklich Easy. Aber bei komplexen Sachen, gibt es irgendein Überlegungsmuster, wie ich Methoden schnell und richtig schreiben kann?
Naja , das eigentlich fundamentalste ist daran , das du , insofern du bestimmte Anforderungen haben solltest richtig liest, wenn nicht das du dich hinsetzt und dir klar machst was genau du brauchst um eine Methode zu schreiben.
nehmen wir mal folgendes Szenario an :
- Simpel:
Du möchtest eine öffentlich zugängliche Methode schreiben, die beim Aufrufen einen String entgegennimmt , diesen auf einen evtl. enthaltenen Wert (Ganzzahl) prüft, eine Bedingung durchläuft insofern der übergebene Wert keine Zahl oder "nichts" enthält, den Wert mit einem anderen verrechnet und dir das Ergebnis auf der Konsole ausgibt, außerdem möchtest du das dir das Ergebnis als Instanzvariable für eine ggf. spätere Verwendung gespeichert wird.
Du brauchst :
- aussagekräftigen Methodennamen
- einen String als Übergabeparameter
- eine lokale Integer Variable die den Wert für evtl. Operationen Enthält.
- einen Parser der unsere Eingabe auf eine Ganzzahl prüft.
- ggf. eine Bedingung die prüft ob nichts / etwas anderes angegeben wurde als erwartet
- einen Rückgabewert , hier void da dir die Methode "nichts" zurückliefern soll.
- eine Instanzvariable die dein Ergebnis zusätzlich erfasst.
- Ausgabe des Ergebnisses
dies könnte man folgendermaßen realisieren :
Java:
public class Foo {
//Konstante und Instanzvariable
public final static String DIGITS = "[0-9]+"; // REG-EX
private int calculatedResult;
//Leerer Standartkonstruktor
public Foo() {}
//Methode nach unserern vorgaben definiert
public void calculateValue(String inputValue){
int helpValue = 25, result = 0;
if((inputValue.length() != 0) && (inputValue.matches(DIGITS))){
result = Integer.parseInt(inputValue) + helpValue;
this.calculatedResult = result;
System.out.println("Das Ergebnis beträgt : " + this.calculatedResult);
}
else{
System.out.println("Bitte machen Sie erst eine gültige Eingabe");
}
}
public static void main(String[] args) {
new Foo().calculateValue("44"); // Gültige Eingabe
new Foo().calculateValue("Hallo Welt"); // Scheinbar gültige Eingabe
}
}
Die Ausgabe wäre dann folgende :
Java:
Das Ergebnis beträgt : 69
Bitte machen Sie erst eine gültige Eingabe
Dies liegt daran das die Scheinbar gültige Eingabe des 2ten Methodenaufrufs die Bedingung nicht erfüllt, und eben keine Ganzzahl enthält, so kann man z.B verhindern das zur Laufzeit Fehler auftretten, man könnte hier ebenfalls noch Exception Handling betreiben und einen Try/Catch Block verwenden , allerdings weiß ich nicht wie weit dein Wissen ausreicht und wollte es ersteinmal so einfach wie möglich halten.
Die hier verwendete Bedingung , realisiert unter Einsatz einer Regular-Expression ( Regulären Ausdrucks )
Java:
public final static String DIGITS = "[0-9]+"; // REG-EX
bedeutet nichts anderes als das bei Ausführung der Methode, geprüft wird, ob der String
Code:
inputValue
den wir der Methode übergeben, Zeichen enthält die wir in unserer Konstanten
Code:
DIGITS
definiert haben.
Code:
[hier 0-9]
Code:
+ steht für mindestens einmal, oder mehrmals)
.
Usere Funktion ist jetzt genauso aufgebaut wie wir es wollten,
wir haben die uns gesetzten Voraussetzungen erfüllt:
- Aussagekräftigen Methodennamen
Java:
calculateValue
- String als Parameter
Java:
(String inputValue)
- Lokale Variablen für evtl. Operationen
Java:
int helpValue = 25, result = 0;
//result dient hier nur , insofern wir eine Lokale Lösung ohne Instanzvariable angestrebt wäre.
-Parser zur Prüfung unseres Parameters auf eine Ganzzahl
System.out.println("Das Ergebnis beträgt : " + this.calculatedResult);
// Ich habe hier bewusst bereits die Instanzvariable verwendet und zu erläutern das der Wert in dieser gespeichert wurde.
Üben üben üben. ..wenn man nicht besser wird.. was anderes machen
Am anfang braucht man halt langer weil man einfach den Umgang mit den ganze Befehle und tools nicht kennt
Ein tischler azubi braucht für einen Stuhl auch länger als sein meister...
So wie KaoZ es beschrieben hat(danke), hab ich schon einiges dazu gelernt. Aber wie sieht es aus, wenn ich so eine (typische Buch) Aufgabe habe, die sagt,
ich soll eine Methode schreiben, die alle Primzahlen ausgeben soll, als Parameter wird ein max übergeben, der die Zählgrenze bestimmen soll.
Stell dir folgende Fragen und beantworte sie (Wikipedia & Internet helfen):
- Was ist eine Primzahl
- Was unterscheidet sie von normalen Zahlen
- Was für Bedingungen müssen gelten, damit eine Zahl eine Primzahl ist
- Wie kann man eine Primzahl berechnen/ prüfen, ob etwas eine Primzahl ist
Wenn du das alles beantworten kannst, dann kannst du auch die Aufgabe lösen.
Wie alle Vorredner bereits sagten, ÜBEN, ÜBEN, ÜBEN.
Beispielsweise "lese" ich gerne Code anderer Leute, wie diese Probleme gelöst haben. Denn daraus kann man lernen die man in sein eigenes Wissen aufnimmt. Da beim JDK der Source-Code mitgeliefert wird, kannst du da ja an verschiedenen Stellen mal spicken.
Und diese Methode solltest du testen und imlementieren. Und da ich bekennender Fan von Test-driven-development (TDD) bin, starte ich IMMER mit einem Test.
Der erste Schritt ist natürlich, die Aufgabenstellung zu verstehen. Das heißt in diesem Fall, man muss wissen was Primzahlen sind.
Als nächstes stellt sich dann die Frage, wie bestimmt man ob es sich bei einer Zahl um eine Primzahl handelt.
Das ist erst einmal ein rein mathematisches Problem. Erst wenn man die Mathematik dahinter versteht, kann man sich daran machen sich den passenden Programm Code zu überlegen.
Das einfachste Verfahren eine Zahl n zu testen ist alle Zahlen von 2 bis n-1 durchzugehen und jedes mal zu prüfen ob n durch diese Zahl teilbar ist. Das ist natürlich ineffizient aber in diesem Fall ausreichend.
Du solltest versuchen ein Problem in mehrere Teile zu zerlegen und für jeden Teil eine eigene Methode schreiben. Das vereinfacht das ganze. In diesem Fall könntest du erstmal mit einer Methode beginnen, die als Parameter eine Zahl n hat und berechnet, ob n eine Primzahl ist, d.h. der Rückgabe wert ist boolean.
Noch ein Tipp: Überlege dir erstmal wie du ein Problem manuell, also schriftlich auf Papier lösen würdest und suche als nächstes nach einem Weg um dieses Verfahren in Code umzusetzen.
Der erste Schritt ist natürlich, die Aufgabenstellung zu verstehen. Das heißt in diesem Fall, man muss wissen was Primzahlen sind.
Als nächstes stellt sich dann die Frage, wie bestimmt man ob es sich bei einer Zahl um eine Primzahl handelt.
Das ist erst einmal ein rein mathematisches Problem. Erst wenn man die Mathematik dahinter versteht, kann man sich daran machen sich den passenden Programm Code zu überlegen.
Das einfachste Verfahren eine Zahl n zu testen ist alle Zahlen von 2 bis n-1 durchzugehen und jedes mal zu prüfen ob n durch diese Zahl teilbar ist. Das ist natürlich ineffizient aber in diesem Fall ausreichend.
Du solltest versuchen ein Problem in mehrere Teile zu zerlegen und für jeden Teil eine eigene Methode schreiben. Das vereinfacht das ganze. In diesem Fall könntest du erstmal mit einer Methode beginnen, die als Parameter eine Zahl n hat und berechnet, ob n eine Primzahl ist, d.h. der Rückgabe wert ist boolean.
Noch ein Tipp: Überlege dir erstmal wie du ein Problem manuell, also schriftlich auf Papier lösen würdest und suche als nächstes nach einem Weg um dieses Verfahren in Code umzusetzen.
Vielen Dank, das mit den Teillösungen funktioniert recht gut(aber manchmal verhaspel ich mich doch in einzelne Teillösungen zu einem)
Dein letztere Tipp funktioniert auch sehr gut, dadurch wurde mit klar was ich brauche, aber ich hab manchmal das Gefühl, das ich dadurch mein Code künstlich aufblähe; geht das nur mir so?