[PIPython] Python & Interface
Simone Piunno
pioppo
Ven 19 Nov 2004 15:16:48 CET
On Tuesday 03 August 2004 18:24, Giorgio Zoppi wrote:
> Ma scusate l'ignoranza...i GoF in Design Patterns non dicono che
> bisogna programmare per interfacce ...o non centra nulla?
IMHO "programmare per interfacce" è un concetto astratto che non ha a che
vedere necessariamente con gli specifici strumenti messi a disposizione da
questo o da quel linguaggio di programmazione.
Anche in ANSI C si può programmare per interfacce (anzi, si fa), è solo
questione di metodo e disciplina.
In particolare i GoF affermano questo principio all'inizio del libro nel
paragrafo 1.6, e non lo fanno in opposizione all'uso dell'ereditarietà in sè.
Si limitano a sottolineare l'utilità di ereditare da una classe astratta
rispetto ad estendere una implementazione concreta.
E' particolarmente significativa questa frase:
"When inheritance is used carefully (some will say *properly*), all classes
derived from an abstract class will share its interface. This implies that
a subclass merely adds or overrides operations and does not hide operations
of the parent class."
In un linguaggio in cui l'ereditarietà multipla manca, è evidente che una
classe non potrà esercitare "properly" questa metodologia, tranne quando la
classe in questione si limita ad implementare una sola interfaccia.
Nel momento in cui le interfacce da implementare sono multiple (ad esempio
perchè l'oggetto deve esporre "viste" diverse a seconda dell'*aspetto* sotto
il quale lo si sta guardando, o più banalmente perchè stai aggregando
comportamenti semplici) si rimane fregati e, per quanto ne so, le "java
interfaces" arrivano in soccorso proprio qui.
Ma in un linguaggio che supporta l'ereditarietà multipla non sono necessarie!
Dimmi ad esempio in quale modo il codice che segue violerebbe i precetti dei
GoF (tralasciando il fatto che pickle potrebbe utilmente diventare una
Strategy).
class Cloneable:
"Interfaccia di un oggetto clonabile"
def clone(self):
raise NotImplementedError
class Serializable:
"Interfaccia di un oggetto serializzabile"
def getstate(self):
raise NotImplementedError
def setstate(self, state):
raise NotImplementedError
class atoken(Cloneable, Serializable):
"Un oggetto concreto clonabile e serializzabile"
def __init__(self, token):
self._token = token
def clone(self):
return self.__class__(self._token)
def getstate(self):
import pickle
return pickle.dumps(self._token)
def setstate(self, state):
import pickle
self._token = pickle.loads(state)
--
http://thisurlenablesemailtogetthroughoverzealousspamfilters.org
More information about the Python
mailing list