混合两种或者多种语言(例如Java和C ++)时组织源代码库
几天前,我不得不将C ++文件引入Java项目时遇到了一个问题。它首先需要测量Java进程的CPU使用率,并且确定了解决方法是使用JNI调用以C语言编写的本机库(Unix计算机上的共享库)。问题是找到合适的位置将C文件放入仅包含Java文件的源存储库中(顺便说一下Clearcase)。
我想到了几种替代方法:
(a)创建一个单独的目录,用于将C文件(特别是一个.h文件和一个.c文件)放在源库的顶部,例如:
/ vobs / myproduct / javasrc
/ vobs / myproduct / cppsrc
我不喜欢这样,因为我只有两个C文件,在这样的语言级别拆分源库似乎很奇怪。如果项目的大部分内容或者多或者少都用C ++和Java平等地编写,则可以。
(b)将C文件放入使用它的Java包中。
我在/ vobs / myproduct / com / mycompany / myproduct / util /中有调用Java类,并且C文件也放在其中。
我也不喜欢这样做,因为我认为C文件只是不属于Java包。
有人解决过这样的问题吗?通常,在组织混合两种或者多种语言的代码库时,遵循什么好的策略?
更新:我没有计划在我的项目中使用任何C或者C ++,也许有一些Jython,但我们永远不知道我的客户何时需要只能使用C才能解决的功能,或者只能使用C来解决的功能。
解决方案
我个人将两者分离,甚至可能将其分离到各自的独立项目中,但是那时候它们是分开的,就像我们不会在同一个类中放置两个不同的概念一样。当他们两个都触及相同的概念区域时,就会变得很模糊。当然,在构建代码时总是会遇到问题,例如是否有可能将其放入结构b)中而无需进行各种技巧即可将其编译?我们是否打算在项目中使用更多的C,在这种情况下,如果我们遵循相同的模式,C文件将散布到整个项目中...
"我不喜欢这样,因为我只有两个C文件,在这样的语言级别上拆分源库似乎很奇怪"
为什么看起来很奇怪?考虑这个项目:
project1\src\java project1\src\cpp project1\src\python
或者,如果我们决定将其拆分为模块,请执行以下操作:
project1\module1\src\java project1\module1\src\cpp project1\module2\src\java project1\module2\src\python
我认为这是个人喜好的问题,但是上述结构相当普遍,而且一旦我们习惯了,我认为它会很好地工作。
就拆分语言解决方案而言,我个人将它们保留在单独的项目或者文件夹中。
解决问题的一种方法是将C类与其他任何第三方API一样对待。接口出Java代码中的依赖项(即避免直接调用),以避免紧密耦合并将C源代码与Java放在单独的项目/文件夹中。
让我们使用不同的术语。有一种不是项目的产品。该产品由Java工作区和C / C ++工作区组成,每个工作区均可从不同的IDE加载。最终,如果我们使用同一个IDE,那么将只有一个工作区。
每个工作区由几个项目组成。每个项目都有自己的文件夹结构(src,bin,res,e.t.c)。因此,在只有一个工作空间的情况下,最好在其中至少包含一个Java和一个C / C ++项目,每个项目具有不同的compile / run / debug / output / ...设置。
因此,我将使用:
Product/Workspace(1)/JavaProject1/src Product/Workspace(1)/JavaProject2/src Product/Workspace(1 or 2)/CPPproject1/src Product/Workspace(1 or 2)/CPPproject2/src ...
这样,我们最终可以为每个项目使用一个相同的文件夹结构,这更加一致。基本上,这只是将产品划分到不同相关项目的另一抽象层次。
Web应用程序默认由Maven生成的布局是src / main / java,src / test / java,src / main / resources和src / test / resources。我假设它将默认添加src / main / cpp
和src / test / cpp
。对我来说,这似乎是一个足够体面的惯例。
将它们保存在单独的文件夹中是一个好主意。与在Java包中搜索C文件相比,它更易于查找,并且还允许将来添加更多C代码,而不必稍后进行遍历。
在这种情况下,所讨论的文件不仅是另一种语言,而且还作为单独的程序运行,该程序通过定义的界面进行交互。这意味着源文件可以视为一个单独的项目,因此可以保存在其他位置。
在将Cand ASP.NET(例如)混合在一个代码库中的.NET项目中,情况有所不同。在这种情况下,人们如何组织代码?