Я прийшов до висновку, що 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());
який настільки ж короткий і, ймовірно, більш зрозумілий, ніж ваш метод зручності, як задумано у питанні.