J
Juggl3r
Gast
Hallo,
ich habe einige Fragen, zu gewissen Programmier-Entscheidungen. Die ganzen Fragen möchte ich gerne an Hand eines Beispiels stellen. (eine Klasse zum Sortieren von Arrays)
Ich poste euch hier mal meinen Code:
Sortierverfahren.java
Zum einfachen testen habe ich nun folgende Klasse geschrieben:
So nun meine Frage:
1) Kann ich die Variablendeklerationen in Testprogramm so lassen? Ich lese in einem Buch (Clean Code), dass am Besten Variablen, welche oft in der Klasse vorkommen, als Variablen für die ganze Klasse (bzw. für die ganze Instanz) dekleriert werden sollen. Dadurch erhält man eine übersichtliche Parameterliste und wird nicht abgelenkt. In anderen Büchern (Programmierbücher von Java oder Eclipse) steht, dass man den Geltungsbereich von Variablen so klein wie möglich halten sollte, also z.b. die Variable Daten in main erstellen soll und dann per parameter an die Funktionen übergeben soll. Was ist den nun wirklich guter Programmierstil und was würdet ihr mir empfehlen?
2) Beim Konstruktoraufruf von Sortierverfahren kopiere ich das ganze Array. WÜrde ich es nicht kopieren, so würde mit dem Original-Array gearbeitet und d.h. die Daten würden verändert (was vll. viele Benutzer der Klasse irritieren könnte). Andererseits benötige ich allerdings, wenn ich eine tiefe Kopie erstelle, eben viel Länger Zeit, wenn das Array groß wird. Außerdem eine zusätliche Getter Funktion + einer tiefen Kopie im Getter, da ja sonst der User meine Daten ändern könnte (also zuerst aufruf von sortieren, dann holt er sich daten über getter fkt, dann ändert er bei sich daten und damit auch in der Klasse Sortierverfahren und dann würde er beim erneuten Getter Aufruf fälschliche Daten erhalten). D.h. "nur" damit die Klasse benutzerfreundlicher wird, nehme ich solche Einbühsen entgegen - ist das gerechtfertigt oder würdet ihr das anders designen?
3) Normalerweise sollte man das ganze ja per Unit-Test testen und nicht so "billig" über eine main-Fkt. Allerdings weiß ich nicht wirklich, wie ich das machen soll. Ich habe ja über den Konstruktoraufruf die Übergabe der daten, wie mache ich das mit Unit-Test? Einfach eine Instanz erstellen und dann über AssertEquals()? Kann ich dadurch dann auch mehrere Testfälle in eine TestCase-Klasse packen?
4) Gibts sonst noch anmerkungen und verbesserungsvorschläge zu meinem Stil (und dem Code?)
ich habe einige Fragen, zu gewissen Programmier-Entscheidungen. Die ganzen Fragen möchte ich gerne an Hand eines Beispiels stellen. (eine Klasse zum Sortieren von Arrays)
Ich poste euch hier mal meinen Code:
Sortierverfahren.java
Java:
package de.juggl3r.utils;
public class Sortierverfahren {
private int[] daten;
Sortierverfahren(int[] daten) {
// Daten Kopieren, damit übergebene nicht verändert werden
this.daten = new int[daten.length];
for(int i = 0; i < daten.length; ++i)
this.daten[i] = daten[i];
}
public int[] getDaten() {
int[] returnDaten = new int[daten.length];
for(int i = 0; i < daten.length; ++i)
returnDaten[i] = daten[i];
return returnDaten;
}
public void bubblesort() {
int temp;
for(int i = daten.length -1; i > 0; --i) {
for(int k = 0; k < i; ++k) {
if(daten[k] > daten[k+1]) {
temp = daten[k];
daten[k] = daten[k+1];
daten[k+1] = temp;
}
}
}
}
public void selectionsort() {
int temp;
for(int i = 0; i < daten.length -1; ++i) {
int tempForIndex = i;
for(int k = i+1; k < daten.length; ++k) {
if(daten[k] < daten[tempForIndex])
tempForIndex = k;
}
temp = daten[i];
daten[i] = daten[tempForIndex];
daten[tempForIndex] = temp;
}
}
}
Zum einfachen testen habe ich nun folgende Klasse geschrieben:
Java:
package de.juggl3r.utils;
import java.util.Random;
public class Testprogramm {
private static final int ANZAHL_ZUFALLSZAHLEN = 100;
private static final int ZUFALLSZAHLEN_MIN = 0;
private static final int ZUFALLSZAHLEN_MAX = 100;
private static int[] daten;
/**
* @param args
*/
public static void main(String[] args) {
zufallszahlen_generieren();
Sortierverfahren instanz = new Sortierverfahren(daten);
zufallszahlen_anzeigen();
instanz.selectionsort();
daten = instanz.getDaten();
zufallszahlen_anzeigen();
}
private static void zufallszahlen_generieren() {
daten = new int[ANZAHL_ZUFALLSZAHLEN];
Random rnd = new Random();
for(int i = 0; i < ANZAHL_ZUFALLSZAHLEN; ++i)
daten[i] = ZUFALLSZAHLEN_MIN + rnd.nextInt(ZUFALLSZAHLEN_MAX-ZUFALLSZAHLEN_MIN+1);
}
private static void zufallszahlen_anzeigen() {
for(int i = 0; i < daten.length; ++i)
System.out.println("Zufallszahl " + i + " : " + daten[i]);
}
}
So nun meine Frage:
1) Kann ich die Variablendeklerationen in Testprogramm so lassen? Ich lese in einem Buch (Clean Code), dass am Besten Variablen, welche oft in der Klasse vorkommen, als Variablen für die ganze Klasse (bzw. für die ganze Instanz) dekleriert werden sollen. Dadurch erhält man eine übersichtliche Parameterliste und wird nicht abgelenkt. In anderen Büchern (Programmierbücher von Java oder Eclipse) steht, dass man den Geltungsbereich von Variablen so klein wie möglich halten sollte, also z.b. die Variable Daten in main erstellen soll und dann per parameter an die Funktionen übergeben soll. Was ist den nun wirklich guter Programmierstil und was würdet ihr mir empfehlen?
2) Beim Konstruktoraufruf von Sortierverfahren kopiere ich das ganze Array. WÜrde ich es nicht kopieren, so würde mit dem Original-Array gearbeitet und d.h. die Daten würden verändert (was vll. viele Benutzer der Klasse irritieren könnte). Andererseits benötige ich allerdings, wenn ich eine tiefe Kopie erstelle, eben viel Länger Zeit, wenn das Array groß wird. Außerdem eine zusätliche Getter Funktion + einer tiefen Kopie im Getter, da ja sonst der User meine Daten ändern könnte (also zuerst aufruf von sortieren, dann holt er sich daten über getter fkt, dann ändert er bei sich daten und damit auch in der Klasse Sortierverfahren und dann würde er beim erneuten Getter Aufruf fälschliche Daten erhalten). D.h. "nur" damit die Klasse benutzerfreundlicher wird, nehme ich solche Einbühsen entgegen - ist das gerechtfertigt oder würdet ihr das anders designen?
3) Normalerweise sollte man das ganze ja per Unit-Test testen und nicht so "billig" über eine main-Fkt. Allerdings weiß ich nicht wirklich, wie ich das machen soll. Ich habe ja über den Konstruktoraufruf die Übergabe der daten, wie mache ich das mit Unit-Test? Einfach eine Instanz erstellen und dann über AssertEquals()? Kann ich dadurch dann auch mehrere Testfälle in eine TestCase-Klasse packen?
4) Gibts sonst noch anmerkungen und verbesserungsvorschläge zu meinem Stil (und dem Code?)
Zuletzt bearbeitet von einem Moderator: