C++ API中的渐进式披露

Bob*_*ane 5 c++ api design-patterns

在我阅读Ken Arnold 撰写的文章程序员是人之后,我一直在尝试在最小的C++ API中实现渐进式公开的概念,以了解如何在更大规模上完成它.

渐进式公开是指将API"拆分"为仅在请求时将向API的用户公开的类别的想法.例如,API可以分为两类:基本类别(默认情况下可供用户访问),通常需要和易于使用的方法,以及专家级服务的扩展类别.

我在Web上只找到了一个这样一个实现的例子:db4o库(用Java 编写),但我真的不了解他们的策略.例如,如果我们看一下ObjectServer,它就被声明为一个接口,就像它的扩展类ExtObjectServer一样.然后定义继承自这两个接口的实现ObjectServerImpl类,并在那里实现来自两个接口的所有方法.

这应该允许代码如下:

public void test() throws IOException {
    final String user = "hohohi";
    final String password = "hohoho";
    ObjectServer server = clientServerFixture().server();
    server.grantAccess(user, password);

    ObjectContainer con = openClient(user, password);
    Assert.isNotNull(con);
    con.close();

    server.ext().revokeAccess(user); // How does this limit the scope to 
                                     // expert level methods only since it
                                     // inherits from ObjectServer?

    // ...
});
Run Code Online (Sandbox Code Playgroud)

我对Java的了解并不是那么好,但似乎我误解了这项工作是如何处于更高层次的.

谢谢你的帮助!

Rei*_*ica 2

Java 和 C++ 都是静态类型的,因此您可以对对象执行的操作不太取决于其实际的动态类型,而是取决于您访问它的类型。

在您显示的示例中,您会注意到该变量的server类型为ObjectServer。这意味着当通过 时server,您只能访问ObjectServer方法。即使该对象碰巧是具有其他方法的类型(您的情况及其ObjectServerImpl类型就是这种情况),您也无法直接访问除方法之外的方法ObjectServer

要访问其他方法,需要通过不同类型来获取对象。这可以通过强制转换或使用显式访问器(例如您的ext(). a.ext()返回a,但作为不同的类型 ( ExtObjectServer),使您可以访问 的不同方法a

您的问题还询问当extends时如何server.ext()限制专家方法。答案是:不是,但这是正确的。不应该这样限制。目标不仅仅是提供专家功能。如果是这种情况,那么需要使用普通函数和专家函数的客户端代码将需要对该对象进行两个引用,只是类型不同。这样做没有任何好处。ExtObjectServerObjectServer

渐进式披露的目标是隐藏专家的内容,直到明确要求为止。一旦你要求它,你已经看到了基本的东西,那么为什么要向你隐藏它呢?