[Python] Pattern singleton e chiamata __call__

Daniele Varrazzo piro a develer.com
Gio 29 Mar 2007 11:47:49 CEST


>> Non abbiamo bisogno del singleton, ne del borg. Li abbiamo gia'.
>
> Non che mi sia mai servito ma perché dovremmo evitare Borg?
>
> <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531>

Un esempio è questo: questo bug è nato dall'uso del borg.

http://sourceforge.net/tracker/index.php?func=detail&aid=1678046&group_id=32455&atid=405618

Ogni tanto (in maniera replicabile ma fortemente dipendente dalle condizioni
iniziali: un mandelbug), generando le API di Twisted con Epydoc, tutti i
valori None (es. i default delle funzioni) diventavano la stringa 'gtk'.

Usare i borg è un enorme passo indietro sul piano della prevedibilità del
codice: cambi lo stato dell'istanza 'a' e si altera quello dell'istanza 'b'
anche se 'a is not b'. ('a' e 'b' sono in effetti diventati dei proxi verso
uno stato condiviso). Crollano tutte le certezze degli uomini di fede...

Ci si potrebbe limitare a usarlo "con educazione", ma quello che si può
ottenere usando un borg lo si può ottenere anche usando factory methods,
istanze interne, moduli, classi statiche, metaclassi e quant'altro per avere
un oggetto che sia (o, a scelta, si comporti come) un'istanza unica per
tutta la durata in vita di dell'applicazione, ma senza violare la "least
surprise rule".

-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python