Špagetový kód

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Špagetový kód je způsob programování, který vede k nesrozumitelnému a neudržovatelnému programovému kódu. Podle toho, na jakém programátorském levelu se daný vývojář nachází, může být jeden a ten samý kód pro jednoho špageti a pro druhého nikoli. Pojem špagetový kód tedy není vázaný na konkrétní návrhový vzor, např. špageti pattern.

Obecné ukazatele pro špageti kód (může platit jedno i více ukazatelů): - je zcela nepochopitelný - je potřeba pochopit celý kód, abychom pochopili malou část programu

Špagetový kód a objektově orientované programování[editovat | editovat zdroj]

Od objektově orientovaného programování se očekávalo že se problémy se špagetovým kódem vyřeší tím, že se programový kód rozdělí do menších objektů a tím pádem bude možné sledovat každou část programu odděleně a OOP nástroje pro využití tohoto principu poskytuje. Programování pomocí tříd však nemusí být nutně zárukou udržovatelného a přehledného kódu.

K častým ukazatelům špagetového kódu s použitím OOP jsou následující:

  • nekontrolovatelně mnoho stavových proměnných
  • stavové proměnné jsou zneužity jako mezipaměť
  • míchání různých zodpovědností v jedné a té samé třídě

Příklad[editovat | editovat zdroj]

Jako příklad si můžeme uvést jednu a tu samou programátorskou úlohu, kterou se pokusíme vyřešit dvěma způsoby. Jelikož je úloha dostatnečně jednoduchá, jsou oba postupy docela pochopitelné, ale v případě že by se jednalo o složitější případ, je jasné, že jedno řešení je vhodnější než druhé. Nesprávný způsob se jmenuje SpaghettiCalculator a ten správný OOPCalculator. Kód je napsán v jazyce PHP.

SpaghettiCalculator[editovat | editovat zdroj]

Třída Špagetti Calculator se vyznačuje tím, že míchá data a business logic dohromady v jedné a té samé třídě. Metody nemají žádné vstupní ani výstupní parametry. Pokud chceme pomocí této třídy spustit výpočet metodou SpagettiCalculator::complicatedCalcualtion je potřeba znát celou implementaci třídy.

<?php
class SpagettiCalculator
{
 
    /**
     * @var int
     */
    protected $value1;
 
    /**
     * @var int
     */
    protected $value2;
 
    /**
     * @var int
     */
    public $plus;
 
    /**
     * @var int
     */
    public $minus;
 
    public function complicatedCalculation()
    {
        $this->prepareVariables();
        $this->plus  = $this->value1 + $this->value2;
        $this->minus = $this->value1 - $this->value2;
    }
 
    public function prepareVariables()
    {
        $this->value1 = 6;
        $this->value2 = 7;
    }
}
 
$spatettiCalculator = new SpagettiCalculator();
 
$spatettiCalculator->complicatedCalculation();
 
echo $spatettiCalculator->plus . PHP_EOL;
echo $spatettiCalculator->minus;

OOP Calculator[editovat | editovat zdroj]

Řešením je rozdělení třídy do více tříd s jasnou zodpovědností. Z hlediska OOP je vhodné rozdělit kód tak, abychom nemíchali data a business logic v jedné a té samé třídě. Metody by měly mít definované vstupní parametry a návratové hodnoty. Využívání stavových proměnných jako mezipaměť se doporučuje pouze při implementaci konkrétního návrhového vzoru. Pokud chceme spustit kalkuaci pomocí metody SpagettiCalculator::complicatedCalcualtion, je potřeba znát pouze implementaci datové struktury reprezentované třídou OutputData, jejíž instanci metoda vrací.

<?php
class InputData
{
 
    /**
     * @var int
     */
    public $value1;
 
    /**
     * @var int
     */
    public $value2;
}
 
class OutputData
{
 
    /**
     * @var int
     */
    public $plus;
 
    /**
     * @var int
     */
    public $minus;
}
 
class OOPCalculator
{
 
    /**
     * @return OutputData
     */
    public function complicatedCalculation()
    {
        $inputData         = $this->prepareInputData();
        $outputData        = new OutputData();
        $outputData->plus  = $inputData->value1 + $inputData->value2;
        $outputData->minus = $inputData->value1 - $inputData->value2;
        return $outputData;
    }
 
    /**
     * @return InputData
     */
    protected function prepareInputData()
    {
        $inputData         = new InputData();
        $inputData->value1 = 6;
        $inputData->value2 = 7;
        return $inputData;
    }
}
 
$oopCalculator = new OOPCalculator();
 
$result = $oopCalculator->complicatedCalculation();
 
echo $result->plus . PHP_EOL;
echo $result->minus;


Externí odkazy[editovat | editovat zdroj]