Autor Zpráva
Foi
Profil
Na úvod: používám doctrine a nette

Mám např. články, entita je:
class Article {

    /**
     * @ORM\Column(type="text")
     */ 
    protected $content;

    public function getContent() {
        return $this->content;
    }

}

Teď potřebuji vypsat obsah článku, jenže závisí na mnoha jiných okolnostech, např. jestli není uživatel přihlášen, tak zkrátit obsah, projet obsah Markdown apod.

Mohl bych to udělat takto:

public function getContent(Markdown $md, User $user) { ... }

Jenže to znamená, že budu muset všude kód a kdyby se náhodou změnil požadavek a naskytla se závislost navíc => úprava na všech místech => větší šance na chyby.

Napadlo mě, že si udělám factory na návrhový vzor "kompozici" (v uvozovkách proto, protože si nemyslím, že je to tento návrhový vzor, ale protože se tomu podobá).

interface ICompositeFactory {

    public function create(Article $article): Composite;

}

class Composite {

    public function __construct(Article $article, Markdown $md, User $user) { ... }

    public function getArticle() {
        return $this->article;
    }

    public function getContent() {
        // $this->user, $this->md
    }

}

Použití:
$composite = $compositeFactory->create($article);

echo $composite->getContent();

Moje otázky:
1) Je tohle best practise?
2) Je dobré mít v této třídě i jiné metody, které závisí na jiných třídách? Např. metodu getFormattedTime() , zase mi jde o to, aby tato třída neměla stovky metod a závislostí, ale nenapadá mě, jak to rozdělit do menších tříd a pak šikovně spojit, to co potřebuji.
3) Předávat třídu composite do šablon nebo udělat DTO? V budoucnu budu mít jen kodéra, takže aby to měl co nejjednodušší, tak mu chci dávat jen hotové věci do šablon.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0