J'ai un algorithme intensif logique que je dois coder en deux langues (en fait, je l'ai terminé dans une langue de manière satisfaisante et je suis sur le point de commencer à coder dans l'autre langue). Par logique, je veux dire que l'algorithme n'est pas trivial, a besoin d'une compréhension approfondie et, surtout, pourrait avoir des bugs (en raison de la complexité et de la négligence, vous savez) qui devraient être corrigés à l'avenir.
De plus, je veux m'assurer que lorsque ce code change de mains, il ne doit finalement pas submerger les nouveaux programmeurs.
Dans ce scénario, quels sont les moyens qui permettraient de maintenir les bases de code et de les synchroniser? Par moyens, j'entends les outils logiciels, les meilleures pratiques, etc.
Pour info les deux langages sont C ++ et Java. C ++ pour Windows / Linux et Java pour "tout le reste", y compris Android.
Réponses:
Réponse courte: ne faites cela que si vous y êtes absolument contraint.
Si vous devez utiliser C ++, vous pouvez envisager d'utiliser le NDK pour créer votre algorithme pour Android en C ++, puis ajouter un wrapper Java fin pour l'interface utilisateur. Notez que l'utilisation du NDK signifie que votre code est beaucoup moins portable sur différents types de matériel. Ce n'est certainement pas préférable à l'utilisation de Java partout, mais mieux que d'avoir deux bases de code.
Si vous ne pouvez absolument pas le faire et devez avoir deux bases de code, voici trois suggestions:
1) Recherchez un outil comme Unity conçu pour les logiciels portables.
2) Essayez d'extraire les bits complexes du code en données ou en langage de script. Si vous pouvez écrire du code assez générique pour gérer le langage de script, il est plus facile de tester et de réussir deux fois. (Surtout s'il s'agit d'un langage standard créé par quelqu'un d'autre.) Vous pouvez alors avoir une base de code pour les bits complexes. (Vous pouvez essayer Lua, qui est orienté vers l'intégration.)
3) Comme l'indique l'autre réponse, créez une suite de tests pour valider les deux jeux de codes. Notez que c'est vraiment difficile à faire correctement. Après avoir fait exactement cela, je peux vous dire que cela fait l'objet de nombreux débats sur la version qui est "correcte", en particulier dans les cas d'erreur.
(2) et (3) peuvent être utilisés ensemble.
la source
Créez une seule suite de tests externes qui peut garantir que les deux bases de code se comportent de la même manière. J'ai mis un accent supplémentaire sur le mot "single" car sinon vous devrez maintenir deux suites de tests qui peuvent différer dans leurs affirmations. Je n'ai aucune suggestion sur la façon de procéder, mais cela semble être un moyen de maintenir votre santé mentale (et celle des futurs développeurs) lorsque vous travaillez sur ce type de base de code.
la source
vous pouvez utiliser un langage qui peut être compilé en code machine et en octet java soit en le transformant d'abord en java et C ++, soit directement. La dernière fois que j'ai vérifié que LLVM a des backends pour les deux
edit: un peu de navigation sur wiki m'a amené à GCJ qui peut compiler java en code machine
la source
À mon avis, la règle la plus importante pour un programmeur est "Ne vous répétez pas". Ce que vous suggérez est une violation claire de cette règle.
Je vous suggère sérieusement de trouver un moyen de n'implémenter l'algorithme qu'une seule fois. Je peux actuellement penser à deux approches différentes.
Utilisez une langue spécifique au domaine. Peut-être que l'algorithme peut être mieux exprimé dans un langage différent, par exemple un langage de script, pour lequel un analyseur peut exister sur toutes les plateformes sur lesquelles vous prévoyez d'exécuter l'application, ou vous pouvez générer du code C ++ / Java basé sur le code DSL.
Écrivez tout en C ++. C ++ peut être compilé sur pratiquement n'importe quelle plate-forme. Si sur certaines plates-formes vous avez besoin que l'application principale soit écrite en Java, je suppose qu'il est possible d'appeler une bibliothèque native (je ne suis pas très compétent en Java, mais je suppose que cela peut être fait).
Le maintien du même algorithme sur deux plates-formes différentes ne peut entraîner que des problèmes et des bugs.
la source
En plus des excellents conseils pour utiliser une suite de tests externe commune, vous voudrez peut-être vous pencher sur la programmation alphabétisée . Les outils de programmation alphabétisés vous permettent de produire plusieurs fichiers à partir d'un seul fichier source.
L'utilisation traditionnelle de LP est de vous permettre d'entrelacer la documentation avec le code d'une manière qui vous permet de garder la documentation très proche du code source. Un seul fichier noweb (par exemple) pourrait être utilisé pour générer un fichier de documentation qui pourrait être compilé dans un document plus grand en utilisant (disons) LaTex, et produire un fichier
.cpp
et.h
qui pourrait être compilé dans votre application.Dans votre cas, cela pourrait vous permettre de conserver les bases de code et la documentation ensemble, en produisant également un
.java
fichier.Garder la documentation et les différentes versions de code ainsi que dans un seul fichier, divisé en sections logiquement équivalentes, devrait le rendre beaucoup plus facile de les garder tous synchronisés les uns avec les autres.
la source
Ceci est un bon exemple de cas où les tests peuvent être utiles.
Je suggère d' avoir une suite de test unique à la fois votre base de code exécuté sur. Vous savez alors que vos bases de code sont toutes deux conformes à la même spécification!
(et, ayez une bonne couverture de test!)
la source
Envisagez de générer du code C ++ et Java à partir d'un autre langage
la source
Avertissement
Comme mentionné dans les articles précédents, si vous n'avez pas vraiment d'autre choix, alors.
Réponse
Plusieurs suggestions pratiques, au lieu d'une seule réponse:
(1) Utilisez des structures communes, même si les mêmes choses peuvent être faites différemment.
Exemple: je devais avoir le même code dans "Object Pascal" et "C ++", où la phrase "if" existe dans les deux, la parenthèse dans "C ++" est requise, mais pas dans "object Pascal".
Changé en:
Ajout de parenthèses dans les deux langues. Un autre cas sera les espaces de noms facultatifs par rapport aux espaces de noms requis ("packages").
(3) Conserver les noms des identificateurs, la sensibilité à la casse, spécialement les types, similaires, utiliser des alias, sous-classer, encapsuler:
Dans:
...
Sommaire
Je dois généralement travailler avec plusieurs langages de programmation, et il existe des bibliothèques "de base" personnalisées que je garde dans plusieurs langages de programmation.
Bonne chance.
la source