Statické metody vs repository rubrika: Folklór

2 Ferda Kulička
položil/-a 8.9.2017

Zdravím zdejší odborníky,
vybírám nějaké ORM pro svůj projekt, nejde teď o konkrétní framework ale o přístup k programování. Většina se používá nějak takto:

$article = new Article();
$article->title = "The Tigger Movie";
 
$entityManager->persist($article); // start managing the entity
$entityManager->flush(); // save it to the database
 
 
$articles = $entityManager->getRepository(App\Article::class);
$article = $articles->find(1);
echo $article->title; // "The Tigger Movie"

Ale našel jsem pár takových které jsou méně ukecané

$article = new Article();
$article->title = "The Tigger Movie";
$article->persist();
 
$article = Article::getById(1);

Víc mě vyhovuje právě ta druhá varianta - méně kódu, přehlednější, nemusím přemýšlet kde vzít $entityManager.

Tak by mě zajímalo co na to říkají místní guru. O co přijdu pokud použiji ten druhý přístup? Párkrát jsem slyšel že statické metody jsou špatné takže pořád mě to vrtá hlavou.

odkaz
6 kohven
odpověděl/-a 8.9.2017

Pokud chceš jednotkově testovat, tak na ten druhý způsob pozor. To Article::getById(1) se docela obtížně mockuje. U toho prvního způsobu se jenom vymění ten $entityManager, který pak vrací mocky místo repository napojených na reálnou DB a na zbytek kódu se nemusí "sáhnout/přepnout". U toho druhého způsobu by se asi musely podstrkávat mocky každému tomu repository zvlášt. Ne že by to nešlo, ale je to takové zbytečné špinění Active Recordů o testovací kusy kódu, pokud si člověk nechce mocknout rovnou celou connection k databázi. Ono vůbec dependency injection se statickýma metodama je takové "smradlavé". :)

Komentáře

  • Taco : Ten druhý způsob je takové to: Vezmeš máslo, a to máslo se samo uloží do lednice. Asi. Netušíš. Ani nevíš do které. ___ Jsem zapřisáhlý odpůrce druhého způsobu, protože ve výsledku komplikuje práci. A napsat to krátce se dá i jinak. 8.9.2017

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.