2

我正在编写一个框架(在 Java 中,但问题是通用的),我将在其中提供一组接口供客户端实现。框架中的功能将依赖于如何构造实现类,也就是说,它们依赖于这些实现来提供其他接口实例。

例如我可能有:

Interface IContribution {
   public IMyStuff getMyStuff();
   public IHelper getHelper();
}

Interface IMyStuff {
     public void doSomeMethod(IHelper helper);
}

如何确保 IMyStuff 和 IHelper 的这些实例可用?

一种方法是在接口中创建“getter”方法,并在我的框架中煞费苦心地检查返回的空对象。

另一种选择是创建实现工厂的抽象类,该工厂调用(使用策略模式)要实现的接口方法。但这违背了我首先拥有界面的事实。然后客户端应该使用抽象类。但是他们可以通过使用接口而不是抽象类来规避这一点。因此我不应该提供接口而只提供抽象类......

那么,您对此有何想法,对此采取务实的方法是什么?

4

3 回答 3

2

如何确保 IMyStuff 和 IHelper 的这些实例可用?

如果客户自己负责实现接口和类,我会说确保这些实例可用是他们的责任——我不会担心将其放入我自己的代码中。

于 2009-06-25T19:56:27.973 回答
1

为了构建一个好的框架,您需要同时围绕它构建一个应用程序。这样,您将了解并理解您的客户在被强加给他们之前所承受的痛苦。

换句话说,从以下问题开始:我的客户将如何使用此应用程序?他们需要如何使用它?

您会立即意识到,从他们的角度来看,最简单的方法将是最好的。

于 2009-06-25T20:10:55.310 回答
0

您不能仅使用接口来确保它,那里没有任何行为。

我同意Framework中防御性编程的哲学,帮助开发者避免犯错。

您可以提供工厂对象:

public class MyPoliceman {
    public IContribution makeContributor( IMyStuff stuffer, IHelper helper)
                    throws BadAssociatesException {

     // check validity of stuffer and helper here, throw exceptions if null
    }
}

然后至少我们可以检查空值等。

经过一番思考,通常可以为开发人员提供帮助。在某些情况下,您能做的最好的事情就是捕获错误并谨慎地报告它们。例如在这里,可以将一个完美的 IHelper 传递给您的工厂,但稍后对该类的操作可能会使其无法使用。(例如,图像它是一个文件,后来有副作用关闭了该文件。)然后您所能做的就是捕获产生的错误条件,在某处记录错误并(可能)抛出异常。然后至少开发人员知道要修复什么。

于 2009-07-05T16:06:08.177 回答