Impostazione di un parametro su null con metodo di interfaccia a due parametri

1

Ho un paio di classi che stanno facendo la stessa cosa: riempire una serie di oggetti usando le origini dati passate come parametro. Poiché ho bisogno di due distinti, la mia interfaccia contiene il seguente contratto:

// Arbitrary names, didn't find a good name for the application field yet
public interface DataMapper<O>    {
    /*
     * Those two sources cannot be fused together, they come from
     * different places from another API
     */
    public O mapData(DataSource first, DataSource second);
}

Tuttavia, ho un problema. Una classe legacy del mio programma utilizza solo la prima di due fonti e non ha bisogno della seconda. Poiché è l'unico che ha bisogno solo di uno su due, ho preso in considerazione l'utilizzo del contratto in questo modo:

Output output = LegacyMapper.mapData(firstDataSource, null);

Ma questo mi sembra sporco: chiunque altro oltre a me attraverso il codice dovrebbe prima chiedermi Perché la seconda sorgente di dati null , mentre l'interfaccia specifica che hai bisogno di entrambi? .

Quindi quali sono le mie opzioni per creare un design adeguato che non si senta troppo zoppo?

1) Creare un secondo contratto mapData(DataSource onlyData); , quindi impostare quello non utilizzato come return null considerando l'implementazione?

2) Creazione di un'altra interfaccia specifica per il legacy mapper?

3) Lasciando il codice così com'è e commentandolo?

Qualsiasi aiuto sarebbe apprezzato.

Grazie!

    
posta Yassine Badache 07.02.2018 - 09:58
fonte

1 risposta

1

Crea un'interfaccia DataConverter<O> che ha il metodo convert prendendo come parametro a DataSource e restituisce O .

public interface DataConverter<O>    {
    /*
     * Responsible for converting DataSource into useable type O.
     */
    public O convert(DataSource datasource);
}

Non vi è alcun motivo per forzare DataMapper nel ruolo di un convertitore, se tutto ciò che deve fare è convertire. Non farei nemmeno che DataMapper<O> derivi da DataConverter<O> , poiché mi sembra che DataMapper<O> riguardi l'unione di DataSources . Tuttavia, se hai motivo di credere che non ci sarebbe alcuna perdita di prestazioni per convertire in O e quindi unire due istanze di O , potresti farlo invece.

public interface DataMapper<O>    {
    public O mapData(O first, O second);
}
    
risposta data 07.02.2018 - 10:44
fonte

Leggi altre domande sui tag