Poprawne wywoływanie metod w programie (techniki)

Odpowiedz Nowy wątek
2013-12-06 08:54
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;
    }
}

Pozostało 580 znaków

2013-12-06 09:12
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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2013-12-06 09:14
0

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

edytowany 1x, ostatnio: jackoi, 2013-12-06 09:15
Z tego co widzę, to zadanie rekrutacyjne do pewnej firmy. Nie jesteś pierwszym któremu powiedzieli, że jest źle napisane. W mojej opinii po prostu pracują tam niekompetentni ludzie od rekrutacji albo nie szukają faktycznie ludzi. - Hepek 2013-12-06 10:45
tak, to zadanie rekrutacyjne do pewnej firmy, na stanowisko praktykanta java developer. - jackoi 2013-12-06 10:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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