Nie wiem czy dobry dział, ale chodzi o ogólną wiedzę nt. programowania, czyli pisanie poprawnego kodu :)
Pisałem program pobierający aktualne kursy walut z NBP. Miałem tam główną klasę, która korzystała z dwóch innych klas (jedna pobierała plik z sieci, który był w formacie .txt i wstawiała go do Stringa, a druga parsowała plik z sieci, który był .xml i pobierała aktualny kurs kupna dla wybranej waluty (EUR, DOL etc.)).
W programie wyglądało to tak, że najpierw pobieram plik .txt w którym były nazwy plików xml na dysku NBP, później z tego pliku wybierałem odpowiednie pliki .xml (zakres dat od-do który podawałem w argumentach programu) i dla kursu kupna z tych plików, liczyłem średni kurs. Na końcu wyświetlałem wynik i koniec.
Po oddaniu tego programu, powiedziano mi, że wywołuje łańcuchowo metody i to jest błąd, moje pytanie brzmi, jak to lepiej rozegrać w programie?
Dołączam główną klasę jak to mniej więcej wygląda.
package pl.parser.nbp;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class Handler {
private String currency; // waluta
private String date_1; // data poczatkowa
private String date_2; // data koncowa
private HttpFile hf; // klasa umozliwiajaca sciagniecie pliku txt ze strony
private String content; // plik txt
private List<String> xmlFileNames = new ArrayList<String>(); // lista na nazwy plikow z literka 'c'
private Parser parser = new Parser(); // parser xml
private Exchange exchange;
//==========================================================================================
// konstruktor
Handler(String _currency, String _date_1, String _date_2) {
this.currency = _currency;
this.date_1 = changeData(_date_1);
this.date_2 = changeData(_date_2);
Run();
}
public void Run() {
// Pobranie pliku txt z nazwami plikow i wprowadzenie ich do String
try {
hf = new HttpFile(new URL("http://www.nbp.pl/kursy/xml/dir.txt"));
content = new String(hf.getData()); // pobranie danych z sieci jako string
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// Wyszukanie i wstawienie do listy plikow ktore zaczynaja sie na 'c'
for (int i = 0; i < content.length(); i++) {
if (content.charAt(i) == 'c') {
xmlFileNames.add(content.substring(i, i + 11) + ".xml");
}
}
// jesli pierwsza data wieksza od drugiej to zamien
if(date_1.compareTo(date_2) > 0) {
String tmp;
tmp = date_1;
date_1 = date_2;
date_2 = tmp;
}
// Wyszukanie w liscie odpowiedniego przedzialu dat
int indexBegin = 0;
int indexEnd = xmlFileNames.size() - 1;
for (int i = 0; i < xmlFileNames.size(); i++) {
if (xmlFileNames.get(i).substring(5, 11).equals(date_1)) {
indexBegin = i; // poczatek
}
if (xmlFileNames.get(i).substring(5, 11).equals(date_2)) {
indexEnd = i; // koniec
}
}
// Poobieranie danych ze strony NBP i obliczanie sredniej kupna i odchylenia standardowego dla sprzedazy
double mediumExchangePurchaseRate = 0.0;
double ex2 = 0.0; // dla odchylenia standardowego (wartosc oczekiwana)
double ex = 0.0; // dla odchylenia standardowego (wartosc oczekiwana)
int difference = (indexEnd + 1) - indexBegin;
for (int i = indexBegin; i < (indexEnd + 1); i++) {
try {
exchange = parser.getData(xmlFileNames.get(i), currency);
mediumExchangePurchaseRate += exchange.getPurchaseRate(); // suma dla sredniej (exchange)
ex += exchange.getSellingRate(); // suma dla war oczekiwanej (sprzedaz)
ex2 += (exchange.getSellingRate() * exchange.getSellingRate()); // suma dla wart oczekiwanej (sprzedaz)
} catch (Exception e) {
e.printStackTrace();
}
}
// liczenie wartosci oczekiwanej (sredniej)
ex2 = ex2 / difference;
ex = ex / difference;
// wyswietlenie danych
System.out.printf("%,.4f\n", (mediumExchangePurchaseRate / difference));
System.out.printf("%,.4f\n", Math.sqrt(ex2 - (ex * ex)));
}
// zmiana wygladu daty
private String changeData(String oldData) {
return oldData.substring(2, 4) + oldData.substring(5, 7)
+ oldData.substring(8, 10);
}
private void swap(String str1, String str2) {
String tmp;
tmp = str1;
str1 = str2;
str2 = tmp;
}
}