Je PHP nutné k uplatnění?

Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #150 kdy: 19. 12. 2014, 15:46:45 »
... lebo potom auto, ktore updatuje autoznacku, v skutocnosti to prehodi na volanie na autoznacku, ktora updatuje automobil..., co je, ako vravi pan Micek, dost boilerplatovo.

AutoZnacka updatuje pouze značku auta. Nevidím v tom boilerplate.
Citace
ak by to bolo mapovanie, ze co tabulka, to Updatable entita, tak aj tak mi z toho ide hlava kolem

Co doména, to Updatable. Entity jsou pohromadě, nevidím v tom problém.
Citace
ak autoznacka nesie Audi a A8, preco ma vediet o konkretnych autach, ktore ma updatnut? ak teda predpokladam, ze znacky su v nejakom ciselniku

Také bych to tak nedělal. V zadání byla doména Automobil se dvěma atributy: značka a typ. Tak jsem to napsal podle toho.
Citace
dalsia vec je, ze takto neurobite unit testy, co je epic fail

Dělal jsem to právě kvůli tomu, aby se mi dobře psaly unit testy. Proč by nešly udělat? Epic fail se nekoná.


Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #151 kdy: 19. 12. 2014, 20:52:37 »
Jde získat např. hodnotu $znacka? Mj. není ten kód AutoZnacka boilerplate?

K čemu by mi měla být hodnota $znacka vytržená z kontextu?

Radek Miček

Re:Je PHP nutné k uplatnění?
« Odpověď #152 kdy: 20. 12. 2014, 01:51:12 »
Jde získat např. hodnotu $znacka? Mj. není ten kód AutoZnacka boilerplate?

K čemu by mi měla být hodnota $znacka vytržená z kontextu?

Ne vždy je kontext třeba. Co když chci značku vypsat nebo se zeptat nějaké služby, zda je auto kradené, to vše pak implementuji přímo do AutoZnacka?

AutoZnacka updatuje pouze značku auta. Nevidím v tom boilerplate.

No právě, skoro nic to nedělá a je toho 10 řádků. V tom příkladu je jediná zajímavá informace SQL dotaz, ostatní z něj lze odvodit, tudíž to ostatní je zbytečné.

Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #153 kdy: 20. 12. 2014, 10:41:41 »
Jde získat např. hodnotu $znacka? Mj. není ten kód AutoZnacka boilerplate?

K čemu by mi měla být hodnota $znacka vytržená z kontextu?

Ne vždy je kontext třeba. Co když chci značku vypsat nebo se zeptat nějaké služby, zda je auto kradené, to vše pak implementuji přímo do AutoZnacka?

AutoZnacka je doména, která v tomto modelovém případě pracuje s dvojicí atributů $znacka a $typ. Dostanu tedy celou dvojici jako objekt nebo zúžím doménu.
Citace
AutoZnacka updatuje pouze značku auta. Nevidím v tom boilerplate.

No právě, skoro nic to nedělá a je toho 10 řádků. V tom příkladu je jediná zajímavá informace SQL dotaz, ostatní z něj lze odvodit, tudíž to ostatní je zbytečné.

SRP. Je to pouze příklad, jak stavím větší projekty. Pokud bych měl v modelu jen jednu doménu, tak se bez tohoto postupu obejdu. Kdybych to dělal s gettery a settery, tak tam těch 10 řádků bude také, ale bude to namačkáno do modelu, bude to mít debilní názvy a nebude to mít doménovou logiku.

Radek Miček

Re:Je PHP nutné k uplatnění?
« Odpověď #154 kdy: 20. 12. 2014, 11:18:20 »
SRP. Je to pouze příklad, jak stavím větší projekty. Pokud bych měl v modelu jen jednu doménu, tak se bez tohoto postupu obejdu. Kdybych to dělal s gettery a settery, tak tam těch 10 řádků bude také, ale bude to namačkáno do modelu, bude to mít debilní názvy a nebude to mít doménovou logiku.

SRP? Jenže tahle třída dělá 3 věci: drží data, validuje data, zapisuje data do databáze. Osobně bych se snažil tohle všechno oddělit.


Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #155 kdy: 20. 12. 2014, 11:52:47 »
SRP? Jenže tahle třída dělá 3 věci: drží data, validuje data, zapisuje data do databáze. Osobně bych se snažil tohle všechno oddělit.

