2010-03-09 3 views
10

Sto creando il modello di dominio nel mio sistema. Quando si progettano i miei oggetti modello, dovrei creare interfacce per ciascun oggetto entità? Le persone mi hanno detto che il nostro livello web non dovrebbe preoccuparsi dell'implementazione di un'entità e dovremmo essere in grado di sostituire le implementazioni, ma non sono sicuro che ciò accadrà mai.Gli oggetti modello hanno interfacce?

Per esempio, se abbiamo una classe insegnante che mantiene un elenco di studenti, il metodo getStudents potrebbe essere:

public List<Student> getStudents() { 
     return this.students; 
} 

o questo:

public List<Student> getStudents() { 
    return someExternalService.retrieveStudents(); 
} 

ho capito questo beneficio, ma qual è la pratica generale?

+0

"pratica generale" non è necessariamente la stessa di "buona pratica", soprattutto quando si tratta di progettazione OO :) – skaffman

+3

Non ho il tuo esempio. La tua domanda è se l'insegnante dovrebbe implementare qualche interfaccia o usare una dipendenza attraverso un'interfaccia? Ho risposte diverse per questi due casi. Il tuo testo mi fa pensare che stai pensando il primo, ma l'esempio mi fa pensare che tu voglia il secondo. Che cos'è? –

+0

Martinho, la mia domanda è se l'insegnante deve implementare un'interfaccia e avere classi TeacherImpl risultanti. – sma

risposta

7

A meno che non si abbia una buona ragione per pensare che sarà necessario sostituire il modello, non me ne preoccuperei ancora. Basato sul principio YAGNI (You ain't gonna need it)

+0

Grazie per la risposta. Sono d'accordo con entrambi. In realtà ho un seguito a questo che pubblicherò come una domanda separata. Coinvolge associazioni di modelli. – sma

+4

A mio parere, YAGNI si applica più alla funzionalità, che al design. Ad esempio, le interfacce non contribuiscono a gonfiare il codice o complicazioni nei test; nella mia esperienza, è l'assenza di interfacce per ragioni di opportunità che è il problema. –

+0

@Noel - Penso che tu abbia ragione sulle sue origini, ma penso che possa essere utile evitare l'eccesso di ingegneria. Ho trovato un paio di occasioni per dire a qualcuno "Non ne avresti bisogno" e possono o confutare il tuo reclamo e fare una buona argomentazione per l'aggiunta, oppure trovano che non possono giustificarlo e decidere/realizzare che è non è davvero un requisito. Sono d'accordo, in questo caso non c'è niente di male nell'aggiungere interfacce, ma potrebbe portare ad aggiungere più codice "nel caso in cui". – David

2

Nessuno dei progetti che abbia mai visto o partecipato ha avuto interfacce per le entità di dominio.

Ma in uno dei miei progetti ho avuto interfaccia NamedEntity:

public interface NamedEntity { 
    int getId(); 
    String getName(); 
} 

Tutte le entità del dominio implementato questa interfaccia. Mi ha dato la possibilità di non creare diversi convertitori jsf per entità diverse ma creare un convertitore che usasse questa interfaccia al posto delle classi di dominio concreti.

+0

Bel esempio. Nitpick: tu dici che nessuno dei progetti che hai visto o partecipato ha avuto quel fenomeno, e quindi fornisci rapidamente un esempio di uno ... –

+0

Questo errore ha rivelato un bug (o semplicemente un comportamento non chiaro) nel conteggio della reputazione SO. – Roman

+0

Sono d'accordo. Io davvero non voglio che qualcuno abbia un'interfaccia, ma altri non sono d'accordo. – sma

1

Non posso parlare di pratica generale, ma non si tratta quasi di nascondere l'implementazione.

Si tratta di formalizzare l'interfaccia come base per documentazione e contratti.

In astrazione dei modelli in interfacce, si sta creando documentazione per gli sviluppatori di client di servizi. A seconda del tuo stile di sviluppo, potresti avere o meno una descrizione formale del tuo servizio (ad es. Una descrizione basata su WSDL). Le interfacce possono soddisfare questa esigenza.

+0

In realtà ciò si applica in qualche modo alla mia situazione. Ci sono sviluppatori di servizi client che basano i servizi fuori dai miei oggetti modello, quindi forse l'approccio all'interfaccia non è una cosa negativa. – sma

0

La mia opinione generale è che vorrei non creare un insieme one-to-one di interfacce per i modelli di dominio, poiché ciò non fa altro che duplicare la struttura di classi del modello di dominio. Non aggiunge nulla di utile.

I due casi mi viene in mente subito dove ho sarebbe considerare interfacce presentiamo è:

  1. un'interfaccia descrive il contratto/comportamento di alcuni set di classi nel modello di dominio, in cui è utile modello che il comportamento in modo indipendente delle classi che implementano
  2. è necessario esporre il modello di dominio per clienti esterni e vogliono nascondere i dettagli implementativi da loro

In altre parole, aggiungi interfacce se ti aiutano a descrivere il comportamento o ti aiutano a nascondere i dettagli di implementazione dai client. Altri motivi potrebbero essere validi, ma quelli sono quelli che vengono in mente.

+0

Sì, sono completamente d'accordo. Questo in realtà è iniziato come numero 2 in cui stavamo esponendo il modello di dominio a client esterni. Da quel momento l'approccio è cambiato e ora sono bloccato con un'interfaccia per ogni oggetto del modello. Ho pensato di liberarmene, ma prima volevo controllare con la comunità. – sma

1

Penso che ci sia una differenza importante tra l'avere un'interfaccia per il servizio per recuperare l'oggetto e l'oggetto del modello stesso.

In fase di esecuzione, il servizio per caricare un oggetto modello può differire in base al luogo in cui si richiedono i dati. Ma il formato e il tipo di oggetto dati attesi non cambiano, indipendentemente da come si crea questo oggetto. Pertanto gli oggetti del modello che trasportano lo stato non necessitano di un'interfaccia, ma le classi di servizio per creare e caricare questi oggetti modello necessitano dell'interfaccia.

L'unico motivo per cui gli oggetti del modello dispongono di interfacce avrebbe senso se l'oggetto del modello non è solo un semplice oggetto di tipo bean ma oggetto che espone anche un qualche tipo di comportamento.

0

L'estrazione di un'interfaccia è uno dei più semplici rifacimenti; Nel peggiore dei casi è un nome di classe -> metodo di spostamento. Lo sforzo di cambiare idea, una volta trovato un motivo per farlo, è minimo. Ho sempre trovato che se una decisione è facile da cambiare, rinforza ancora YAGNI e KISS. La contro-argomentazione è che non è molto difficile creare inizialmente un'interfaccia, il che è vero, ma la manutenzione si aggiunge nel tempo se la decisione viene presa più volte, spesso non utilizzata.