Saya sampai pada kesimpulan bahwa CreateDataFile
melakukan satu hal dengan melakukan pengukuran cepat dan kemudian menyimpan data, dan melakukan keduanya dengan metode yang sama lebih intuitif untuk orang lain yang menggunakan kode ini kemudian harus melakukan pengukuran dan menulis ke file sebagai pemanggilan metode terpisah.
Saya pikir ini masalah Anda sebenarnya. Metodenya tidak melakukan satu hal. Ini melakukan dua, operasi berbeda yang melibatkan I / O ke perangkat yang berbeda , yang keduanya memuat ke objek lain:
- Ambil pengukuran
- Simpan hasil itu ke file di suatu tempat
Ini adalah dua operasi I / O yang berbeda. Khususnya, yang pertama tidak mengubah sistem file dengan cara apa pun.
Bahkan, kita harus perhatikan bahwa ada langkah tengah tersirat:
- Ambil pengukuran
- Serialize pengukuran ke dalam format yang dikenal
- Simpan pengukuran serial ke file
API Anda harus menyediakan masing-masing secara terpisah dalam beberapa bentuk. Bagaimana Anda tahu seorang penelepon tidak ingin melakukan pengukuran tanpa menyimpannya di mana pun? Bagaimana Anda tahu mereka tidak ingin mendapatkan pengukuran dari sumber lain? Bagaimana Anda tahu mereka tidak ingin menyimpannya di tempat lain selain perangkat? Ada alasan bagus untuk memisahkan operasi. Pada telanjang minimum, masing-masing bagian individu harus tersedia untuk pemanggil apapun. Saya seharusnya tidak dipaksa untuk menulis pengukuran ke file jika use case saya tidak meminta untuk itu.
Sebagai contoh, Anda dapat memisahkan operasi seperti ini.
IMeasurer
memiliki cara untuk mengambil pengukuran:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
Jenis pengukuran Anda mungkin hanya sesuatu yang sederhana, seperti string
atau decimal
. Saya tidak mendesak Anda membutuhkan antarmuka atau kelas untuk itu, tetapi itu membuat contoh di sini lebih umum.
IFileAccess
memiliki beberapa metode untuk menyimpan file:
interface IFileAccess
{
void SaveFile(string fileContents);
}
Maka Anda perlu cara membuat serial pengukuran. Bangun itu ke dalam kelas atau antarmuka yang mewakili pengukuran, atau miliki metode utilitas:
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 ...
}
Tidak jelas apakah Anda memiliki operasi serialisasi ini belum.
Pemisahan semacam ini meningkatkan API Anda. Ini memungkinkan penelepon memutuskan apa yang mereka butuhkan dan kapan, daripada memaksakan ide-ide Anda sebelumnya tentang apa yang saya / O lakukan. Penelepon harus memiliki kontrol untuk melakukan operasi yang valid , baik menurut Anda berguna atau tidak.
Setelah Anda memiliki implementasi yang terpisah untuk setiap operasi, CreateDataFile
metode Anda menjadi singkatan
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
Khususnya, metode Anda menambahkan nilai yang sangat kecil setelah Anda melakukan semua ini. Baris kode di atas tidak sulit bagi penelepon Anda untuk digunakan secara langsung, dan metode Anda murni untuk kenyamanan maksimal. Itu harus dan merupakan sesuatu yang opsional . Dan itu adalah cara yang benar untuk berperilaku API.
Setelah semua bagian yang relevan difaktorkan dan kami telah mengakui bahwa metode ini hanya kenyamanan, kami perlu mengulangi pertanyaan Anda:
Kasus penggunaan apa yang paling umum untuk penelepon Anda?
Jika seluruh poinnya adalah untuk membuat case use khas dari mengukur dan menulis ke papan yang sama sedikit lebih nyaman, maka masuk akal untuk membuatnya tersedia di Board
kelas secara langsung:
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()));
}
}
Jika ini tidak meningkatkan kenyamanan, maka saya tidak akan repot dengan metode ini sama sekali.
Ini menjadi metode kenyamanan memunculkan satu pertanyaan lain.
Haruskah IFileAccess
antarmuka tahu tentang jenis pengukuran dan bagaimana cara membuat serial? Jika demikian, Anda dapat menambahkan metode ke IFileAccess
:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
Sekarang penelepon lakukan saja ini:
fileAccess.SaveFile(measurer.Measure());
yang sama pendek dan mungkin lebih jelas daripada metode kenyamanan Anda sebagaimana dipahami dalam pertanyaan.