Devo escogitare un'interfaccia FileHandler per gestire file diversi?

2

Il mio background è stato in gran parte test manuale e ho iniziato a imparare core java per poter lavorare con Selenium. Sto cercando di scrivere un paio di metodi riutilizzabili, come leggere / scrivere dati da csv, excel, parola ecc.

Ho creato una classe chiamata - FileHandler e ho creato un metodo per questo. Quindi questa classe si occupa di tutti i tipi di file: csv, excel ecc.

Ma seguendo i concetti di OOP (e se li ho capiti bene) dovrei creare un'interfaccia e implementazioni per questa interfaccia, e invece di trattare direttamente con l'implementazione specifica dovrei lavorare con riferimento all'interfaccia di tipo. Ad esempio

public interface FileHandler {
}

public class ExcelHandler implements FileHandler {
}

public class WordHandler implements FileHandler  {
}

La mia domanda - questo approccio giusto nel mio scenario dovrei semplicemente creare una classe per gestire tutte le operazioni di input / output dei file? Anche se devo ancora capire cosa va nell'interfaccia come metodi come -

getExcelData(String filePath, String workSheet, String row, String column)

sarebbe specifico solo per riferimento di tipo - ExcelHandler e non ha molto senso tenerli in interfaccia.

    
posta Tarun 17.06.2011 - 10:46
fonte

1 risposta

1

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:

  1. Esistono operazioni comuni tra queste implementazioni FileHandler ?
  2. 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 '!

    
risposta data 17.06.2011 - 13:17
fonte

Leggi altre domande sui tag