Я прийшов до висновку, що CreateDataFileробити одне, швидко зробивши вимірювання, а потім зберігати дані, і те, що обидва в тому ж методі, більш інтуїтивно зрозумілий для когось іншого, який використовує цей код, а потім повинен зробити вимірювання і записати у файл як окремий виклик методу.
Я думаю, що це ваша проблема. Метод - це не одна справа. Він виконує дві чіткі операції, які включають введення-виведення для різних пристроїв , обидва з яких не завантажуються на інші об'єкти:
- Отримати вимірювання
- Збережіть результат десь у файлі
Це дві різні операції вводу / виводу. Примітно, що перший жодним чином не мутує файлову систему.
Справді, слід зазначити, що мається на увазі середній крок:
- Отримати вимірювання
- Серіалізувати вимірювання у відомий формат
- Збережіть серіалізований вимір у файл
Ваш API повинен надавати кожне з них окремо у певній формі. Як ви знаєте, що абонент не захоче проводити вимірювання, не зберігаючи його ніде? Звідки ви знаєте, що вони не хочуть отримувати вимірювання з іншого джерела? Звідки ви знаєте, що вони не захочуть зберігати його де-небудь, крім пристрою? Є вагомі підстави для відключення операцій. На голій мінімум, кожна окрема частина повинна бути доступна кожному абоненту. Мене не слід змушувати записувати вимірювання у файл, якщо мій випадок використання не вимагає цього.
Як приклад, ви можете розділити такі операції.
IMeasurer є спосіб отримати вимірювання:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
Ваш тип вимірювання може бути просто простим, як, наприклад, stringабо decimal. Я не наполягаю, що вам потрібен інтерфейс чи клас для цього, але це робить приклад більш загальним.
IFileAccess є деякий спосіб збереження файлів:
interface IFileAccess
{
void SaveFile(string fileContents);
}
Тоді вам потрібен спосіб серіалізації вимірювання. Вбудуйте це в клас або інтерфейс, що представляє вимірювання, або використовуйте корисний метод:
interface IMeasurement
{
// As part of the type
string Serialize();
}
// Utility method. Makes more sense if the measurement is not a custom type.
public static string SerializeMeasurement(IMeasurement m)
{
return ...
}
Незрозуміло, чи ви ще не відокремили цю операцію серіалізації.
Такий поділ покращує ваш API. Це дає змогу абоненту вирішити, що їм потрібно і коли, а не змушувати заздалегідь задумані ідеї щодо того, які введення-виведення виконувати. Абоненти повинні мати контроль за виконанням будь-якої дійсної операції, чи вважаєте ви, що це корисно чи ні.
Коли у вас є окремі реалізації для кожної операції, ваш CreateDataFileметод стає лише скороченням
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
Зокрема, ваш метод додає дуже мало значення, коли ви все це зробите. Вищевказаний рядок коду вашим абонентам не важко використовувати безпосередньо, а ваш метод - максимально для зручності. Це має бути і є чимось необов’язковим . І це правильний спосіб поведінки API.
Після того, як всі відповідні частини будуть розроблені, і ми визнали, що метод є лише зручністю, нам потрібно переформулювати ваше запитання:
Який би найчастіший випадок використання ваших абонентів?
Якщо вся справа в тому, щоб зробити типовий випадок використання вимірювань і запису на одну плату трохи зручніше, то має сенс просто зробити доступним для Boardкласу безпосередньо:
public class Board : IMeasurer, IFileAccess
{
// Interface methods...
/// <summary>
/// Convenience method to measure and immediate record measurement in
/// default location.
/// </summary>
public void ReadAndSaveMeasurement()
{
this.SaveFile(SerializeMeasurement(this.Measure()));
}
}
Якщо це не покращує зручність, я б взагалі не переймався методом.
Цей метод зручності викликає ще одне питання.
Чи повинен IFileAccessінтерфейс знати про тип вимірювання та як його серіалізувати? Якщо так, ви можете додати метод до IFileAccess:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
Тепер абоненти просто роблять це:
fileAccess.SaveFile(measurer.Measure());
який настільки ж короткий і, ймовірно, більш зрозумілий, ніж ваш метод зручності, як задумано у питанні.