PHP je věda

Objektově orientované programování nejen v PHP

Objekt jako komunikační rozhraní

Je důležité si uvědomit, že OOP je především o předávání objektů. Využití této vlastnosti nám zajistí stabilní a přehledný kód. Hlavně metody by se měly zabývat tím, že objekty přímají a vracejí. Ukládání dat do mezipaměti (pokud se nejedná o konkrétní návrhový vzor, např. Lazy loading) je špatné. V následujícím příkladu sice musíme definovat více tříd, ale tím pádem si také zajistíme čistá komunikační rozhranní. Datové objekty InputData a OutputData jsou pro jednoduchost definovány s public proměnnými, v ideálním případě by se však měly použít privátní a přístup k nim přes getter a setter. I tak nám ale třída outputdata značně zpřehlední kód. Pokud uděláme kalkukaci, víme že třída vrací objekt typu OutputData a pokud chceme s výsledkem nějakým způsobem pracovat, nemusíme se vůbec starat o to, jak metoda OOPCalculator::complicatedCalculation funguje, ale stačí znát pouze třídu OutputData. Podobně nám usnadňuje práci třída InputData. Pokud pracujeme na metodě OOPCalculator::complicatedCalculation a víme, že připravené inputData získáme pomocí metody OOPCalculator::prepareInputData, nemusíme se vůbec starat o to, jakým způsobem metoda data připraví, stačí nám akorát vědět, že je připraví. Pokud chceme nějakým způsobem s InputData pracovat, stačí nám znát strukturu této třídy.

<?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;