w tle

Wcięcia – jak upiększyć kod

Przypuśćmy hipotetyczną sytuację gdy pewna część kodu z pewnej metody ma wykonać się tylko gdy zaistnieją ku temu odpowiednie warunki. Otacza się taki kod blokiem warunkowym i wiele się nad tym nie zastanawia. Co jednak gdy wewnątrz tego bloku będzie trzeba użyć kolejnego i kolejnego? Kod w końcu wygląda jak piramida w edytorze.

Spróbujmy sprecyzować powyższy akapit. Rozważmy klasę kierowca, która posiada metodę zmień pas ruchu. Pas można zmienić tylko w dozwolonym miejscu. Według kodeksu ruchu drogowego procedura zmiany pasa ruchu wygląda następująco:

  1. Włączyć kierunkowskaz.
  2. Upewnić się że pas, na który chcemy wjechać jest pusty.
  3. Zmienić pas ruchu.

Kod takiej metody mógłby wyglądać tak:

public function changeTrafficLane($direction)
{
  $success = true;
  if ($this->canChangeTrafficLane()) {
    $this->turnOnTurnSignal();
    if ($this->checkIfLaneIsFree($direction)) {
      $this->switchTrafficLane($direction);
    } else {
      $success = false;
    }
    $this->turnOffTurnSignal();
  }
  return $success;
}

Powyższy kod jest bezpośrednim przełożeniem procedury z kodeksu ruchu drogowego. Można go jednak zmodyfikować w taki sposób żeby funkcjonalność nie została zmieniona a sam kod był milszy dla oka. W sytuacji gdy mamy ciało metody, które ma wykonać się tylko w przypadku pewnych okoliczności można odwrócić warunek logiczny i pozbyć się wcięcia.

 public function changeTrafficLane($direction)
{
  if (!$this->canChangeTrafficLane()) {
    return false;
  }

  $success = true;
  $this->turnOnTurnSignal();
  if ($this->checkIfLaneIsFree($direction)) {
    $this->switchTrafficLane($direction);
  } else {
    $success = false;
  }
  $this->turnOffTurnSignal();
  return $success;
}

Przedstawiona metoda jest krótka i zawiera tylko jeden duży blok warunkowy jednak efekt zmiany warunku jest widoczny. Warto zapamiętać tę regułę i stosować ją we własnym kodzie. Współpracownicy jak i Ty sam docenicie taki styl pisania podczas szukania błędu w przyszłości.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *