2009-10-06 5 views
0

Je développe une bibliothèque d'applications spécifique au domaine en Java et C#. J'aimerais des suggestions ou de l'expérience de ceux qui ont fait ou ont pensé à cela. J'ai élargi (heureusement pas trop) ci-dessous.Développement et maintenance d'une bibliothèque d'applications développée à la fois en Java et en C#

Ces choix sont donnés (l'utilisation de J #, Python, etc. n'est pas dans le champ d'application). La bibliothèque Java s'interface avec une grande communauté Open avec de nombreuses bibliothèques/applications complémentaires, et le C# espère développer des fonctionnalités similaires en utilisant .NET. En fin de compte, nous espérons que la bibliothèque sera déployée avec des fonctionnalités à peu près identiques dans les deux langues et que le code sera produit en Open Source, principalement par des bénévoles mais avec une dictature bienveillante.

Actuellement, la majorité du code est Java (construit sur de nombreuses années), avec une valeur comprise entre 10K et 50K LOC (parfois obsolète). Cela continue à être maintenu et débogué mais avec peu de nouvelles fonctionnalités. Le code C# est essentiellement un sous-ensemble de ceci avec une nouvelle fonctionnalité. Il bénéficie d'un refactoring implicite et explicite. Les deux bibliothèques sont supportées par des tests unitaires. L'intention actuelle (sauf si SO me convainc autrement) est que le code convergera vers une abstraction commune. Nous avons l'intention que le codage est manuel, y compris la conversion, donc pas de génération automatique de code (voir les commentaires dans Parallel development in Java and C#). SO a déjà suggéré que la syntaxe Java et C# qui est identique fonctionnera de la même façon (les génériques étant un problème possible) [identifying code that compiles in both Java and C# but runs differently. Je ne vois aucune option au cours de cette convergence autre que l'entrée humaine engagée avec des tests unitaires pour éviter la régression. Espérons qu'une partie du code hérité pourra être supprimée en tant que YAGNI.

Il est probable qu'un aspect important de la maintenance sera la détection des cas de contours dans le domaine, de sorte que lorsque ceux-ci sont découverts, des modifications seront apportées aux deux variantes de langue. Les cas de bord incluront des points de concident imprévisibles, des chaînes de longueur nulle, des graphiques avec cycles, etc. Il est important que lorsque le bug est rapporté dans une langue, les autres volontaires puissent cloner et adapter le test et corriger le bug en parallèle sans trop difficulté.

Voici une partie typique du code Java qui est essentiellement indépendante de la langue. (Nous nous attendons à avoir des noms de classe identiques et signatures pour une grande partie de la bibliothèque)

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

(Ce code aurait dû être testé pour les mauvais arguments !!)

Je donnerai notre approche actuelle comme une réponse et demander aux autres de le soutenir ou de le critiquer.

Répondre

0

Nous prévoyons de prendre l'approche suivante:

  • créer des enveloppes pour les tests unitaires (par exemple TestUtil.IsEqual (a, b) enveloppements Assert.isEqual (a, b) (Java) et Assert.AreEqual (a, b) (C#)
  • envelopper le modèle de données XML (LINQ en C#, XOM en Java) afin que les signatures apparaissent aussi similaires que possible
  • utiliser comme peu de constructions dans chaque langue qui ne sont pas disponibles dans l'autre Par exemple, ne pas utiliser ?? ou nullable dans C#
  • où les constructions de langage doivent être différentes (p.ex. héritier de la lass) essayez de les formater pour qu'un remplacement de texte global fonctionne. Comptez ensuite sur le compilateur pour détecter les problèmes.

Voici un test typique pour la classe dans la question. De toute façon, nous avons dû écrire une routine de test spéciale pour comparer les matrices réelles. La signature est aussi abstraite que possible.

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