我正计划编写一个库,该库应该可以在各种平台上供大量用户使用.我需要考虑什么来设计它呢?为了使这个问题更具体,最后有四个"子问题".
语言的 Select
考虑到所有已知的要求和细节,我得出结论,用C或C++编写的库是可行的.我认为我的库的主要用途将是在用C, C++ and Java SE编写的程序中,但我也可以从Java ME, PHP, .NET, Objective C, Python, Ruby, bash scrips, etc...开始想出使用它的理由也许我不能针对所有的程序,但如果可能的话,我会这样做的.
要求
在这里描述我的图书馆的全部用途是非常重要的,但有一些方面可能对这个问题很重要:
- 库本身一开始会很小,但肯定会变得非常复杂,所以不能 Select 并行维护多个版本.
- 不过,大部分复杂性将隐藏在图书馆内
- 该库将构建一个在内部大量使用的对象图.库的一些客户端只对特定对象的特定属性感兴趣,而其他客户端必须以某种方式遍历对象图
- 客户端可以更改对象,并且必须通知库
- 如果库已经拥有该对象的句柄,则该库可能会更改对象,并且必须将此通知给客户端
- 该库必须是多线程的,因为它将保持与其他几个主机的网络连接
- 虽然对库的一些请求可能会同步处理,但其中许多请求会花费太长时间,必须在后台处理,并在成功(或失败)时通知客户
Of course, answers are welcome no matter if they address my specific requirements, or if they answer the question in a general way that matters to a wider audience!个
我的假设,到目前为止
以下是我在过go 几个月里收集的一些假设和结论:
- 在内部,我可以使用我想要的任何东西,例如C++与运算符重载、多重继承、模板元编程…只要有一个可移植的编译器来处理它(想想gcc/g++)
- 但我的接口必须是干净的C接口,不涉及名称损坏
- 此外,我认为我的接口应该只由函数组成,将基本/原始数据类型(可能还有指针)作为参数和返回值传递
- 如果我使用指针,我认为我应该只使用它们将它们传递回库,而不是直接对引用的内存进行操作
- 为了在C++应用程序中使用,我可能还会提供面向对象的接口(这也容易出现名称损坏,因此应用程序必须使用相同的编译器,或者以源代码形式包含库)
- 在C#中的使用也是这样吗?
- 对于在Java SE/Java EE中的使用,应用Java本机接口(JNI).我对此有一些基本知识,但我一定要再判断一遍.
- 并非所有客户端语言都能很好地处理多线程,因此应该有一个线程与客户端对话
- 对于JavaMe的用法,没有JNI这样的东西,但我可能会 Select Nested VM
- 要在Bash脚本中使用,必须有一个带有命令行界面的可执行文件
- 对于其他客户端语言,我不知道
- 对于大多数客户端语言,最好有一个用该语言编写的适配器接口.我认为有一些工具可以为Java和其他一些工具自动生成此代码
- 对于面向对象的语言,可以创建一个面向对象的适配器来隐藏库的接口是基于函数的这一事实-但我不知道是否值得这样做
可能的子问题
- 通过可管理的努力,这是可能的吗,或者只是可移植性太强了吗?
- 有没有关于这类设计标准的好书/好网站?
- 我的假设有错吗?
- 哪些开放源代码库值得学习它们的设计/界面/资源?
- 梅塔:这个问题很长,你有没有办法把它分成几个小问题?(If you reply to this, do it as a comment, not as an answer)