[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