Передача файлов в качестве параметров - PullRequest
1 голос
/ 30 июня 2009

Я создал пример, чтобы представить свой вопрос.

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;
    }
}

Итак, я хотел бы знать, должен ли я определить мой интерфейс для приема файлов или мои собственные программы чтения файлов, которые гарантируют, что данные находятся в допустимом формате. Очевидно, я хотел бы иметь возможность воспринимать сами данные как объект Data , но я ограничен в этом отношении. Причина в том, что данные очень большие, и мне приходится сериализовать их для нескольких объектов. В этом случае более практично отправлять путь к данным, а не к самим данным.

В любом случае, что касается вопроса, я склоняюсь к методу, который использует экземпляр файла Java, , который кажется более общим, но я хочу услышать ваш совет. Спасибо!

Ответы [ 4 ]

4 голосов
/ 30 июня 2009

Используйте то, что позволяет создавать тестовые программы в памяти. Например. используя InputStream вместо File, вы можете написать простую реализацию InputStream для теста вместо того, чтобы создавать файл в файловой системе, помещать в него что-то и удалять, когда вы закончите.

Если у вас есть интерфейс для получения объектов данных, который, на мой взгляд, будет лучшим.

0 голосов
/ 30 июня 2009

Учитывая ваши ограничения, у меня будет и метод, который использует File, и метод, который использует DataFileReader, и первый вызов вызовет последний. Это особенно верно, если вы можете расширить DataFileReader для создания считывателя в памяти для теста.

0 голосов
/ 30 июня 2009

Большой вопрос, который я вижу здесь, состоит в том, должен ли ваш алгоритм работать с полным набором данных одновременно или он работает с набором данных в потоковом формате?

Если вам нужен этот набор данных сразучтобы использовать ваш алгоритм (т. е. случайным образом перемещаться назад и вперед среди элементов данных), тогда вы должны оставить тот первый метод, который вы закомментировали.В других ваших методах возьмите поток и прочитайте его в полный набор данных, а затем передайте этот полный набор данных в ваш метод алгоритма.Тот факт, что вам нужен конкретный интерфейс, не означает, что вы должны поместить всю реализацию в это одно местоположение.

Если, с другой стороны, это алгоритм, разработанный для работы с потоком данных (т. Е. Маршрутизациейалгоритм), затем сохраните свой мусор в этом методе и работайте в потоке, как вы должны ...

0 голосов
/ 30 июня 2009

Я согласен с приведенным выше ответом, что вы действительно должны использовать объект / интерфейс данных. Когда вы проводите тестирование, вы можете создавать макеты ваших объектов данных, чтобы упростить тестирование. Кроме того, если вы читаете данные из разных источников - баз данных, файлов, памяти и т. Д., Не всегда может быть легко получить их в одном и том же формате потока (но у вас могут быть адаптеры для каждого типа источника, которые преобразуют его в правильный формат данных).

Я заметил, что ваши методы тоже статичны. Вы можете рассмотреть возможность использования методов экземпляра и создания экземпляра алгоритма. Методы экземпляра позволят вам сохранить состояние при необходимости.

...