我正在用Java和C#开发一个特定于域的应用程序库。我想要那些已经做过或想过这些的建议或经验。我在下面扩展了(希望不要太多)。
这些选择是给定的(使用J#,Python等不在范围内)。 Java库与具有许多互补库/应用程序的大型Open社区接口,C#希望使用.NET增加类似的功能。最终,我们希望图书馆将以两种语言大致相同的功能部署,代码将作为开源制作,主要由志愿者制作,但有明确的仁慈独裁。
目前大多数代码都是Java(建立多年),大约在10K到50K之间(有些已经过时)。这将继续维护和调试,但几乎没有新的功能。 C#代码本质上是其中的一个子集,具有一些新功能。它受益于隐式和显式重构。单元测试都支持这两个库。
当前的意图(除非SO说服我)是代码将汇聚到一个共同的抽象。我们打算编写手动编码,包括转换,因此不会自动生成代码(请参阅Parallel development in Java and C#中的注释)。 SO已经建议相同的Java和C#语法将运行类似(泛型是一个可能的问题)[identifying code that compiles in both Java and C# but runs differently。除了通过单元测试提交的人工输入以避免回归之外,我认为在此融合期间没有选择。希望一些遗留代码可以作为YAGNI丢弃。
维护的一个重要方面可能是检测域中的边缘情况,因此当发现这些情况时,将对两种语言变体进行更改。边缘情况将包括诸如不可预测的concident点,零长度字符串,具有周期的图形等等。重要的是,当用一种语言报告错误时,其他志愿者可以克隆并调整测试并且并行地修复错误而不需要太多困难。
这是一段典型的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;
}
(此代码应该已经针对错误的参数进行了测试!!)
我会将当前的方法作为答案,并要求其他人支持或批评它。
答案 0 :(得分:0)
我们计划采取以下方法:
以下是问题中班级的典型测试。无论如何,我们必须编写一个特殊的测试程序来比较真实的矩阵。签名尽可能抽象。
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);
}