在设计类时,是否应该在行为习惯上优于常规编程实践?举一个具体的例子:
一个常见的约定是:如果一个类拥有一个对象(例如,它创建了一个对象),则它负责在对象完成后对其进行清理。.NET中的一个具体示例是,如果您的类拥有一个IDisposable
对象,则应在其生命周期结束时对其进行处置。如果您不拥有它,请不要触摸它。
现在,如果我们看一下StreamWriter
.NET 中的类,则可以在文档中找到在关闭/处置它时关闭基础流的信息。如果在StreamWriter
编写器创建基础文件流并因此需要关闭它时通过传入文件名实例化的情况下这是必需的。但是,也可以传入作者也关闭的外部流。
这使我烦恼了很多次(是的,我知道您可以制作一个非关闭的包装器,但这不是重点),但是显然微软已经做出决定,无论来自何处,始终关闭流是更加一致的。
当我在一个类中遇到这种模式时,我通常会创建一个ownsFooBar
标志,如果FooBar
通过构造函数注入该标志,则将其设置为false;否则,将其设置为true。这样,当调用者显式传递实例时,将其清除的责任传递给了调用者。
现在我想知道一致性是否应该优于最佳实践(或者我的最佳实践不是那么好)吗?有反对意见吗?
编辑以澄清
“一致性”的意思是:类的一致行为总是获取所有权(并关闭流)与“最佳实践”相比,仅当创建对象或显式转移所有权时才获取对象的所有权。
例如,它令人眼花ying乱:
假设您有两个给定的类(来自某个第三方库),它们接受一个流以对其进行处理,例如创建和处理一些数据:
public class DataProcessor
{
public Result ProcessData(Stream input)
{
using (var reader = new StreamReader(input))
{
...
}
}
}
public class DataSource
{
public void GetData(Stream output)
{
using (var writer = new StreamWriter(output))
{
....
}
}
}
现在,我想像这样使用它:
Result ProcessSomething(DataSource source)
{
var processor = new DataProcessor();
...
var ms = new MemoryStream();
source.GetData(ms);
return processor.ProcessData(ms);
}
这将失败,但Cannot access a closed stream
数据处理器中会出现异常。这有点构造,但应该说明这一点。有多种方法可以修复它,但是我仍然觉得自己可以解决一些本不应该做的事情。