Domanda

Sono stato un programmatore Java per gli ultimi 6 anni, e dall'inizio di quest'anno mi sono interessato nella programmazione del gioco. Così, ho pensato che fosse una buona idea per iniziare con un gioco popolare e ho implementato il gioco Ms. Pac-Man in Java. Posso dire che la mia applicazione sembra circa il 90% simile al gioco originale, e ho cercato di utilizzare il più modelli di progettazione e le migliori pratiche possibili, dal momento che questo era solo un progetto personale per imparare a codificare i giochi di base 2D.

Ora che ho finito la codifica, mi sono reso conto che ho 19 interfacce e appena 17 classi! Così inizio a chiedermi se avrei potuto essere un uso eccessivo di interfacce.

Ecco un esempio di alcune classi / interfacce che uso:

Class - FullGame (implementa FullGameInterface e FullGameObservable)

Class - Visualizzazione1 (attrezzi FullGameObserver)

Interfaccia - FullGameInterface (metodi di base di funzionalità:. Curriculum, pausa, gioco, etc)

Interfaccia - FullGameObservable (permette una vista da registrare per la notifica di aggiornamento)

Interfaccia - FullGameObserver (attuata dai 2 diversi punti di vista del gioco per ricevere le notifiche)

Sono un uso eccessivo di interfacce?

Qual è la vostra opinione?

È stato utile?

Soluzione

Le interfacce sono buone. Non è un problema di avere un sacco di loro.

In particolare, se hai implementato solo la tua prima partita. Se si ri-usato la base di codice per costruire più giochi, si sarebbe probabilmente finire con più il polimorfismo, perché devi essere ri-utilizzando le interfacce. Ma a questo punto, se è il caso che ci sono metodi più nelle implementazioni che nelle interfacce, poi le interfacce sono al servizio di un obiettivo - they're nasconde i dettagli di implementazione da parte dei clienti, che sono così costretti a conformarsi all'interfaccia , consentendo il polimorfismo che è il vero vantaggio di OO.

Altri suggerimenti

Con un'interfaccia se si desidera cambiare l'implementazione.

Per qualcosa come il vostro oggetto FullGame, probabilmente non hanno bisogno l'interfaccia.

Se si dovesse cambiare mai la funzionalità di FullGame, allora si potrebbe considerare la possibilità di un'interfaccia, in modo che si può passare che obiettare si crea un'istanza per FullGameInterface.

EDIT 2: fare solo il codice più complesso quando è necessario. Se pensi di aver bisogno di un'interfaccia, fermarsi prima. Utilizzare la classe che hai già. (Ma mentre lo si utilizza, cercare di mantenere i chiamanti fuori dei dettagli di implementazione.) Una volta che avete una seconda classe simile, allora si può capire che cosa sta realmente interfaccia e ciò che è l'attuazione. Se i chiamanti hanno ancora bisogno di dettagli di implementazione che sono scomodi da mettere nel interfaccia comune, allora non stai tenerli separati in modo pulito abbastanza.

EDIT per una risposta più completa:

Le interfacce sono utili per il disaccoppiamento i metodi con cui si desidera accedere ad un oggetto (l'interfaccia) dall'oggetto reale (l'implementazione). Questo è un bene per diverse situazioni:

  1. Hai più di un'applicazione di tali metodi, con la stessa semantica e le operazioni generali, ma con diverse implementazioni sottostanti. Ad esempio, List, ArrayList e LinkedList. List è l'interfaccia generale che consente ai metodi di molte collezioni-based per accettare sia un ArrayList o un LinkedList. L'interfaccia permette Collection un accordo simile per tutte le collezioni.
  2. è necessario separare l'interfaccia dall'implementazione per motivi architettonici. Ad esempio, si potrebbe avere l'oggetto chiamando su una macchina e l'oggetto che implementa su un altro. Un proxy sulla macchina chiamata implementa l'interfaccia di chiamare attraverso la rete per l'oggetto reale. L'interfaccia significa che il chiamante non ha bisogno di conoscere la differenza. Java RMI ha fatto questo.
  3. È necessario essere in grado di modificare il modo in cui l'oggetto è chiamato. Ad esempio, fare un Image interfaccia e due implementatori, FileImage e FileImageProxy. Il proxy carica il FileImage su richiesta e passa chiamate all'interfaccia Image al oggetto effettivo. I clienti sanno mai o cura come ottenere l'immagine, o se è davvero caricata o no; sanno solo che c'è un Image e possono utilizzarlo.

Se si è in controllo del codice e non v'è una sola applicazione, che è un buon segno che l'interfaccia è inutile (anche se potrebbe essere utile se si desidera, ad esempio, test). Ricorda che le classi interne sono classi troppo.

L'ereditarietà multipla dell'interfaccia, nonché l'attuazione, di solito è una cattiva idea.

Io uso spesso interfacce per rimpolpare il mio disegno. loro mi documento a fondo e questo mi costringe a pensare attraverso le responsabilità delle mie classi. C'è sempre qualche distinzione tra l'API e gli elementi interni di una classe, quindi, anche se non si dispone di più implementazioni di (ancora) che generalmente non fa male per specificare un'interfaccia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top