#19 Szybkie rozszerzanie funkcjonalności

Zbliżamy się do końca konkursu DSP, to już przedostatni wpis, noo i trzeba pomyśleć o jakiejś stabilizacji. Aplikacja nie będzie ukończona do dwudziestego wpisu, ale w jakiś sposób musi działać. Finalnie pewnie będzie ukończona we wrześniu, nie będę nad nią działał sam 😉 Dzisiaj dodałem kod odpowiedzialny za uruchamianie zadań praktycznych, testów i customowych prób. Kod dla funkcjonalności porównywania i dodawania. Najwięcej czasu zajęły poprawki w wyglądzie i obsługa nowych przycisków, reszta poszła błyskawicznie, dzięki zaimplementowaniu wielu rzeczy w nadklasie. Szybki rzut oka na aplikację:

Więcej funkcji się już niestety nie pojawi, następny wpis będzie o drobnych poprawkach w wyglądzie, etc. Ale skupmy się na tym co dodałem, czyli np funkcji porównywania z opcją ustawienia sobie czasu i ilości odpowiedzi:

Kodzik głównie dziedziczy, te funkcjonalności się powtarzają, więc w sumie czemu nie 😉 Spójrzmy np na to:

@Override
@OnClick(R.id.successView)
public void onClickSuccessView() {
    if (operation.nextPoint(true))
        nextActivity(true, CompareCheckActivity.this);
    else
        onClickCommon();
}

@Override
@OnClick(R.id.failureView)
public void onClickFailureView() {
    if (operation.nextPoint(false))
        nextActivity(false, CompareCheckActivity.this);
    else
        onClickCommon();
}

@Override
@OnClick(R.id.fab)
public void onClickFab() {
    if (!isScreenFiled()) {
        stopTime();
        fillScreen(counterRight == counterLeft, true);
    } else {
        if (counterRight == counterLeft)
            onClickSuccessView();
        else
            onClickFailureView();
    }
}

@Override
public void onClickCommon() {
    stackBricksElementsOperation.hideStack(bricksLeftArray);
    stackBricksElementsOperation.hideStack(bricksRightArray);
    unFillScreen(counterRight == counterLeft, true);
    createReadyView();
}

Jak już pisałem wcześniej, mamy tutaj interfejs operation który decyduje którą implementację wybrać. Metoda nextPoint odpowiada true, jeśli mamy wystartować następną aktywność, lub false jeśli wyczyścić ekran i wykonać inne operacje, które mamy opisane w jednej metodzie: onClickCommon. Ważne aby wyczyścić ekran, zanim wylosujemy następne numery. Animacja się rozpocznie w osobnym wątku, i wszystko zdąży się wykonać, zanim zauważymy zmiany. To bardzo fajna cecha, nie trzeba o tym myśleć i przydatna w większości przypadków. Ale niestety nie we wszystkich, np trzeba pamiętać, aby wyłączać parametr clickable na elementach, kiedy uruchamiamy jakąś długo trwającą animację i nic ma jej nie przerywać.

Jak widać czasem przygotowanie sobie dobrego API, i wydzielenie kodu który się powtarza niejednokrotnie trwa dłużej, niż faktyczne korzystanie z niego. I wydaje mi się, że to dobra droga, w przypadku rozrastania się programu, o wiele łatwiej można dodawać nowe funkcje.

Projekt na Github.

Pozdrawiam!