Un'interfaccia che include diversi metodi che restituiscono istanze di Object ha senso?

1

Sono in procinto di scrivere la mia prima vera API. Nel processo, sto definendo un'interfaccia per mappare strutture dati complesse su altre strutture dati complesse.

Al momento, l'interfaccia contiene un metodo set per la struttura dei dati di input, un metodo run per avviare il processo di mappatura e diversi metodi che hanno fondamentalmente la stessa firma, ma ovviamente nomi diversi e diversi documentazione. Questi ultimi restituiscono java.lang.Object . Qualcosa come segue.

public interface DataCompiler {

  public void setInputDataStructure(IDS ids);

  public void run();

  /**
   * Maps a "this" structure to a target "this" structure and
   * returns the resulting target "this" structure.
   */
  public Object mapThisStructure();

  /**
   * Maps a "that" structure to a target "that" structure and
   * returns the resulting target "that" structure.
   */
  public Object mapThatStructure();

  /**
   * Maps an "other" structure to a target "other" structure and
   * returns the resulting target "other" structure.
   */
  public Object mapOtherStructure();

}

Quindi, un'interfaccia è pensata per definire un contratto che deve essere soddisfatto dalle implementazioni dell'interfaccia.

Tuttavia, con la mia interfaccia non vi è alcun accorgimento di sicurezza nelle firme del metodo stesso per impedire l'uso improprio di uno degli ultimi tre metodi. Ad esempio, mapThisStructure potrebbe effettivamente essere implementato nel modo esatto in cui mapThatStructure è significato da implementare. Oppure, qualcuno potrebbe mettere tutto il lavoro di mappatura in uno dei tre mappaggi (il che ovviamente infrangerebbe il principio di un metodo che fa una e una sola cosa ), e lascia semplicemente che gli altri due restituiscano null .

Quindi il contratto effettivo è definito nel JavaDoc. Quindi, l'impostazione di tale interfaccia ha senso?

    
posta s.d 27.01.2016 - 14:07
fonte

2 risposte

4

Il sistema di tipi può fare molte cose per te, ma anche il miglior sistema di tipi non può fare tutto . Non c'è alcun problema nell'avere diversi metodi con lo stesso tipo di firma ma con contratti diversi. Guardalo in questo modo: se tutto potrebbe essere espresso in modo verificabile tramite la firma, non avremmo bisogno di programmatori, ma solo di scrittori e compilatori di specifiche. Il margine offerto da questa incompletezza è ciò che ci tiene tutti impegnati.

Tuttavia , sono certo che restituire Object non è la soluzione migliore, non importa se una volta o tre volte. Sicuramente le tue strutture obbediscono a alcune regole comuni e modelli di accesso previsti? Che è ciò che dovresti esprimere tramite il sistema di tipi.

    
risposta data 27.01.2016 - 14:11
fonte
1

Se usi o meno parametri generici come suggerisce @DavidArno, la tua interfaccia dovrebbe probabilmente essere scritta in termini di altre interazioni, non in termini di classi. È perfettamente ragionevole che un'astrazione di concetti richieda più interfacce. Ma un'interfaccia che consuma e restituisce le classi probabilmente non è completamente astratta. Quindi, continua finché non raggiungi quell'insieme di concetti astratti, quell'insieme di interfacce coordinate che realizzano una buona astrazione.

    
risposta data 27.01.2016 - 17:30
fonte

Leggi altre domande sui tag