Piszemy czytelny kod. Staramy się ani nie zagnieżdżać warunków wewnątrz siebie ani nie tworzyć zbędnych konstrukcji logicznych, gdy tego nie musimy. Do dzieła.
Weźmy za przykład klasę URL, którą już wielokrotnie omawialiśmy:
class URL {
private function __construct(
public $url,
public $response_code){}
public static function getURL($url, $response_code=302){
if(filter_var($url, FILTER_VALIDATE_URL)){
return new URL($url, $response_code);
}
}
public function __invoke(){
header("Location: {$this->url}");
http_response_code($this->response_code);
exit;
}
}
$url = URL::getURL("https://www.google.com", 302);
$url();
Chcemy sprawdzić zarówno, czy $url jest $urlem, jak i czy $response_code jest liczbą.
Nie chcemy zagnieżdżać warunków ani tworzyć zbędnych konstrukcji logicznych i/lub.
Zamiast tego podejdziemy do sprawy „od końca”, eliminując przypadki, w których coś jest nie tak:
<?php
class URL {
private function __construct(
public $url,
public $response_code){}
public static function getURL($url, $response_code=302){
if(!filter_var($url, FILTER_VALIDATE_URL))
return;
if(!is_numeric($response_code))
return;
return new URL($url, $response_code);
}
public function __invoke(){
header("Location: {$this->url}");
http_response_code($this->response_code);
exit;
}
}
$url = URL::getURL("https://www.google.com", 302);
$url();
Pusty return wyrywa nas z funkcji, która dalej się nie wykonuje.
Proste warunki faila, zamiast skomplikowanego warunku sukcesu sprawiają, że kod jest czytelny.
Oczywiście moglibyśmy wyrzucić jakiś błąd zamiast pustego returna – nauczymy się tego już niedługo.