<div dir="ltr"><div class="gmail_quote"><div>Taky zdravim a taky nesouhlasim, ikdyz ne zcela.<br><br>To, ze se to s OOP nesmi prehanet souhlasim, ale tohle se primo vybizi. Prikaz *je* objekt a ma vlastnosti, ktere do neobjektoveho modelu (v tomto pripade dekoratory) budete lamat pres koleno. Ma napriklad vlastnosti (jmeno, prava pristupu), muze vyuzit dedicnost (mimo odvozeni od zakladni tridy Command lze samozrejme prikaz odvodit od nejakeho jineho a tim rozsirit jeho funkcnost) atd. Objektovy model v tomto pripade je velmi jednoduchy, rozsirovatelny a *prehledny*. Pokud budete chtit rozsirit kod s dekoratory napriklad o prava pristupu/vlastniky, nenapada me jednoduchy postup.<br>
<br>Zrejme kazdy povazujeme za elegantni neco jineho.<br><br>Marek<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
Zdravím...<br>
...a zcela nesouhlasím. Návrhové vzory jsem nikdy neměl<br>
rád protože jsem zastáncem toho, že je vždy třeba<br>
posoudit konrétní situaci a najít chytré řešení, ne<br>
napasovat nějakou &quot;oficiální&quot; metodu jen pro vytvoření<br>
dojmu něčeho lepšího. Navíc, s OOP se to nikdy nesmí<br>
přehánět, a co-příkaz-to-třída může spíš uškodit než na<br>
opak.<br>
<br>
Měli bychom se ptát: co je příkaz ? Je to reakce na<br>
událost, reakce jako kód, posloupnost odpovědí vyvolaných<br>
určitou podmínkou. Kód, tedy funkce. Necpějeme OOP, kam<br>
nepatří, jen protože je to OO. Odhoďme předsudky, odhoďme<br>
iluze. Ne vždy je dokonalé zapozdření či úplná<br>
objektovost ideálním východiskem. Proto se také Python<br>
nevydal cestou Javy. Protože tam je vynucené používání<br>
tříd na příliš mnoho věcí, kde je to jinak absurdní.<br>
<br>
Je třeba přemýšlet. Každý problém si vyžaduje řešení.<br>
Důmyslné, originální a chytré řešení, které zároveň je<br>
pohodlné pro okolí. V tomto případě navrhuji rozšířit<br>
původní, dle mého názoru dobrý, nápad, jen bez<br>
&quot;zneužívání&quot; dokumentačních řetězců, které se můžou třeba<br>
později zneužít pro nápovědu k příkazům.<br>
<br>
Dekorátor. Opět to samozřejmě vyžaduje prohledání<br>
namespace, ale od čeho máme metatřídy ? Je nesmysl to<br>
dělat při každé inicializaci instance. Při vytváření<br>
třídy se stejně ns prochází a mění, takže na efektivitě<br>
netratíme. Ba naopak.<br>
<br>
import inspect<br>
<br>
class CmdMeta(type):<br>
 &nbsp; &nbsp;def __init__(self, *a):<br>
 &nbsp; &nbsp; &nbsp; &nbsp;type.__init__(*a)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;self.commands={}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;for k,v in inspect.getmembers(self):<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if hasattr(v, &#39;__command__&#39;):<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.commands[v.__command__]=v<br>
<br>
class command(object):<br>
 &nbsp; &nbsp;def __init__(self, cmd):<br>
 &nbsp; &nbsp; &nbsp; &nbsp;self.cmd=cmd<br>
 &nbsp; &nbsp;def __call__(self, fx): #when decorating<br>
 &nbsp; &nbsp; &nbsp; &nbsp;fx.__command__=self.cmd<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return fx<br>
<br>
class Commands(object):<br>
 &nbsp; &nbsp;__metaclass__=CmdMeta<br>
<br>
 &nbsp; &nbsp;### vlastní definice příkazů ###<br>
 &nbsp; &nbsp;@command(&quot;echo&quot;)<br>
 &nbsp; &nbsp;def echo(self, rest):<br>
 &nbsp; &nbsp; &nbsp; &nbsp;self.connection.send(rest)<br>
 &nbsp; &nbsp;################################<br>
<br>
 &nbsp; &nbsp;def execute_command(self, line):<br>
 &nbsp; &nbsp; &nbsp; &nbsp;cmd,rest=line.split(None, 1)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;self.__class__.commands[cmd](self, rest) #unbound<br>
<br>
Ukázka je velmi jednoduchá ve stylu &quot;příkazového řádku&quot;,<br>
tedy že bere jen formát &quot;příkaz parametr&quot;, ale to již lze<br>
jakkoliv upravit. A troufám si toto řešení označit za<br>
elegantní...<br>
<br>
<br>
--<br>
regnarg --- <a href="http://rg.pretel.cz" target="_blank">http://rg.pretel.cz</a> -- JID: <a href="mailto:regnarg@jabber.cz">regnarg@jabber.cz</a><br>
V péči o štěstí druhých nacházíme své vlastní. &nbsp; --Platón<br>
Přátelství může trvat jedině mezi dobrými lidmi. --Cicero<br>
<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@py.cz">Python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
</blockquote></div><br></div>