开发和维护在Java和C#中开发的应用程序库

时间:2009-10-06 15:24:37

标签: c# java

我正在用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;
}

(此代码应该已经针对错误的参数进行了测试!!)

我会将当前的方法作为答案,并要求其他人支持或批评它。

1 个答案:

答案 0 :(得分:0)

我们计划采取以下方法:

  • 为单元测试创​​建包装器(例如,TestUtil.IsEqual(a,b)包装Assert.isEqual(a,b)(Java)和Assert.AreEqual(a,b)(C#)
  • 包装XML数据模型(C#中的LINQ,Java中的XOM),以便签名看起来尽可能相似
  • 在每种语言中使用尽可能少的另一种语言中没有的结构。例如不使用??或者在C#
  • 中可以为空
  • 语言结构必须不同(例如类继承)尝试格式化它们,以便全局文本替换可以工作。然后依靠编译器来检测问题。

以下是问题中班级的典型测试。无论如何,我们必须编写一个特殊的测试程序来比较真实的矩阵。签名尽可能抽象。

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);
}