我得出的结论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());
与问题中设想的便捷方法一样简短,而且可能更清晰。