www.rozumim.cz

Mně se ty if-y nevejdou do hlavy

Takhle se často cítím, když musím číst nějaký kód (i ten, co jsem před pár lety psal já sám).

just looking at the shape of this code you know there’s a bug in here somewhere

Určitě to taky znáte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void nepochopitelnaMetoda() {
  if (neco) {
    if (necoJineho) {
      // ...

    } else if (tamto) {

      if(tohle && takyTohle) {
        // hmmm ....
        provedXYZ();
      }

      // kde to jsem?
    }

  } else {
    // ...
  }
}

Nečitelné, nepochopitelné, neopravitelné. Ale naroste to rychle, to zase jo :-)

Co kdybych to raději zapsal takto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void pochopitelnaMetoda() {
  if (!neco) {
    // ha!
    return;
  }

  if (!necoJineho) {
    vyresMameNecoAleNemameNecoJineho(); // <- tady jsou schované další if-y
    return;
  }

  zpracujTamto(); // <- metoda si ohlidá, jestli má 'tamto' nebo ne

  if(tohle && takyTohle) {
    provedXYZ();
  }
}

Nechci a neumím Vám dokázat, že druhý kus kódu odpovídá tomu prvnímu (jsem si vlastně jistý, že ne). A nechtěl bych být ten, kdo bude první refaktorizovat na druhý.

Ale vidíte ten rodíl? A nešlo by to takhle psát rovnou od začátku? :-)

Na tomhle případu to tak nevynikne, ale ani s pochopitelnaMetoda() nejsem spokojený. Nejraději mám sebevědomý kód:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void sebevedomaMetoda() {

  // priprava

  boolean muzemeZacit = neco;
  boolean chybiNamNecoJineho = neco && !necoJineho;
  boolean muzemeProvestXYZ = tohle && takyTohle;

  // validace

  if (!muzemeZacit) {
    log.info("...")
    return;
  }

  // zpracovani

  zpracujNeco();

  if (chybiNamNecoJineho) {
    vyresMameNecoAleNemameNecoJineho();
  }

  zpracujTamto();

  if(muzemeProvestXYZ) {
    provedXYZ();
  }

  // uklid

}

Co na to říkáte?

1. 10. 2013, kategorie: it
comments powered by Disqus