Зоны ответственности в программном коде

В программном коде важно понимать, какой блок кода за что отвечает.

Пример. В базе данных хранится длительность события. Длительность указана как целое число (int) и указывается в минутах. Информацию о событии мы готовим при помощи дата маппера и велик соблазн сразу же привести число в понятный человеку вид (135 → 2 ч. 15 мин.).

Однако за такую трансформацию должен отвечать не маппер, а создаваемый им объект. Задача маппера — быть посредником между областью домена и базой данных. При этом не имеет смысла трансформировать данные и на уровне представления: возможна ситуация, когда на основе объекта будут строиться несколько представлений и виджетов. Это рано или поздно приведет к дублированию кода.

Итак, в коде возвращаемого маппером объекта будет как свойство $duration, так и метод, возвращающий длительность в понятном человеке виде:


class Event extends DomainObject
{
    $duration = null;

    public function durationOutput()
    {
        if ($this->duration < 60) 
            return "{$this->duration} мин.";

        $hours = floor($this->duration/60);
        $min   = $this->duration % 60;

        if ($min) 
            return "{$hours} ч. {$min} мин.";

        return "{$hours} ч.";
    }
}

Код расчета длительности приведен здесь для иллюстрации. В реальном проекте имеет смысл вывести его в отдельный класс для работы со временем.