Objekt drží jen data, která má držet. Každá metoda dělá jen jednu věc. SRP.

Radek Miček

Re:Je PHP nutné k uplatnění?
« Odpověď #156 kdy: 20. 12. 2014, 12:07:00 »
SRP? Jenže tahle třída dělá 3 věci: drží data, validuje data, zapisuje data do databáze. Osobně bych se snažil tohle všechno oddělit.

Objekt drží jen data, která má držet. Každá metoda dělá jen jednu věc. SRP.

Ale vše je splácané dohromady. Když budu chtít změnit např. validaci, tak musím přepsat celou třídu, ne? (Vycházím z toho, že atributy $znacka a $typ jsou privátní, takže k nim nejde přistupovat z vnějšku a ani z podtřídy.)

Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #157 kdy: 20. 12. 2014, 12:17:21 »
Objekt drží jen data, která má držet. Každá metoda dělá jen jednu věc. SRP.

Ale vše je splácané dohromady. Když budu chtít změnit např. validaci, tak musím přepsat celou třídu, ne? (Vycházím z toho, že atributy $znacka a $typ jsou privátní, takže k nim nejde přistupovat z vnějšku a ani z podtřídy.)
[/quote]

Validace se přece týká této konkrétní třídy. Proč bych při změně způsobu validace měl přepisovat jinou třídu než tuto? Kterou jinou třídu bych podle tebe měl při změně způsobu validace přepisovat? Takovou, která se značkou auta nijak nesouvisí?

Radek Miček

Re:Je PHP nutné k uplatnění?
« Odpověď #158 kdy: 20. 12. 2014, 12:50:38 »
Validace se přece týká této konkrétní třídy. Proč bych při změně způsobu validace měl přepisovat jinou třídu než tuto? Kterou jinou třídu bych podle tebe měl při změně způsobu validace přepisovat? Takovou, která se značkou auta nijak nesouvisí?

Chtěl bych využít kód z této třídy (držení dat nebo ukládání do databáze), ale s jinou validací. Tím, že to smícháte dohromady, ztrácíte znovupoužitelnost kódu. Např.:

  • Různé části kódu mohou provádět validaci jinak - nové značky budu validovat jinak než ty staré (tj. validace při vkládání se liší od validace při editaci) nebo administrátor má možnost zadat nevalidní značku.
  • Pokud třída nebude závislá na databázi, mohu ji použít i v klientském kódu (pokud jazyk umí kompilovat do JS).
  • V jiné aplikaci může mít značka nějaké atributy navíc, ale validaci pro shodné atributy mohou oba systémy sdílet.

Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #159 kdy: 20. 12. 2014, 13:33:41 »
Validace se přece týká této konkrétní třídy. Proč bych při změně způsobu validace měl přepisovat jinou třídu než tuto? Kterou jinou třídu bych podle tebe měl při změně způsobu validace přepisovat? Takovou, která se značkou auta nijak nesouvisí?

Chtěl bych využít kód z této třídy (držení dat nebo ukládání do databáze), ale s jinou validací. Tím, že to smícháte dohromady, ztrácíte znovupoužitelnost kódu. Např.:

  • Různé části kódu mohou provádět validaci jinak - nové značky budu validovat jinak než ty staré (tj. validace při vkládání se liší od validace při editaci) nebo administrátor má možnost zadat nevalidní značku.
  • Pokud třída nebude závislá na databázi, mohu ji použít i v klientském kódu (pokud jazyk umí kompilovat do JS).
  • V jiné aplikaci může mít značka nějaké atributy navíc, ale validaci pro shodné atributy mohou oba systémy sdílet.

  • Pokud se jedná o jinou validaci, jedná se zřejmě o jinou doménu.
  • Pokud se jedná o jiná validační pravidla, tak ta se mohou injektovat v konstruktoru, jinak default.
  • Tato třída je použitelná nezávisle na databázi. Podívej se pořádně.
  • Validační pravidla mám v databázi. Není problém je zkompilovat do JS.
  • Mé třídy jsou znovupoužitelné právě proto, že dodržuji SRP.
  • Podle tvých pravidel prakticky každá třída porušuje SRP. Ta, která ho podle tebe neporušuje, je k ničemu.
  • Neodpověděl jsi na otázku, kterou třídu bych měl při změně způsobu validace přepisovat. Všechny, které dělají validaci? Je lepší opravit jednu třídu, než hledat v celé aplikaci, kde všude je použita.

