API设计的困境在于清理责任

本文关键字:于清理 责任 困境 API | 更新日期: 2023-09-27 18:12:53

假设您有一个库,该库提供了一个接受需要清理的对象的方法。例如,通过调用它的Close或Dispose方法。谁应该对此负责?是呼叫者还是被呼叫者?当然,你可以选择任何一种方式,只要你正确地记录。但关于这一点有共识或最佳实践吗?

下面是一个例子:

// public method of library
public class MyObject
{
   public void Read(System.IO.Stream stream)
   {
      ...
   }
   ...
}

如果调用者负责,客户端代码应该是这样的:

using (FileStream file = new FileStream(...))
{
   MyObject myObject = new MyObject();
   myObject.Read(file);
}

API设计的困境在于清理责任

我会说正常的"所有权"是为任何创建资源的人开始的-所以你的方法的调用者。除此之外,谁说调用者希望在读取后处理流呢?也许他们想倒带并把它传递给其他东西。

我通常会对处理任何我没有明确创建的东西感到紧张。当然也有例外——Bitmap(Stream)构造函数有效地获得了流的所有权,并假设你将处理位图,而位图将反过来处理流……

一般来说,调用者应该清理,因为你不知道调用者是否真的完成了他的对象。

然而,如果你的方法"消耗"了这个对象,使得调用者不能再使用它(例如,如果它读取了一个不可寻的流),那么你可能想要自己处理它。