繁体   English   中英

开发和维护以Java和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;
}

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

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

我们计划采用以下方法:

  • 为单元测试创​​建包装器(例如,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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM