Prośba o sprawdzenie kodu i ogólnej koncepcji projektu

Odpowiedz Nowy wątek
2018-11-04 14:41
0

Witam. Bawię się w programowanie dopiero od kilku miesięcy, więc mój kod na pewno jest daleki od ideału.
Dlatego też, gdyby ktoś zechciał zrobić szybki code review byłbym wdzięczny. Dopóki można jeszcze ją przebudować.
Aplikacja ma za zadanie wyszukiwać arbitraże na giełdach kryptowalutowych.
Docelowo ma być ze sto giełd i kilkaset różnych monet,
dlatego stworzyłem szkielet, który ma w jak najprostszy sposób pozwolić dodawać nowe giełdy.
Wszystkie dane o giełdzie wczytywane są na razie z pliku tekstowego (później będzie to pewnie baza danych).
Właśnie tutaj napotkałem problem, bo, każda giełda zwraca innego JSONa i dlatego do każdej musiałem zrobić osobny model i mapper dto.
Za pomocą refleksji ładuje odpowiedni mapper do klasy odpowiedzialnej za stworzenie list kupna-sprzedaży danej waluty.
Dla każdej giełdy odpalam nowy wątek, który w kółko pobiera dane i je aktualizuje.
Mam serwer, na którym kopałem krypto 4 procesory (80 wątków) 256gb ram, więc uciągnie tyle wątków.
Docelowo będzie to RESTowy backend spięty z Angularem na froncie (na jakimś hostingu).
Sensownie to wygląda czy nie ?
(Chodzi o styl pisania no i sam koncept. Zacząłem pisać wczoraj więc za dużo jeszcze tego nie ma).

https://github.com/JakubGornickii/cryptodroid

Pozostało 580 znaków

2018-11-04 21:48
0

Nie miałem czasu na ogląddnięcie całego konceptu, ale widze dziwne miejsca:

    public  boolean createData(){
        coinModels = new ArrayList<>();
        boolean error = true;
        for (CoinList exchangeCoin : exchangeCoins) {

            try {
                coinModels
                        .add(exchangeMapper
                                .map(exchangeCoin,queryUrl,exchangeModel.getExchangeName()));
            } catch (RestClientException e) {
                e.printStackTrace();
                error = false;
            }

        }
        return error;
    };

albo

 @Override
    public synchronized void run() {
        boolean error = exchangePaser.createData();
        oldList = exchangePaser.getData();
        CoinsBase.MARKETS_COINS_DATA.addAll(oldList);
if (error){
    System.out.println("("+Thread.currentThread().getName()+") "+marketName+": Pomyślnie wygenerowano liste kupna/sprzedaży dla "+oldList.size()+" kryptowalut");
}
        while (error) {
            error = exchangePaser.createData();
            newList = exchangePaser.getData();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                error = false;
            }
            CoinsBase.MARKETS_COINS_DATA.removeAll(oldList);
            CoinsBase.MARKETS_COINS_DATA.addAll(newList);
            oldList = new ArrayList<>(newList);
        }
    }

Co to jest ten error? Czyli jak poleci exception to nie ma errora (false). Logiczne.

Poza tym te wątki raczej niepotrzebne, Thread sleep słabe.
Ogarnij takie coś:
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,%20long,%20long,%20java.util.concurrent.TimeUnit)
Co gorsza pewnie bedziesz to musiał na koniec zrobić springowym schedulerem:
https://spring.io/guides/gs/scheduling-tasks/


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

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