我正在开发一个包含一堆互锁组件(服务器、客户端、库等)的产品,其中一个组件是一个很小的库,用户可以将它链接到自己的客户端代码(有点像Flickr API或Google Maps API)。一旦它们包含了这个库,所有的互锁位就会神奇地将它们自己挂钩在一起。因此,API简单性是一个主要的、重要的目标。
我向用户公开的API总共有两个类和七个公共方法。太简单了,挤柠檬汁。
但这种简单性是一种精心制作的错觉。我正在分发的库实际上依赖于另一个库,它有自己的136个类(以及超过1000个公共方法)。在构建过程中,为了便于API使用者集成和部署,我将这两个库链接到一个可交付件中。
我现在面临的问题是,我不希望最终用户(集成我的软件以增强自己的功能的应用程序开发人员)被所有这些额外的麻烦所困扰,淹没在不必要的复杂性洪流中。
从外部看,该库应该看起来恰好包含两个公共类,以及七个公共方法。
在你自己的项目中,你是如何处理这种事情的?我对语言不可知的解决方案以及针对不同语言的各种技术、编译器和构建工具感兴趣。
在我的特定情况下,我使用SWC库文件为flash平台(AIR/Flex/Actionscript)进行开发。构建方法类似于Java平台,在Java平台中,所有类都捆绑到具有相同可见性的压缩代码模块中(从概念上讲,Actionscript SWC文件几乎与Java JAR文件完全相同)。
.NET没有针对类和方法的“内部”修饰符吗?这正是我正在寻找的东西,如果有人知道如何在SWC边界之间隐藏类的可见性的技巧,我很想听听。
发布于 2009-08-03 12:16:43
在AS中隐藏东西是相当困难的。有一个内部访问说明符,还有一些名称空间。Adobe在Packages and namespaces上提供了一些可能对您有用的帮助。
重要的是要注意,名称空间并不限制访问-它们实际上是用来将符号放入不同的...很好的命名空间。这可以用来在同一swf中访问同一个库的两个版本。我的猜测是,在将定义插入符号表之前,它只是在幕后进行一些名称篡改。如果用户愿意,他们可以只导入名称空间并访问隐藏在其后面的任何内容。我在分解Adobe组件时就做到了这一点。也就是说,如果用户没有原始源,并且无法确定名称空间标识符,那么您就可以通过模糊性获得一点安全性。
包访问说明符(例如,私有和内部)更接近你想要的。但是,如果您可以访问包边界之外的类,那么用户也可以。我见过的一些黑客甚至可以检查swfc,并生成一个嵌入式类列表,可以使用getClassByDefinition来实例化这些类。
因此,您可以在文档中隐藏类的存在,尽可能使用内部和私有访问说明符,然后使用名称空间来破坏类名。但您不能阻止有决心的人查找和使用这些类。
发布于 2009-08-02 10:21:17
我认为您可以通过使用名称空间来实现这一点:http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000040.html
请注意,actionscript中的命名空间与C#中的命名空间不同,它更像是xml中的命名空间。
发布于 2009-08-03 15:30:38
顺便说一句,我使用的另一个技巧(因为我不知道“内部”修饰符或名称空间)是通过在当前包之外声明类来隐藏类,如下所示:
package com.example {
public class A {
// ...
}
}
class B {
// ...
}
class C {
// ...
}我甚至写了一个小工具,它将分析项目中所有的"import“指令,并将所有外部依赖项移动到这些隐藏的私有类中。
https://stackoverflow.com/questions/1218225
复制相似问题