Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2015-05-26

Patterns

DP это Design Patterns, хорошо известные любому толковому программеру.
Давайте поглядим на DP применительно к Python.

Delegate pattern
the delegation pattern is a design pattern in object-oriented programming where an object, instead of performing one of its stated tasks, delegates that task to an associated helper object. There is an Inversion of Responsibility in which a helper object, known as a delegate, is given the responsibility to execute a task for the delegator.

Понятно, что применение этого шаблона может привести к утомительной работе: прописыванию в делегирующем классе всех свойств реализуемого интерфейса.
Но может и нет. Это Python, Карл!

Джейкоб Циммерман показывает как

class DelegatedAttribute:
    def __init__(self, delegate_name, attr_name):
        self.attr_name = attr_name
        self.delegate_name = delegate_name

    def __get__(self, instance, owner):
        if instance is None:
            return self
        else:
            # return instance.delegate.attr
            return getattr(self.delegate(instance),  self.attr_name)

    def __set__(self, instance, value):
        # instance.delegate.attr = value
        setattr(self.delegate(instance), self.attr_name, value)

    def __delete__(self, instance):
        delattr(self.delegate(instance), self.attr_name)

    def delegate(self, instance):
        return getattr(instance, self.delegate_name)

    def __str__(self):
        return "<delegated attribute, '" + self.attr_name + "' at " + str(id(self)) + '>'
Это будет обертка вокруг свойств делегата.

class Foo:
    def __init__(self):
        self.bar = 'bar in foo'
    def baz(self):
        return 'baz in foo'

class Baz:
    def __init__(self):
        self.foo = Foo()
    bar = DelegatedAttribute('foo', 'bar')
    baz = DelegatedAttribute('foo', 'baz')

x = Baz()
print(x.bar)  # prints 'bar in foo'
print(x.baz())  # prints 'baz in foo'
Это демонстрация того, как оно работает.

А теперь самое вкусное, декоратор, выполняющий всю нудную работу по прописыванию делегируемых свойств в словарь делегатора
def delegate_as(delegate_cls):
    # gather the attributes of the delegate class to add to the decorated class
    attributes = set(delegate_cls.__dict__.keys())

    def inner(cls):
        # create property for storing the delegate
        setattr(cls, 'delegate', SimpleProperty())
        # don't bother adding attributes that the class already has
        attrs = attributes - set(cls.__dict__.keys())
        # set all the attributes
        for attr in attrs:
            setattr(cls, attr, DelegatedAttribute('delegate', attr))
        return cls
  
    return inner


Часть вторая, Borg versus Singleton
Статья Алекса Мартелли, многим известного по книгам http://www.oreilly.com/pub/au/918

Начав с реверансов, что DP это хорошо и правильно, Алекс продолжает так:

Python's forte is simplicity. Again and again, problems that are difficult in other languages scale down to "pretty easy" in the light of Python's bright Sun. The amount and caliber of intellectual weaponry that it makes sense to bring to bear on a problem depends on the problem's difficulty level. For a simpler problem, an informal approach may make more sense, while a harder problem might profit from more structured and formalized procedures. One plus of making problems simpler is that, the simpler a problem, the more simplicity you can deploy in solving it. Of course, one always aims (or should) at making each solution as simple as it can possibly be (but, admittedly, no simpler than that:-). Maybe you can get away with an idiom (language specific usage), or even just "good common practice", where another language would require you to unearth and apply a full-fledged design pattern. At times, it's a reasonably big win, in terms of simplicity, even just to avoid forcing an aspect of the solution into the object oriented mold (so pervasive, and indeed so often appropriate, in software development Design Patterns). One aspect of Python's simplicity is, indeed, that you only do OO when you want to!

И далее показывает, что всеми любимый DP Singleton легким движением превращается в шорты четыре строчки на Python

class Borg:
    _shared_state = {}
    def __init__(self):
        self.__dict__ = self._shared_state

хоть и содержит многабукав, крайне рекомендована к изучению.


Часть третья, релаксационная заключительная. Тоже про шаблоны, шаблоны самодисциплины в разработке.
9 Anti-Patterns Every Programmer Should Be Aware Of

A healthy dose of self-criticism is fundamental to professional and personal growth

1 Premature Optimization
2 Bikeshedding
3 Analysis Paralysis
4 God Class
5 Fear of Adding Classes
6 Inner-platform Effect
7 Magic Numbers and Strings
8 Management by Numbers
9 Useless (Poltergeist) Classes



Понятно без пояснений, правда?



original post http://vasnake.blogspot.com/2015/05/patterns.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)