Non sto dicendo che dovrebbe usare un'interfaccia è il tuo caso particolare, ma proverò a coprire alcuni dei punti che potresti voler prendere in considerazione.
Quindi, un paio di domande da porsi per cominciare:
- Esistono operazioni comuni tra queste implementazioni
FileHandler
?
- Sto ottenendo lo stesso tipo di dati dalle diverse fonti (ad es. dove ottieni i dati da una preoccupazione separata per che sono i dati).
Inizialmente può sembrare che la prima domanda debba essere risolta con "No", specialmente quando stai pensando a metodi come getExcelData(String filePath, String workSheet, String row, String column)
.
Tuttavia, se i dati sono simili, potresti iniziare a sperimentare modi diversi di rappresentare un metodo getData
che è comune tra le implementazioni, quindi forse qualcosa del tipo:
L'interfaccia
public interface FileHandler {
public byte[] getData();
}
L'implementazione di Excel
public class ExcelHandler implements FileHandler {
private String filePath, workSheet, row, column;
public ExcelHandler(String filePath, String workSheet, String row,
String column) {
// Set the local vars
..
}
// Pseudo code with no exception handling - yuck!
@Override
public byte[] getData() {
File excelSheet = ApacheCommonsFileLoader.loadFile(filePath);
return ExcelPOIAPI.readCell(workSheet, row, column);
}
}
L'implementazione di Word
public class WordHandler implements FileHandler {
private String filePath;
public WordHandler(String filePath) {
this.filePath = filePath;
}
// Pseudo code with no exception handling - yuck!
@Override
public byte[] getData() {
return WordPOIAPI.readDoc();
}
}
I test
// Very rough crappy test, note the explicit creation of the ExcelHandler
@Test
public void testGetDataForExcel() {
FileHandler fileHandler = new ExcelHandler("foobar.xls", "foobar", "A" "23");
assertNotNull(fileHandler.getData());
}
// Very rough crappy test, note the explicit creation of the WordHandler
@Test
public void testGetDataForWord() {
FileHandler fileHandler = new WordHandler("foobar.doc");
assertNotNull(fileHandler.getData());
}
Il client
// Very rough crappy client, the fileHandler being passed in
// was previously created, see explanation below
public void processData(FileHandler fileHandler) {
byte[] data = fileHandler.getData();
// Do stuff with data
}
La domanda che potresti porsi è quindi "Come / dove creo il tipo specifico di FileHandler che voglio?". Comunemente è possibile codificarlo (come ho fatto nei test), usare una fabbrica o usare Dependency Injection (DI) tramite un framework IoC come Guice, Spring o PicoContainer. DI è di gran moda al momento (si prega di usarlo con leggerezza e saggiamente) in modo che possa essere qualcosa da esplorare (consiglio vivamente Guice per l'apprendimento di questo).
Spero che ti aiuti un po '!