Poprawne wywoływanie metod w programie (techniki)

0

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;
	}
}
0
jackoi napisał(a):

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?

Nie wywoływać ich łańcuchowo, czyli trzymać się zasady jedna linijka - jedna kropka.

Twoja metoda Run jest koszmarnie długa.

0

Czyli rozumiem, że dla każdej funkcji(operacji) mam stworzyć osobną funkcję i powrzucać je do funkcji Run()?

1 użytkowników online, w tym zalogowanych: 0, gości: 1