我正在開發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;
}
(此代碼應該已經壞參數測試!!)
我將會給我們目前的做法作爲一個答案並要求其他人支持或批評。