2010-03-19 4 views
7

So che questa potrebbe sembrare una domanda controversa ma in realtà non è destinata a esserlo. c'è un numero ottimale di metodi in un'interfaccia.numero di metodi in un'interfaccia

Ad esempio, io personalmente odio un'interfaccia con 20 metodi. È solo difficile da implementare. Il contratto sembra difficile da mantenere. Allo stesso modo se il numero di metodi è solo 1. Mi chiedo se sia davvero una buona astrazione.

Qualche idea?

+4

Questo dovrebbe essere nella comunità wiki btw ... – Ascalonian

+3

"Allo stesso modo, se il numero di metodi è solo 1. E mi domando se è veramente un buon astrazione." <- Perché? Ci sono molte interfacce con un solo metodo che vengono utilizzate molto. Paragonabili e Iterable vengono in mente - quelli sono decisamente abbastanza utili. – sepp2k

risposta

15

Un'interfaccia deve disporre esattamente di tutti i metodi necessari. Esempi:

java.lang.Iterable-1 metodo
java.lang.Comparable-1 metodo
java.util.Collection - 14 Metodi
java.util.List - 25 metodi (compresi quelli provenienti da Collection)

Quindi la risposta è - non prendere il numero come un criterio per la tua interfaccia. Invece, metti i metodi nelle interfacce in cui appartengono logicamente.

+1

java.lang.Runnable - 1 metodo :) –

+2

java.io.Serializable - 0 metodi :) – pgmura

+0

'Serializable' è una storia completamente diversa;) (' Cloneable' è un'altra storia diversa) – Bozho

5

C'è un well-known study che suggerisce che il numero di elementi di informazioni che possiamo elaborare in un momento è sette, più o meno due. Trovo spesso che questa sia una buona regola per questo tipo di domande - in questo caso, se l'interfaccia è progettata per gestire un singolo set di funzionalità correlate, probabilmente non saremo in grado di comprendere la funzionalità come un singolo imposta se è molto più di sette.

Tuttavia, per molte interfacce uno sviluppatore non deve essere in grado di comprendere la funzionalità come un singolo set correlato, nel qual caso questa regola non sarebbe rilevante.

0

Il modo per gestire molti metodi quando è necessario implementarne solo alcuni è Abstract classi che forniscono implementazioni predefinite o throw NotImplementedException. Se esiste un solo metodo, probabilmente è ok perché ci sono metodi che si aspettano solo una Iterface e chiamano quel metodo. Ci sono molti modelli, per esempio Vistor ha bisogno di un solo metodo.

4

Le interfacce well con un metodo di solito hanno lo scopo e possono essere implementate in modo anonimo più facilmente. La mia regola generale è come molti metodi di cui ha bisogno di avere. Tuttavia, molti metodi in un'interfaccia di solito suggeriscono che è possibile dividerlo in diverse altre interfacce, specialmente quando questo interessa aree di attività diverse (ad esempio, UserLoginAndAdministrationInterface diventa un UserLogin e un'interfaccia UserAdministration). Puoi implementare tutte le interfacce che vuoi in una classe e anche loro possono essere sottoclasse. Quindi dividerli non fa assolutamente male.

4

Un'interfaccia deve avere esattamente quanti metodi come ha bisogno di.

Se questo numero è elevato, è necessario esaminare attentamente la motivazione, ma potrebbe essere valida.

D'altra parte c'è (almeno) un'istanza in Java in cui l'interfaccia non ha bisogno di metodi (serializzabile) e quindi non ne ha. Meno metodi, rende sicuramente più semplice l'implementazione dell'interfaccia ma può comunque fornire un'astrazione molto utile. Ci sono un certo numero di interfacce con un metodo.

4

Sarei più preoccupato del fatto che l'interfaccia sia logicamente coerente rispetto a un numero arbitrario di metodi ottimale.Detto questo, un gran numero di metodi potrebbe indicare un oggetto "dio", che dovrebbe essere refactored. L'indicazione più chiara è che i metodi non sono coesi, ma il numero di metodi potrebbe essere più semplice da osservare e portare a un esame più approfondito. A volte, però, hai solo bisogno di avere molti metodi perché ci sono molte operazioni possibili che ti piacerebbe fare su oggetti di quel tipo. Un esempio di questo sarebbe qualcosa come IEnumerable<T> in .NET. Non riesco a pensare ad alcun motivo valido per rompere quelli in interfacce separate, eppure ci sono molti metodi nell'interfaccia.

3

C'è no numero ottimale di metodi in un'interfaccia. Le interfacce sono utilizzate per tutti i tipi di cose diverse e ciò che è appropriato dipende interamente da cosa.

Su un estremo, un'interfaccia potrebbe essere generata automaticamente da un programma per il consumo da parte di un altro programma, e potrebbe per buona ragione contenere 1.000 metodi.

Per codice leggibile dall'uomo, le regole non possono sostituire il giudizio.

0

Questi venti metodi catturano qualcosa di utile insieme o no. Se lo fanno, allora è necessario implementare tutti loro per fornire un'implementazione a quella cosa che catturano. Sarà coerente ospitarli nella stessa interfaccia in questo caso.

-1

la risposta è: non prendere il numero come criterio per l'interfaccia. Invece, metti i metodi nelle interfacce in cui appartengono logicamente e puoi usarli in diverse classi puoi usare un metodo di interfaccia in due o più classi quindi non esitare a usare l'interfaccia è una buona tecnica di programmazione.

+1

Perché hai copiato e incollato la mia risposta? Nella speranza di guadagnare reputazione? questo non è il modo. – Bozho

+0

scusa caro, ma sto cercando di dare la mia risposta. – Sanjeev

1

Non esiste una risposta giusta o errata al numero di metodi accettabili per un'interfaccia. Alcuni possono avere zero, altri uno, e probabilmente pochissimi ne supereranno mai cento. L'interfaccia più grande che abbia mai scritto era di circa trenta metodi, ma era una facciata per i clienti.

Tuttavia, penserei che un'interfaccia che avesse più di 8-10 metodi sarebbe un possibile codice di fumo - solo qualcosa che meriterebbe 5 secondi per indagare.