[python] Tipy na n�vrh t��dy

slush slush na centrum.cz
Sobota Srpen 2 11:24:02 CEST 2008


Taky zdravim a taky nesouhlasim, ikdyz ne zcela.

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.

Zrejme kazdy povazujeme za elegantni neco jineho.

Marek


> Zdravím...
> ...a zcela nesouhlasím. Návrhové vzory jsem nikdy neměl
> rád protože jsem zastáncem toho, že je vždy třeba
> posoudit konrétní situaci a najít chytré řešení, ne
> napasovat nějakou "oficiální" metodu jen pro vytvoření
> dojmu něčeho lepšího. Navíc, s OOP se to nikdy nesmí
> přehánět, a co-příkaz-to-třída může spíš uškodit než na
> opak.
>
> Měli bychom se ptát: co je příkaz ? Je to reakce na
> událost, reakce jako kód, posloupnost odpovědí vyvolaných
> určitou podmínkou. Kód, tedy funkce. Necpějeme OOP, kam
> nepatří, jen protože je to OO. Odhoďme předsudky, odhoďme
> iluze. Ne vždy je dokonalé zapozdření či úplná
> objektovost ideálním východiskem. Proto se také Python
> nevydal cestou Javy. Protože tam je vynucené používání
> tříd na příliš mnoho věcí, kde je to jinak absurdní.
>
> Je třeba přemýšlet. Každý problém si vyžaduje řešení.
> Důmyslné, originální a chytré řešení, které zároveň je
> pohodlné pro okolí. V tomto případě navrhuji rozšířit
> původní, dle mého názoru dobrý, nápad, jen bez
> "zneužívání" dokumentačních řetězců, které se můžou třeba
> později zneužít pro nápovědu k příkazům.
>
> Dekorátor. Opět to samozřejmě vyžaduje prohledání
> namespace, ale od čeho máme metatřídy ? Je nesmysl to
> dělat při každé inicializaci instance. Při vytváření
> třídy se stejně ns prochází a mění, takže na efektivitě
> netratíme. Ba naopak.
>
> import inspect
>
> class CmdMeta(type):
>    def __init__(self, *a):
>        type.__init__(*a)
>        self.commands={}
>        for k,v in inspect.getmembers(self):
>            if hasattr(v, '__command__'):
>                self.commands[v.__command__]=v
>
> class command(object):
>    def __init__(self, cmd):
>        self.cmd=cmd
>    def __call__(self, fx): #when decorating
>        fx.__command__=self.cmd
>        return fx
>
> class Commands(object):
>    __metaclass__=CmdMeta
>
>    ### vlastní definice příkazů ###
>    @command("echo")
>    def echo(self, rest):
>        self.connection.send(rest)
>    ################################
>
>    def execute_command(self, line):
>        cmd,rest=line.split(None, 1)
>        self.__class__.commands[cmd](self, rest) #unbound
>
> Ukázka je velmi jednoduchá ve stylu "příkazového řádku",
> tedy že bere jen formát "příkaz parametr", ale to již lze
> jakkoliv upravit. A troufám si toto řešení označit za
> elegantní...
>
>
> --
> regnarg --- http://rg.pretel.cz -- JID: regnarg na jabber.cz
> V péči o štěstí druhých nacházíme své vlastní.   --Platón
> Přátelství může trvat jedině mezi dobrými lidmi. --Cicero
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://www.py.cz/pipermail/python/attachments/20080802/bdf532ea/attachment.htm 


Další informace o konferenci Python