Zagnieżdżanie If-ów

0

Taki temat mi sie nasunął ostatnio, musialem napisać w PHP (hosting tylko to obsługuje, ale to bez znaczenia w czym bo pytam ogólnie) skrypt importujący json-a udostępnionenego przez MF do weryfkacji kont bankowych. robota z cyklu szybko i na wczoraj, więc powstała mi tak zagnieżdżona struktura if-ów.
Głownie zajmuje sie bazami i taki skrypt to nie jest rocket since, ale podświadomie czuje, że można to lepiej zorganizować: w uproszczeniu

plik = 'https://plikplaski.mf.gov.pl/pliki/20191218.7z'
if (istniejeplik(plik) { 
    pobierz(plik)
    pobierz(plik.'sha512sum)
    if sprawdzsume(20191218.7z) {
         if rozpakuj(20191218.7z) {
                if sprawdzsume(20191218.json) {
                           laduj do bazy
                }
         }
    }
}

Czyli klasyczna sytuacja kolejna czynność zależy od powodzenia poprzedniej. jak to rozwiązujecie?

6

Fail Fast.

ZaladujDaneZPlikuDoBazy
{
    result = PobierzRozpakujaWczytajPlik(plik);

    if (!result)
        return "error";

    dbResult = zaladujDoBazy(result);

    return  dbResult ? "success" : "error";
}

PobierzRozpakujaWczytajPlik
{
    if (!istniejeplik(plik))
        return false

    pobierz(plik)
    pobierz(plik.'sha512sum) // nie jestem pewien co to zwraca, wiec zostawie tak

    if (!sprawdzsume(20191218.7z))
        return false;

    if (!sprawdzsume(20191218.json)
        return false

    return dane;
}
1

Jeśli chcesz się bawić, to możesz zabezpieczyć się typami. Niech kolejne funkcje zwracają kolejne typy, które będą przyjmowane przez kolejne. Taki trochę pseudokod:

DowloadedFile pobierz(File f)
Checked7z sprawdzsume(DowloadedFile f)
Unziped rozpakuj(Checked7z c)

itp

Ewentualnie ładujesz w jakiś optional i .map()

1

Jeżeli tylko takie proste warunki to:

if sprawdzsume(20191218.7z) && rozpakuj(20191218.7z) && sprawdzsume(20191218.json) {
  laduj do bazy
}

https://en.wikipedia.org/wiki/Short-circuit_evaluation

0

Tylko czy to sprawdzanie ma sens? Spodziewałbym się, że taki mechanizm jest już wbudowany w samą kompresję 7z.

0

@Azarien: nie wiem, ale to nie wpływa na pytanie, odpada jeden krok...
Poprawiłem skrypt wg. wskazówek @WeiXiao i @Delor i jest zdecydowanie czytelniej

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