Comment vous y prendriez-vous sur la conversion d'un assez grand (>300 K), assez mature C code C++?
Le genre de C j'ai à l'esprit est divisé en fichiers correspondant grosso modo aux modules (c'est à dire moins précis que les typiques OO classe basée sur la décomposition), en utilisant une liaison interne au lieu des réceptions privées et des données, et de la liaison externe pour les fonctions publiques et les données. Les variables globales sont largement utilisés pour la communication entre les modules. Il y a un très vaste de l'intégration de la suite de tests disponible, mais aucune unité (c'est à dire le module) des tests de niveau.
J'ai en tête une stratégie générale:
- Tout compiler en C++C sous-ensemble et d'obtenir que le travail.
- Convertir des modules dans d'énormes classes, de sorte que toutes les références croisées sont limités par un nom de classe, mais en laissant toutes les fonctions et les données membres statiques, et obtenir que le travail.
- Convertir énorme classes dans les instances appropriées constructeurs et initialisé références croisées; remplacer le membre statique accès avec accès indirects, selon le cas; obtenir que le travail.
- Maintenant, l'approche du projet comme un mauvais compte OO application, et d'écrire des tests unitaires, où les dépendances sont traitables, et se décomposent dans des classes séparées, où ils ne sont pas; le but ici serait de passer d'un programme à l'autre à chaque transformation.
Évidemment, ce serait tout à fait un peu de travail. Existe-il des études de cas, les histoires de guerre là-bas sur ce genre de traduction? Les stratégies alternatives? D'autres conseils utiles?
Note 1: le programme est un compilateur, et probablement des millions d'autres programmes reposent sur son comportement ne change pas, donc en gros la réécriture est à peu près pas une option.
Note 2: la source de près de 20 ans, et a peut-être 30% de code de désabonnement (lignes modifiées + ajout / total des lignes) par an. Il est fortement maintenu et étendu, en d'autres termes. Ainsi, un des objectifs serait d'augmenter mantainability.
[Pour l'amour de la question, supposons que la traduction en C++ est obligatoire, et que le laisser dans C est pas une option. Le point de l'ajout de cette condition est d'éliminer le "laisser dans C" réponses.]