2009-06-29 20 views
1

J'ai créé un exemple pour présenter ma question.Transférer des fichiers en tant que paramètres

public class Algorithm 
{ 
    // This is the best, but circumstances prevent me from doing this. 
    /*public static void computeSomething(Data data) 
    { 
     // Compute some stuff 
    }*/ 

    public static void computeSomething(DataFileReader reader) throws IOException 
    { 
     // Compute some stuff. 
    } 

    public static void computeSomething(File file) throws IOException, DataFormatException 
    { 
     DataFileReader = DataFileReaderFactory.newDataFileReader(file); 

     // Compute some stuff. 
    } 
} 

public class DataFileReaderFactory 
{ 
    private enum FileExtension { XML, UNSUPPORTED_EXTENSION } 

    private static final String XMLExtension = ".xml"; 

    public static DataFileReader newDataFileReader(File file) throws DataFormatException 
    { 
     switch(computeFileExtension(file)) 
     { 
      case XML : return new XMLFileReader(file); 

      default : throw new DataFormatException(); 
     } 
    } 

    private static FileExtension computeFileExtension(File file) 
    { 
     if(file.getName().endsWith(XMLExtension)) 
      return FileExtension.XML; 
     else 
      return FileExtension.UNSUPPORTED_EXTENSION; 
    } 
} 

Alors, je voudrais savoir si je dois définir mon interface pour prendre Fichiers, ou mes propres lecteurs de fichiers, qui vous garantissent que les données sont dans un format valide. Évidemment, je voudrais pouvoir prendre les données elles-mêmes en tant qu'objet Data, mais je suis limité à cet égard. La raison a à voir avec les données étant très grandes et moi devoir sérialiser pour plusieurs objets. Dans ce cas, il est plus pratique d'envoyer un chemin vers les données plutôt que les données elles-mêmes.

En tout cas, en ce qui concerne la question, je penche vers la méthode qui prend une instance de fichier Java, comme il semble plus général, mais je veux entendre votre avis. Merci!

Répondre

4

Utilisez quelque chose qui vous permet de créer des programmes de test en mémoire. Par exemple. En utilisant InputStream au lieu de File, vous pouvez écrire une implémentation InputStream simple pour un test au lieu de devoir créer un fichier sur le système de fichiers, y placer des éléments et le supprimer lorsque vous avez terminé.

Si vous disposez d'une interface pour obtenir des objets de données qui, à mon avis être le meilleur.

+0

Malheureusement, les flux ne sont pas sérialisables, ce qui est une exigence nécessaire pour l'algorithme. Pour le test et l'exécution locale, je vais probablement faire une version de l'algorithme comme celle que j'ai commentée dans l'exemple ci-dessus, qui permet de transmettre les données directement. –

+0

VOTRE implémentation pourrait être sérialisable ... –

0

Je suis d'accord avec la réponse ci-dessus que vous devriez vraiment utiliser un objet de données/interface. Lorsque vous effectuez vos tests, vous pouvez créer des simulacres de vos objets de données pour faciliter les tests. En outre, si vous lisez des données provenant de différentes sources (bases de données, fichiers, mémoire, etc.), il n'est pas toujours facile d'obtenir le même format de flux (mais vous pouvez avoir des adaptateurs pour chaque type de source qui le convertit en format de données correct). J'ai remarqué que vos méthodes sont également statiques. Vous pourriez envisager d'avoir des méthodes d'instance et de créer une instance de l'algorithme. Les méthodes d'instance vous permettront de stocker l'état si nécessaire.

0

La grande question que je vois ici est-ce que votre algorithme besoin pour fonctionner de l'ensemble des données à la fois, ou ne fonctionne sur les il ensemble de données au format diffusé en continu?

Si vous avez besoin de cet ensemble de données pour faire fonctionner votre algorithme (c'est-à-dire naviguer aléatoirement entre les éléments de données), alors devrait conserver cette première méthode que vous avez commentée. Dans vos autres méthodes, prenez le flux et lisez-le dans l'ensemble de données complet, puis passez ce jeu de données complet à votre méthode d'algorithme. Tout simplement parce que vous avez besoin d'une interface particulière ne signifie pas que vous devez laisser tomber toute l'implémentation dans ce seul emplacement.

Si d'autre part, c'est un algorithme conçu pour fonctionner sur un flux de données (par exemple un algorithme de routage), puis garder votre ordure dans cette méthode et faire fonctionner sur le flux que vous êtes censé ...

0

Compte tenu de vos contraintes, j'aurais à la fois la méthode qui utilise un fichier et une méthode qui utilise un DataFileReader et que le premier appelle le dernier. Ceci est particulièrement vrai si vous pouvez étendre DataFileReader pour créer un lecteur en mémoire pour le test.

+0

A aucun moment dans le corps de la méthode ci-dessus, je ne lis réellement les données. En réalité, je crée un tas de tâches qui sont sérialisées et transmises sur un réseau.C'est ici que j'ai lu dans les données. Malheureusement, il n'est pas possible de sérialiser une copie des données pour chaque tâche créée. –

Questions connexes