ฉันมาถึงข้อสรุปที่CreateDataFile
ทำสิ่งหนึ่งโดยทำการวัดอย่างรวดเร็วแล้วเก็บข้อมูลและการทำทั้งสองอย่างในวิธีเดียวกันนั้นง่ายกว่าสำหรับคนอื่นที่ใช้รหัสนี้จากนั้นจึงต้องทำการวัดและเขียนไฟล์ เป็นการเรียกเมธอดแยกต่างหาก
ฉันคิดว่านี่เป็นปัญหาของคุณจริง ๆ แล้ว วิธีการไม่ได้ทำสิ่งหนึ่ง มันทำงานสองการทำงานที่แตกต่างกันซึ่งเกี่ยวข้องกับ I / O กับอุปกรณ์ต่าง ๆซึ่งทั้งสองอย่างนี้มันถูกโหลดไปที่วัตถุอื่น:
- ดึงข้อมูลการวัด
- บันทึกผลลัพธ์นั้นไปยังไฟล์ที่อื่น
นี่เป็นการดำเนินการ I / O ที่แตกต่างกันสองรายการ โดยเฉพาะอย่างยิ่งคนแรกไม่ได้กลายพันธุ์ระบบไฟล์ในทางใดทางหนึ่ง
อันที่จริงแล้วเราควรทราบว่ามีขั้นตอนกลางโดยนัย:
- ดึงข้อมูลการวัด
- จัดลำดับการวัดเป็นรูปแบบที่รู้จัก
- บันทึกการวัดต่อเนื่องเป็นไฟล์
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 ของคุณ ช่วยให้ผู้โทรตัดสินใจได้ว่าพวกเขาต้องการอะไรและเมื่อใดแทนที่จะบังคับให้แนวคิดที่คุณคิดไว้ล่วงหน้าเกี่ยวกับสิ่งที่ I / O ดำเนินการ ผู้โทรควรมีการควบคุมการทำงานที่ถูกต้องไม่ว่าคุณจะคิดว่ามันมีประโยชน์หรือไม่ก็ตาม
เมื่อคุณมีการนำไปใช้งานที่แยกต่างหากสำหรับแต่ละการดำเนินการ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());
ซึ่งสั้นและอาจชัดเจนกว่าวิธีอำนวยความสะดวกของคุณตามที่คิดไว้ในคำถาม