Convenienza vs Disaccoppiamento / Composizione

0

Diciamo che ho una piccola libreria per masterizzare CD scritta in Python, con una classe CD e un'interfaccia Burner + classi di implementazione:

# Module cd.py
class CD:
  def __init__(self):
    self.folders = []
    self.files = []

# Module burners/burners.py
BURNERS = []

# Module burners/cdburnerxp.py
class CDBurnerXP(CDBurner):
  def burn_cd(self, cd):
    # burn baby burn
BURNERS.append(CDBurnerXP)

Se desidero aggiungere un metodo conveniente alla classe CD :

def burn(self):
    return BURNERS[0].burn_cd(self)

causerà problemi in futuro? È considerato più accoppiato che istanziare il bruciatore all'esterno da noi stessi?

Inoltre, se desidero aggiungere una factory per ricreare un CD da un'unità fisica:

# Module factories/drive.py
from cd import CD
DriveBasedCDFactory(CDFactory):
    def create_cd(self):
        # stuff
        return CD()

Aggiungerà un

@classmethod
def from_drive(cls):
  return DriveBasedCDFactory().create_cd()

a CD causano anche più accoppiamenti? Come posso risolvere l'importazione circolare implicita?

    
posta Bharel 21.07.2017 - 00:18
fonte

1 risposta

3

Il metodo di convenienza crea una dipendenza circolare con CD e Burner (che hai visto attraverso importazione circolare). Questo è sempre un odore di design, e invece di cercare di correggere il sintomo immediato, dovresti fare un passo indietro e riflettere sul design. Penso che tu abbia già un buon design senza il metodo burn su CD . È molto chiaro che tu usi un'istanza di Burner per masterizzare un CD . Mi consente all'utente di scegliere quale implementazione di Burner voglio utilizzare e posso persino creare la mia implementazione se mancano le tue. Il metodo di convenienza d'altra parte è estremamente inflessibile. Non puoi scegliere quale masterizzatore per utente: è strettamente accoppiato a BURNERS[0] . Potrebbe semplicemente confondere gli utenti. Infine, è difficile testare l'unità CD.burn perché l'accoppiamento stretto e globale. Le stesse limitazioni si applicano a CD.from_drive .

Ti suggerisco di avere solo un modo per portare a termine un compito. Avere un metodo di convenienza nel CD rende poco chiaro all'utente se deve usare quel metodo o usare direttamente l'istanza Burner . Se lo aggiungi ora, dovrai continuare a supportarlo (o rompere i client), e imposterà un cattivo precedente per altri contributori per l'aggiunta di questi tipi di metodi.

Come sostenitore dei modelli di dati anemici ti consiglio di non aggiungere comportamenti alla tua classe CD e di mantenerla pura dati: file e cartelle.

    
risposta data 21.07.2017 - 00:39
fonte

Leggi altre domande sui tag