Ben CreateDataFile
hızlı bir ölçüm yaparak ve daha sonra veri depolayarak bir şey yapıyor sonucuna geldim , ve her ikisini de aynı yöntemle yapmak daha sonra bir ölçüm yapmak ve bir dosyaya yazmak zorunda bu kodu kullanarak başkası için daha sezgisel ayrı yöntem çağrıları olarak.
Bence bu senin sorunun. Yöntem olduğu değil bir şey yapıyor. Her ikisi de diğer nesnelere yüklenen farklı cihazlara G / Ç içeren iki ayrı işlem gerçekleştirir :
- Bir ölçüm getir
- Bu sonucu bir yere bir dosyaya kaydedin
Bunlar iki farklı G / Ç işlemi. Özellikle, ilki dosya sistemini hiçbir şekilde değiştirmez.
Aslında, zımni bir orta adım olduğunu not etmeliyiz:
- Bir ölçüm getir
- Ölçümü bilinen bir biçime seri hale getirme
- Serileştirilmiş ölçümü bir dosyaya kaydedin
API'nız bunların her birini ayrı bir biçimde sağlamalıdır. Arayanın herhangi bir yerde saklamadan ölçüm yapmak istemeyeceğini nasıl anlarsınız? Başka bir kaynaktan ölçüm almak istemediklerini nereden biliyorsunuz? Cihazdan başka bir yerde saklamak istemediklerini nereden biliyorsunuz? Operasyonları ayırmak için iyi bir neden var. Bir anda çıplak minimum her oyuncağı olmalı kullanılabilir herhangi arayana. Kullanım durumum bunu çağırmazsa, bir dosyaya ölçüm yazmak zorunda kalmamalıyım.
Örnek olarak, bunun gibi işlemleri ayırabilirsiniz.
IMeasurer
ölçümü getirmenin bir yolu vardır:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
Ölçüm türünüz sadece string
veya gibi basit bir şey olabilir decimal
. Bunun için bir arayüze veya sınıfa ihtiyacınız olduğu konusunda ısrar etmiyorum, ancak buradaki örneği daha genel hale getiriyor.
IFileAccess
dosyaları kaydetmek için bazı yöntemler vardır:
interface IFileAccess
{
void SaveFile(string fileContents);
}
Sonra bir ölçümü seri hale getirmenin bir yoluna ihtiyacınız var. Bunu bir ölçümü temsil eden sınıfa veya arayüze yerleştirin veya bir yardımcı yöntem kullanın:
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 ...
}
Bu serileştirme işleminin henüz ayrılmış olup olmadığı açık değildir.
Bu tür bir ayırma API'nizi geliştirir. Arayanın , G / Ç işlemlerini gerçekleştirmek için önceden tasarlanmış fikirlerinizi zorlamak yerine neye ve ne zaman karar vermesini sağlar . Arayanlar , yararlı olup olmadığını düşünün, geçerli herhangi bir işlemi gerçekleştirmek için kontrole sahip olmalıdır .
Her işlem için ayrı uygulamalarınız olduğunda, CreateDataFile
yönteminiz yalnızca
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
Özellikle, tüm bunları yaptıktan sonra yönteminiz çok az değer katıyor. Yukarıdaki kod satırı, arayanlarınızın doğrudan kullanması zor değildir ve yönteminiz en fazla kolaylık sağlamak içindir. O olmalı ve isteğe bağlı bir şeydir . Bu, API'nin davranışı için doğru yoldur.
İlgili tüm bölümler hesaba katıldığında ve yöntemin sadece bir kolaylık olduğunu kabul ettikten sonra, sorunuzu yeniden yazmamız gerekir:
Arayanlarınız için en yaygın kullanım durumu hangisidir?
Tüm mesele, aynı tahtadan ölçüm yapmak ve aynı tahtaya yazmak için tipik kullanım durumunu biraz daha uygun hale getirmekse, Board
doğrudan sınıfta kullanılabilir hale getirmek mükemmel bir mantıklıdır :
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()));
}
}
Bu kolaylık sağlamazsa, yöntemle hiç uğraşmazdım.
Bu bir kolaylık yöntemi olmak başka bir soruyu da beraberinde getiriyor.
Meli IFileAccess
arayüz ölçüm türü ve nasıl serialize biliyor mu? Öyleyse, aşağıdakilere bir yöntem ekleyebilirsiniz IFileAccess
:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
Şimdi arayanlar bunu yapar:
fileAccess.SaveFile(measurer.Measure());
bu da soruda tasarlandığı kadar kolaylık yönteminizden daha kısa ve muhtemelen daha açıktır.