Versione Pythonic delle interfacce Java

1

Riconosco pienamente che Python e Java sono linguaggi di programmazione diversi e dovrebbero essere usati in modo diverso. Detto questo, "Programmare un'interfaccia, non un'implementazione" è un buon consiglio di programmazione agnostico.

Supponiamo di avere un'interfaccia DAO in Java:

public interface DataDao {

  Object load();
  void update();
  void delete();
}

La programmazione su quell'interfaccia mi consente di conservare i dati nei file mentre sono in fase di prototipazione, di scambiarli per un database man mano che procedo oltre, ecc. abbastanza facilmente, purché rispetti il contratto di DataDao .

Qual è l'approccio / versione Pythonic (se esiste) alla programmazione di un contratto per mantenere le tue classi ortogonali, modulari e abilitare cambiamenti di implementazione senza attrito?

    
posta rpmartz 24.02.2014 - 00:46
fonte

1 risposta

2

Puoi utilizzare classi base astratte , se veramente vuoi . Un'altra opzione potrebbe essere quella di utilizzare la libreria di simulazione durante lo sviluppo e in particolare durante i test.

Una classe base astratta è come un mix di un'interfaccia Java con una classe astratta Java: non può essere istanziata direttamente, le sottoclassi devono implementare tutti i suoi metodi, ma i metodi parent potrebbero avere un'implementazione che può essere richiamata tramite super .

Ecco un esempio di DAO astratto, con sottoclassi concrete supportate da file e database:

import abc

class DataAccess(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def load(self):
        pass

    @abc.abstractmethod
    def update(self):
        pass

    @abc.abstractmethod
    def delete(self):
        pass

class FileDataAccess(DataAccess):

    def load(self):
        with open(self.filename, 'r') as infile:
            contents = infile.read()
        return contents

    def update(self):
        pass

    def delete(self):
        pass

class DbDataAccess(DataAccess):

    def load(self):
        pass

    def update(self):
        pass

    def delete(self):
        pass
    
risposta data 24.02.2014 - 23:09
fonte