Zadejte hledaný výraz...

Použití static u metod objektů, ano či ne?

tyruk
verified
rating uzivatele
(2 hodnocení)
29. 8. 2011 10:11:23
Napsal sysline;694477
Co se tyka vaseho prikladu definice TimeUtils::getTimeStr() je uplne to same, jko kdybych si udelal holou funkci getTimeStr() pracuje se s tim stejne, testuje se to stejne a vazne mi chcete tvrdit, ze nelze testovat
if ( TimeUtils::getTimeStr() == '0:00' ) { echo 'pulnoc'; } ??? No to snad ne, ze ne? :)
Taky by me zajimalo, jak chces pro tento priklad udelat automaticky test. Jedine reseni, ktere me napadlo, je nejprve nastavit cas, pak zavolat metodu a otestovat vystup. Ale opravdu by mel unit-test nastavovat systemovy cas? Nehlede na problemy s pravama... Pokud by se namisto staticke metody pouzil nejaky Clock objekt (ktery by se predal jako parametr metode nebo konstruktoru), stava se testovani naprosto trivialni zalezitosti... staci mock.
Podle me jsou staticke metody zlo a jejich pouzivani je znamkou spatneho navrhu programu. Krome spatne testovatelnosi taky zavadi zavislosti mezi tridami.
29. 8. 2011 10:11:23
https://webtrh.cz/diskuse/pouziti-static-u-metod-objektu-ano-ci-ne/strana/2/#reply671125
Václav Mach
verified
rating uzivatele
(13 hodnocení)
30. 8. 2011 22:47:03
já si myslím že s tím časem je to jen mazaně vybraný příklad aby byl podpořen argument že statické metody ne
podle mě statické metody s mírou a rozumem:
- pokud by inicializace celého objektu byla zbytečně nákladná a nepotřebná, je statická metoda často menší zlo
- někdy je čistší zabránit duplikaci kodu přesunem triviálních výpočtů do statické metody než zaplevelovat strom tvorbou potomků
- v řadě případů je statická metoda nutnost např. pokud objekt pracuje se Smarty db resource
30. 8. 2011 22:47:03
https://webtrh.cz/diskuse/pouziti-static-u-metod-objektu-ano-ci-ne/strana/2/#reply671124
Je to širší problém - ve skutečnosti se chcete vyhnout globálnímu stavu, a statické metody nedělají nic jiného, než že globální stav zpřístupňují.
Ve zkratce, proč je globální stav špatný:
- Může se změnit, aniž byste to věděli (jiná třída, jiný vývojář, nebo vy sami o 6 měsíců dříve/později způsobí, že se vám stav, na který spoléháte, nečekaně změní pod rukama)
- Nemůžete ho změnit třeba pro otestování, aniž byste ho zároveň nezměnili ostatním (což je jen zrcadlo k prvnímu bodu) - viz Vedoucího příklad s časem
Pokud si myslíte, že se globálnímu stavu nemůžete vyhnout, zkuste se na něj (třeba na ten db resource) podívat jinak:
- Předejte si ho jako parametr (aka dependency injection) tam, kde ho potřebujete.
- Izolujte jeho použití na co nejužší místo (tím nemyslím statickou funkci, ta globální stav naopak rozsévá po celé aplikaci, prostě nevolejte DB z každé malinké metody v každé možné třídě)
Pro rychlý a zajímavě podaný přehled doporučuju druhou přednášku Miško Heveryho z Google, na kterou jsem tuhle posílal odkaz:
http://webtrh.cz/146023-misko-hevery-prednasky-tdd-cvut
30. 8. 2011 23:27:50
https://webtrh.cz/diskuse/pouziti-static-u-metod-objektu-ano-ci-ne/strana/2/#reply671123
Kamil Tomšík
verified
rating uzivatele
(3 hodnocení)
31. 8. 2011 09:41:41
Napsal webdnes;695825
já si myslím že s tím časem je to jen mazaně vybraný příklad aby byl podpořen argument že statické metody ne
podle mě statické metody s mírou a rozumem:
- pokud by inicializace celého objektu byla zbytečně nákladná a nepotřebná, je statická metoda často menší zlo
- někdy je čistší zabránit duplikaci kodu přesunem triviálních výpočtů do statické metody než zaplevelovat strom tvorbou potomků
- v řadě případů je statická metoda nutnost např. pokud objekt pracuje se Smarty db resource
to mi lichoti, ale neni to mazany priklad. hned jsem pridal posilani mailu, celkem bezna vec a celkem bezne implementovana stylem Mailer::send_mail($to, $body, $title, $attachments) - naprvni pohled krasa, je to jednodussi na zavolani, ale:
  • tezko se to testuje, stejne jako cas - jednoduse musis udelat nekde systemovou zmenu
  • statickou metodu nijak neodekorujes ani na ni neudelas proxy - napriklad by se ti mohlo hodit logovani vsech mailu a nebo by se ti treba hodilo vsechny maily "obohatit" o html layout aby vypadaly stejne a hezky - coz opet nejde bez zasahu do puvodni tridy
  • zadne staticke metody != milion instanci - muzes pouzivat jednu a predavat si ji (DI) a nebo muzes sahnout po DIC frameworku a nechat si ji injektnout, kde potrebujes, ale druhe reseni ja osobne povazuju za prilis "heavy"
ale jinak ano, pokud pracujes se statickym zakladem, tezko vykouzlis OO verzi, aniz by bylo mozne ji obejit...
Je to širší problém - ve skutečnosti se chcete vyhnout globálnímu stavu, a statické metody nedělají nic jiného, než že globální stav zpřístupňují.
Jasne, +1
31. 8. 2011 09:41:41
https://webtrh.cz/diskuse/pouziti-static-u-metod-objektu-ano-ci-ne/strana/2/#reply671122
Pro odpověď se přihlašte.
Přihlásit