2009-10-06 53 views
0

我正在開發Java和C#中的特定於領域的應用程序庫。我希望那些已經完成或想到這個的人的建議或經驗。我已經擴展(希望不會太多)。開發和維護在Java和C#中開發的應用程序庫

這些選擇吉文斯(使用的J#,Python等並不在範圍內)。 Java庫與一個帶有許多互補庫/應用程序的大型開放社區接口,C#希望使用.NET來增強類似的功能。最終,我們希望圖書館能夠在兩種語言中部署大致相同的功能,代碼將以開源形式提供,主要由志願者提供,但具有明確的善意專政。

目前大多數是以Java代碼爲(內置多年),用50K介於10K到LOC(有些過時)。這繼續保持和調試,但幾乎沒有新的功能。 C#代碼本質上是一個子集,具有一些新的功能。它受益於隱式和顯式重構。這兩個庫都受單元測試支持。

當前意圖(除非SO使我相信其它)是代碼將朝着一個共同的抽象收斂。我們打算編碼是手動的,包括轉換,所以不會自動生成代碼(請參閱Parallel development in Java and C#中的註釋)。 SO已經建議Java和C#語法是相同的(泛型是一個可能的問題)[identifying code that compiles in both Java and C# but runs differently。除了通過單元測試承諾人類輸入以避免迴歸之外,我在這種趨同期間看不到任何選擇。希望有些遺留代碼可以作爲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; 
} 

(此代碼應該已經壞參數測試!!)

我將會給我們目前的做法作爲一個答案並要求其他人支持或批評。

回答

0

我們計劃採取以下辦法:

  • 創建單元測試包裝(如TestUtil.IsEqual(A,B)包裝Assert.isEqual(A,B)(JAVA)和Assert.AreEqual (A,b)(C#)
  • 包裹XML數據模型(LINQ在C#中,XOM中的Java),這樣的簽名顯示爲可能
  • 用作每種語言所不具備的其他一些結構相似。例如,不要在C#中使用??或可爲空值
  • 其中語言結構必須不同(例如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); 
}