![](/img/trans.png)
[英]AST generation for a an application developed both in visual basic and c#
[英]developing and maintaining an application library developed in both Java and C#
我正在用Java和C#开发特定于域的应用程序库。 我想从那些已经做过或思考过的人那里得到建议或经验。 我在下面扩展了(希望不会太多)。
这些选择是给定的(在范围内不使用J#,Python等)。 Java库与具有许多互补库/应用程序的大型Open社区相连接,C#希望使用.NET来增加类似的功能。 最终,我们希望该库将在两种语言中都具有大致相同的功能,并且代码将作为开放源代码生产,主要由志愿者提供,但具有明确的仁慈专政。
当前,大多数代码是Java(已构建多年),LOC在10K到50K之间(有些已过时)。 这将继续维护和调试,但几乎没有新功能。 C#代码本质上是其中的一个子集,具有一些新功能。 它受益于隐式和显式重构。 这两个库均受单元测试支持。
当前的意图(除非SO另有说服力)是代码将朝着通用抽象的方向收敛。 我们希望编码是手动的,包括转换,所以不会自动生成代码(请参阅Java和C#的并行开发中的注释)。 SO已经建议相同的Java和C#语法将类似地运行(泛型是一个可能的问题)[ 标识在Java和C#中都可以编译但运行不同的代码 。 除了在单元测试中投入人工输入以避免回归之外,我认为在此融合过程中没有其他选择。 希望一些旧代码可以作为YAGNI丢弃。
维护的一个重要方面很可能是检测域中的极端情况,以便在发现这些极端情况时将对这两种语言变体进行更改。 边缘案例包括不可预测的一致点,零长度字符串,带有循环的图形等。重要的是,当以一种语言报告错误时,其他志愿者可以克隆和适应测试并并行修复错误,而无需太多困难。
这是一块典型的Java代码,恰好基本上与语言无关。 (我们希望大多数库都具有相同的类名和签名)
public static RealSquareMatrix getCrystallographicOrthogonalisation(
double[] celleng, double[] angle) {
RealSquareMatrix orthMat = new RealSquareMatrix(3);
double dtor = Math.PI / 180.0;
double sina = Math.sin(dtor * angle[0]);
double cosa = Math.cos(dtor * angle[0]);
double sinb = Math.sin(dtor * angle[1]);
double cosb = Math.cos(dtor * angle[1]);
double cosg = Math.cos(dtor * angle[2]);
double cosgstar = (cosa * cosb - cosg) / (sina * sinb);
double singstar = Math.sqrt(1.0 - cosgstar * cosgstar);
double[][] omat = orthMat.getMatrix();
omat[0][0] = celleng[0] * sinb * singstar;
omat[0][1] = 0.0;
omat[0][2] = 0.0;
omat[1][0] = -celleng[0] * sinb * cosgstar;
omat[1][1] = celleng[1] * sina;
omat[1][2] = 0.0;
omat[2][0] = celleng[0] * cosb;
omat[2][1] = celleng[1] * cosa;
omat[2][2] = celleng[2];
return orthMat;
}
(此代码应已针对错误的参数进行了测试!!)
我将以当前的方法作为答案,并请其他人支持或批评它。
我们计划采用以下方法:
这是针对该课程的典型测试。 无论如何,我们必须编写一个特殊的测试例程来比较真实的矩阵。 签名尽可能抽象。
public void testGetCrystallographicOrthogonalisation() {
double[] len = { 10.0, 11.0, 12.0 };
double[] ang = { 80.0, 90.0, 100.0 }; // degrees!
RealSquareMatrix m = RealSquareMatrix
.getCrystallographicOrthogonalisation(len, ang);
RealSquareMatrix mm = new RealSquareMatrix(3, new double[] {
9.843316493307713, 0.0, 0.0, -1.7632698070846495,
10.832885283134289, 0.0, 0.0, 1.9101299543362344, 12.0 });
MatrixTest.assertEquals("orthogonalise", mm, m, 0.000000000001);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.