Відповіді:
Якщо ви працюєте мовою, яка її підтримує, я б запропонував метод "Зберегти", який використовує "Потік". Таким чином, користувач може зберігати дані там, де він хоче.
Написати потрібно 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);
Якщо ви намагаєтеся робити це в класі, створіть його під час ініціалізації. Затримка цього кроку робить дві погані речі: По-перше, це додає додатковий, явний крок для абонента, який не створив би об'єкт в першу чергу, якщо б вони не мали намір використовувати його для отримання результату. По-друге, він додає щонайменше два моменти, коли код у класі повинен приймати рішення про те, чи відкритий файл чи обробляти цю умову: один раз, коли ви переходите до запису виводу та один раз під час знищення, коли ви збираєтесь його закрити. Перший означає, що ви повинні робити цю перевірку під час кожного написання, що може бути марно, якщо ви робите багато з них.
Особисто я б не робив жодного і не вирішив зробити так, щоб абонент передав попередньо відкриті ручки файлу конструктору. Створення файлу всередині класу виключає надання абонентам можливостей робити такі дії, як встановлення дозволів або, якщо вони записують на пристрій, робити ініціалізацію для певного пристрою. Якщо ви хочете мати версію свого FooConverter
класу, яка працює над файлами і виконує грунт створення, загорніть її в FooFileConverter
.
Явно.
Ви хочете переконатися, що ви не покладаєтесь на розумні правила побічних ефектів, які можуть порушуватись у майбутніх випусках чи на звичайних архітектурах. Звичайно, у вас повинен бути файл за замовчуванням, який користувач може перезаписати, якщо захоче.
На додаток до інших аргументів для явного методу: Якщо ви виконуєте роботу в конструкторі, ви змушуєте кожного користувача вашого класу робити обробку виключень лише для створення об’єкта. Це може призвести до безлічі кодових кодів.
Дивіться /programming/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exception для обговорення цього питання.