È una cattiva pratica avere un'interfaccia per definire le costanti?

40

Sto scrivendo un set di classi di test junit in Java. Esistono diverse costanti, ad esempio stringhe che mi serviranno in diverse classi di test. Sto pensando a un'interfaccia che li definisce e ogni classe di test la implementerebbe.

I vantaggi che vedo sono:

  • facile accesso alle costanti: MY_CONSTANT anziché ThatClass.MY_CONSTANT
  • ogni costante definita solo una volta

Questo approccio è piuttosto una buona o cattiva pratica? Mi sento di abusare un po 'del concetto di interfacce.

Puoi rispondere in generale a interfacce / costanti, ma anche a test di unità se c'è qualcosa di speciale in proposito.

    
posta FabianB 19.02.2011 - 02:55
fonte

7 risposte

75

Joshua Bloch lo sconsiglia nel suo libro Java efficace :

That a class uses some constants internally is an implementation detail. Implementing a constant interface causes this implementation detail to leak into the classes exported API. It is of no consequence to the users of a class that the class implements a constant interface. In fact, it may even confuse them. Worse, it represents a commitment: if in a future release the class is modified so that it no longer needs to use the constants, it still must implement the interface to ensure binary compatibility.

Puoi ottenere lo stesso effetto con una classe normale che definisce le costanti e quindi utilizzare import static com.example.Constants.*;

    
risposta data 19.02.2011 - 04:04
fonte
11

Nel nostro caso lo stiamo facendo perché i valori delle costanti rappresentano un contratto per gli stati finali che è richiesta l'implementazione di un servizio. Mettere queste costanti nell'interfaccia specifica gli stati finali come parte del contratto, e se qualche implementazione dell'interfaccia non li usa, non farebbe il suo lavoro.

A volte le costanti sono dettagli di implementazione. A volte non lo sono. Come al solito, un ingegnere ha bisogno di usare il suo cervello per decidere cosa fare, e non fare affidamento su un modello o una pratica radicale.

    
risposta data 01.08.2014 - 17:02
fonte
7

Non penso che sia una buona cosa avere interfacce solo per le costanti.

Ma se un'interfaccia che definisce il comportamento (i metodi che implementano le classi dovrebbero implementare), ha delle costanti, va bene. Se emette "i dettagli di alcuni implementor" nell'API, è perché è così che dovrebbe essere. Perdono anche che l'implementatore implementa metodi foo e bar.

Prendi ad esempio l'interfaccia java.awt.Transparency. Ha costanti OPAQUE, BITMASK e TRANSLUCENT ma ha anche il metodo getTransparency ().

Se il progettista ha messo quelle costanti lì è perché pensava che sarebbe stato abbastanza stabile da far parte dell'interfaccia, come è getTransparency ().

    
risposta data 01.08.2014 - 18:22
fonte
2

Penso che sia un punto di vista per lo più popolare in luoghi in cui la progettazione per contratto è prevalente.
 Le interfacce sono contratti. Posizionare le costanti nelle interfacce significa che ogni classe che rispetta il contratto accetta il valore / concetto identificato dalla costante.

    
risposta data 19.02.2011 - 03:18
fonte
2

Una società a cui ho lavorato ha fatto un uso pesante delle costanti 1 importate dall'interfaccia. Non sento alcun danno ne sia derivato.

La domanda che dovresti porci è, quanto è importante il namespace per te? Nel caso delle costanti, è davvero tutta una classe che agisce come. Se hai migliaia di costanti, potresti non volere che tutte queste costanti siano sempre disponibili.

La cosa interessante delle interfacce è che ti dà il vantaggio di lavorare in entrambi i modi: porta tutti gli spazi dei nomi di cui hai bisogno, o nessuno di loro (e accedili esplicitamente con MyInterface.CONSTANT ). Praticamente la stessa cosa di import static MyInterface.* , ma un po 'più ovvio.

1: Se non hai familiarità con Java, non intendo la parola chiave import , voglio solo dire introdotta tramite implements MyConstantsInterface

    
risposta data 19.02.2011 - 03:04
fonte
1

Vengo da uno sfondo che è principalmente influenzato principalmente dal "modo Ada" e dal "modo Netto". Direi di no, che probabilmente non è meglio dichiarare le costanti all'interno delle interfacce. Non è tecnicamente consentito in c #.

La ragione per cui dico di no è che un'interfaccia è una forma di contratto che definisce il comportamento, non lo stato o la struttura. Una costante implica un tipo di stato (primitivo) o un aspetto di stato (composto o aggregato).

Riesco ad apprezzare l'urgenza di rendere i valori predefiniti e predefiniti disponibili a tutti coloro che implementano l'interfaccia, ma forse lo stato predefinito sarebbe meglio descritto in un oggetto o modello astratto o valore, in cui i valori predefiniti avrebbero almeno un contesto minimo.

Per una guida più tecnica: download.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

    
risposta data 19.02.2011 - 04:12
fonte
0

No, non è una cattiva pratica generale.

Il punto è che le costanti come qualsiasi altro artefatto dovrebbero essere introdotte secondo le regole della visibilità minima e del livello di astrazione appropriato.

Utilizzare la sintassi solo perché è possibile è il vero problema.

    
risposta data 01.06.2017 - 12:54
fonte

Leggi altre domande sui tag