通过构建简洁的库来隐藏复杂性

时间:2009-08-02 05:27:58

标签: actionscript-3 api-design information-hiding

我正在开发一个带有许多互锁件(服务器,客户端,库等)的产品,其中一个是一个小型库,用户将链接到他们自己的客户端代码(有点类似于Flickr API或Google Maps API)。一旦他们包含了这个库,所有的互锁位都神奇地将它们连接在一起。因此API简单性是一个重要的重要目标。

我向用户公开的API总共有两个类和七个公共方法。容易腻,柠檬挤压。

但简单是一种精心设计的错觉。我正在分发的库实际上依赖于另一个库,它自己有136个类(以及超过一千个公共方法)。在构建过程中,我将两个库链接在一起,形成一个可交付的,便于API使用者进行集成和部署。

我现在面临的问题是,我不希望最终用户(一个应用程序开发人员集成我的软件来增强他们自己的功能),以免遭受所有额外的困难,淹没在不必要的复杂性中

从外部看,图书馆看起来应该只包含两个公共类,正好有七种公共方法。

你如何在自己的项目中处理这类事情?我对语言无关的解决方案以及不同语言,编译器和构建工具的各种技术感兴趣。

在我的具体情况下,我正在使用SWC库文件开发Flash平台(AIR / Flex / Actionscript)。构建方法与Java平台类似,其中所有类都捆绑在一个具有相同可见性的压缩代码模块中(从概念上讲,ActionScript SWC文件与Java JAR文件几乎完全相同)。

.NET没有类和方法的“内部”修饰符吗?这正是我正在寻找的那种东西,如果有人知道隐藏SWC边界之间类别的可见性的棘手技术,我很乐意听到它。

3 个答案:

答案 0 :(得分:1)

我认为你可以通过使用命名空间来解决这个问题: http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000040.html

请注意,动作脚本中的名称空间与C#中的名称空间不同,它更像是xml中的名称空间。

答案 1 :(得分:1)

在AS中隐藏内容非常困难。有一个内部访问说明符,还有名称空间。 Adobe在Packages and namespaces上提供了一些可能对您有用的帮助。

重要的是要注意命名空间不限制访问 - 它们实际上用于将符号放入不同的...... well命名空间。这可以用于在同一个swf中访问同一个库的2个版本。我的猜测是,在将定义插入符号表之前,它只是在幕后进行了一些名称修改。如果用户想要,他们只需导入命名空间并访问隐藏在其后面的任何内容。在破解Adobe组件时,我已经做到了这一点。也就是说,如果用户没有原始源,并且无法确定命名空间标识符,那么通过默默无闻的方式可以获得一点安全性。

包访问说明符(例如私有和内部)更接近您想要的。但是,如果可以访问包边界之外的类,那么用户也可以。甚至有一些我见过的黑客可以检查swfc并吐出一个嵌入类列表,可以使用getClassByDefinition来实例化。

因此,您可以隐藏文档中存在的类,尽可能使用内部和私有访问说明符,然后使用命名空间来破坏类名。但你不能阻止一个坚定的人找到并使用这些课程。

答案 2 :(得分:0)

顺便说一下,我使用的其他一些技巧(因为我不知道“内部”修饰符或命名空间)是通过在当前包之外声明它们来隐藏类,如下所示:

package com.example {

   public class A {
      // ...
   }

}

class B {
   // ...
}

class C {
   // ...
}

我甚至想编写一个小工具来分析项目中的所有“import”指令,并将所有外部依赖项移动到这些隐藏的私有类中。