Další programátorské cvičení bude vyžadovat víc přemýšlení. Výsledkem bude opět přehlednější kód, lepší porozumění kódu a větší flexibilita kódu. Cvičení je daleko obecnější a vyžaduje daleko víc analytických schopností, než předchozí. Dva lidé budou nejspíš stejný kód předělávat jiným způsobem.
Takže jaké je dnešní zadání?
V jedné metodě udržujte jednu úroveň abstrakce.
Co to znamená?
Každý kód je jinak abstraktní.
Nejspíš se shodnem, že v této metodě se úrovně abstrakce střídají:
$data = $this->model->fetchData(); // 1.
$encoder = new JsonEncoder; // 2.
file_put_contents(WWW_DIR . '/exports/export.json', $encoder->encode($data)); // 3.
První řádka je velmi obecná. Nějaký model vytahuje nějaká data.
Druhá řádka je konkrétnější, protože říká, jaký konkrétní encoder bude použit. Místo ní by byla řádka
$encoder = $this->getEncoder();
// nebo
$encoder = EncoderFactory::getEncoderFor(EncoderFactory::EXPORT_TO_FILE);
Třetí řádka je nejkonkrétnější, nejspíš bude místo ní volání:
$this->exportData($data)
A metoda exportData si získá path pomocí metody getPath (takže v první metodě už bude jen 1. a 3. řádka - 3. řádka změněná), teprve ona si nechá vytvořit encoder a v metodě writeDataToFile zapíše data na disk.
function exportData($data)
{
$encoder = EncoderFactory::getEncoderFor(EncoderFactory::EXPORT_TO_FILE);
$this->writeToFile($this->getPath(), $encoder->encodeData($data);
}
function writeToFile($path, $data)
{
if (file_exists($path) && ! is_writable($path)) {
throw new FileSystemException("Unable to write to path: $path");
}
file_put_contents($path, $data);
}
Získáme tím kód, ve kterém máme úrovně abstrakce rozdělené natolik, že se samo od sebe vynoří, jak a kam máme přidávat nové funkcionality. Ještě jednou připomínám, že dva lidé uvidí vždy v kódu úrovně abstrakce trošku jinak a je nutné neustále trénovat.
