Proč Nette\Object nepodporuje write-only property?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jtousek
Člen | 951
+
0
-

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
+
0
-

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
+
0
-

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í.

Patrik Votoček
Člen | 2221
+
0
-

Jak ověříš že se nastavila správná hodnota když nebudeš mít getter?

jtousek
Člen | 951
+
0
-

V uvedeném příkladu s heslem uživatele bys ani s gettrem nic neověřil. Od toho je to write-only.

@Blizzy: Díky, to jsou přesně mé myšlenky. :)

(nechce se mi psát další příspěvek)

Editoval jtousek (23. 10. 2010 21:38)

Blizzy
Člen | 149
+
0
-

@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
+
0
-

<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
+
0
-

@Honza Marek: Ne nutně. Když si u třídy nastavíš anotace @property(-read/-write) tak Netbeans potom i správně napovídají a kód je srozumitelnej dobře. Jenom není vhodné properties někdy používat a jindy ne, to už pak znepřehlenuje.

jansfabik
Člen | 193
+
0
-

já bych to řešil takhle

<?php
public function getPassword()
{
	throw new \MemberAccessException('Cannot read a write-only property UserEntity::$password.');
}
?>
jtousek
Člen | 951
+
0
-

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)