Radek Miček

Re:Je PHP nutné k uplatnění?
« Odpověď #160 kdy: 20. 12. 2014, 15:14:05 »
Mé třídy jsou znovupoužitelné právě proto, že dodržuji SRP.

Právě, že ten váš kód znovupoužitelný není a není ani modulární - nemohu vzít část funkcionality a jednoduše ji použít nebo nahradit, mohu s tím pracovat pouze jako s celkem.

Neodpověděl jsi na otázku, kterou třídu bych měl při změně způsobu validace přepisovat. Všechny, které dělají validaci? Je lepší opravit jednu třídu, než hledat v celé aplikaci, kde všude je použita.

Ve Scale bych to řešil zhruba takhle:

// Pouze drží data (validní i nevalidní).
case class AutoZnacka(typ: String, znacka: String)

// Obsahuje standardní kód pro ukládání do databáze i pro validaci.
// Na jeho vygenerování si lze napsat makro.
object AutoZnacka {
  implicit val u = Updatable.fromFunction[AutoZnacka] { (x, db) =>
    /* TODO */
  }
  implicit val v = Validation.fromFunction[AutoZnacka] { x =>
    /* TODO */
  }
}

Všimněte si, že validace i ukládání do repository je zvlášť a uživatel to může snadno předefinovat nebo použít v jiném kódu. Abych odpověděl na otázku, tak při změně způsobu validace stačí napsat

implicit val autoZnackaValidation = /* TODO */

Například potřebujete-li v administrační sekci jinou validaci, uděláte trait

trait AdminValidation {
  implicit val autoZnackaValidation = /* TODO */
}

a ten pak namixujete, kde je to třeba

class SomeController extends Controller with AdminValidation {
  /* TODO */
}

Tomáš Roll

Re:Je PHP nutné k uplatnění?
« Odpověď #161 kdy: 20. 12. 2014, 15:24:56 »
Já jsem se uplatnil a PHP jsem nikdy neuměl. Tolik k tématu.

Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #162 kdy: 20. 12. 2014, 15:54:25 »
Ve Scale bych to řešil zhruba takhle:

Scala není PHP. Na znovunepoužitelnost si nehraji. Spousta se toho nakecá, ale když se nějaká třída má použít znovu, použitelná není.

Podle tebe každá anemická třída porušuje SRP. Má v sobě data, getter a setter. To jsou 3 komponenty. Kde je SRP?

Data a příslušné metody mají být pohromadě. Teprve pak je to OOP.

Repository je antipattern.

Radek Miček

Re:Je PHP nutné k uplatnění?
« Odpověď #163 kdy: 20. 12. 2014, 16:24:04 »
Data a příslušné metody mají být pohromadě. Teprve pak je to OOP.

Definujte, co je podle vás OOP? Pokud stačí, že data a funkce jsou pohromadě, pak je i záznam, jenž obsahuje data a funkce OOP? Např.

type Ctverec =
    { A : int
      Nakresli : unit -> unit }


Podle tebe každá anemická třída porušuje SRP. Má v sobě data, getter a setter. To jsou 3 komponenty. Kde je SRP?

Ne, neporušuje, stále se stará o jednu věc, o držení dat.

Scala není PHP. Na znovunepoužitelnost si nehraji.

Ano, v PHP nemáte typové třídy, ani implicity, takže to nemůžete takhle snadno oddělit od sebe. Proto si myslím, že na programovacím jazyku dost záleží.

Kit

Re:Je PHP nutné k uplatnění?
« Odpověď #164 kdy: 20. 12. 2014, 16:32:29 »
Podle tebe každá anemická třída porušuje SRP. Má v sobě data, getter a setter. To jsou 3 komponenty. Kde je SRP?

Ne, neporušuje, stále se stará o jednu věc, o držení dat.
  • držení dat
  • nastavení dat
  • získávání dat
To jsou 3 komponenty, které mohou existovat nezávisle na sobě.