Proč Nette\Object nepodporuje write-only property?
- jtousek
- Člen | 951
Ahoj,
snažil jsem se dát heslo u UserEntity jako write-only property (getter nemá v tomto případě smysl), což ale nefunguje. Když jsem zabrousil do zdrojáku ObjectMixin, zjistil jsem, že hledá setter pouze v případě, že existuje getter. Osobně mi tato závislost připadá už z principu nesmyslná. Je pro ni nějaký zásadní důvod? Pokud ne, mohla by tato závislost být odstraněna?
- arron
- Člen | 464
David o tom uz kdysi nekde mluvil (uz se to tu na foru nekde resilo…). V zasade jde o to, ze je nesmyslne (az na nekolik vzacnych vyjimek…teda mozna az na tu jedinou s tim heslem u usera) snazit se neco nastavit, kdyz to pak stejne uz nemuzu precist:-) (doufam, ze jsem to interpretoval spravne, ale ze zasady s touto formulaci sam souhlasim).
- jtousek
- Člen | 951
To je sice pravda, ale připadá mi to jako pohled BFU nikoli pohled programátora – vidim getter, nastavim čtení; vidim setter – nastavim zápis (nezávisle na sobě).
Je mi jasné, že write-only property nejsou nijak častá záležitost, ale nevidím důvod, proč je zakazovat. Navíc phpDocumentor na ně také myslí.
- Blizzy
- Člen | 149
@Vrtak-cz: Pokud je potřeba ověřit hodnotu, napíšu si getter.
Taky bych rád viděl podporu write-only properties.
To, že read-write a read-only properties fungují a write-only ne mi připadá jako magie, prostě je to neočekávané chování.
Důvod, že se skoro nikde nepoužijí se mi nezdá dostatečný pro to, aby se write-only properties aktivně blokovali. Vzhledem k tomu, že se Nette snaží zbavit všemožné černé magie, byl bych i pro odstranění té jedné podmínky z ObjectMixin. Rozumím tomu, že se tento přístup k vlastnostem objektu může zdát špatný či nepřirozený, ale radši než natvrdo zakázané write-only properties bych viděl jen doporučení v nějakých coding guidelines, že by se tyto neměly používat.
David už se k tomu vyjadřoval zde:
Write-Only properties se obvykle považují za chybu návrhu, proto je Nette nepodporuje.
Editoval Blizzy (23. 10. 2010 21:49)
- Honza Marek
- Člen | 1664
<subjektivní názor>
Ono vůbec by se mělo s používáním properties šetřit. Ono to má smysl
vesměs jen u $this->template a v šablonách. Jinde to kód spíš
znepřehledňuje.
</subjektivní názor>
- jtousek
- Člen | 951
To jsem vyřešil ještě o něco líp… ale není to optimální, pořád je to magie Nette\Object.
<?php
/**
* Support for write-only property
* @ignore
*/
public function getPassword() {
throw new \MemberAccessException('Cannot read a write-only property UserEntity::$password.');
}
?>
David už se k tomu vyjadřoval zde:
Write-Only properties se obvykle považují za chybu návrhu, proto je Nette nepodporuje.
I pokud to je „obvykle“ chyba návrhu tak to není důvod to zakazovat. Nikdo také „obvykle“ nepotřebuje přepisovat konstruktor Presenteru a komponenty a David ho odmítl dát jako final (s čímž souhlasím). Připadá mi to jako úplně stejný princip.
Editoval jtousek (23. 10. 2010 22:21)