Должно ли создание объекта неявно или явно создавать файл?

9

Я создаю объект, единственной целью которого является чтение в файле одного формата и создание другого в другом формате.

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

PDStat
источник

Ответы:

12

Если вы работаете на языке, который его поддерживает, я бы предоставил метод Save, который принимает Stream. Таким образом, пользователь может сохранять данные там, где он или она хочет.

Запись занимает 20 секунд дольше, чем сохранение только в файл, но программисту легко это понять, и на вызывающем сайте очень ясно, что на самом деле происходит.

То, как вы это описали (объект, который читает входные данные и выводит их в другой файл), кажется странным. Какова цель построения объекта, который делает все во время строительства?

Вы бы назвали это так?

var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;

Для любой разумной реализации SaveFileWeirdClass я бы не ожидал никаких побочных эффектов от его создания. Чтение файла - отлично. Создание файла? Нет.

Мне кажется, так понятнее:

var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;

using(Stream stream = new FileStream(filePath))
    stuff.Save(stream);
Максимум
источник
1
Это хорошо. Другой, похожий вариант - просто реализовать объект, который реализует любую потоковую базу, имеющуюся в приложении, и обращаться с ней так же, как с любым другим потоком.
Стивен Эверс
3

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

Лично я бы не сделал ни того, ни другого и выбрал бы, чтобы вызывающая сторона передавала предварительно открытые файловые дескрипторы конструктору. Создание файла внутри класса исключает возможность для вызывающих абонентов выполнять такие действия, как установка разрешений или, при записи на устройство, инициализация для конкретного устройства. Если вы хотите иметь версию своего FooConverterкласса, которая работает с файлами и выполняет работу создания, оберните ее в FooFileConverter.

Blrfl
источник
2

Явное.

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

Сардатрион - против злоупотребления SE
источник
1

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

См. Https://stackoverflow.com/questions/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exception для обсуждения этого вопроса.

Bananeweizen
источник