2009-04-29 8 views
2

J'ai quelques projets qui s'exécutent sur du matériel personnalisé. Le matériel a maintenant changé, ce qui a nécessité quelques modifications logicielles. Par conséquent, il y a la source A pour «ancien matériel» et la source B pour «nouveau matériel», qui sont identiques à 95%.Comment maintenir un logiciel légèrement différent?

Si une nouvelle fonctionnalité est ajoutée dans le futur, elle doit être effectuée pour les deux versions. En d'autres termes, A et B existeront côte à côte et nécessiteront toujours les mêmes changements.

Je viens d'utiliser Subversion, donc je ne connais pas toutes les possibilités. Si je comprends bien, une nouvelle branche pour B séparerait les deux à partir de ce moment-là, ce qui n'est pas ce dont j'ai besoin.

Quelle est la meilleure façon de maintenir A et B afin que les modifications futures s'appliquent aux deux versions sans avoir à les appliquer manuellement deux fois?

Répondre

3

Si possible, je maintiendrais une arborescence source unique et utiliserais #ifdefs pour personnaliser le code pour le processeur particulier (en supposant que vous utilisez C ou C++). Cela fonctionne particulièrement bien si vous pouvez isoler les parties qui dépendent du matériel dans un petit nombre de fichiers. Si vous pouvez le faire, aucune magie de subversion supplémentaire n'est nécessaire.

+0

C'est comme ça que j'ai fait ces choses avant, sans penser à Subversion. Peut-être qu'il y avait une meilleure solution en utilisant Subversion, c'était ma raison pour la question. – Holgerwa

+2

Avoir ifdefs dans le code pour maintenir un emplacement de base de code "commun" n'est pas si facile que cela puisse paraître et je ne le recommande pas du tout.En fin de compte, ce sera une autre source importante de cauchemar pour le contrôle des changements, car il est facile, dans le même code source, d'introduire des versions «croisées» d'effets secondaires. Plus vous aurez de «branches», plus vous aurez de problèmes à suivre les changements pour une version spécifique et à garder les effets secondaires pour le reste des versions. –

+0

@Catalin Pitis: Pour chaque environnement matériel unique, il doit y avoir au moins une branche du code. À mon humble avis, on devrait essayer d'isoler ce qui est unique autant que possible, et de préférence le rassembler en un seul endroit. Parfois, #ifdefs fonctionne bien, d'autres fois il est logique de créer des classes ou des fonctions de pilotes spécifiques au matériel. Que recommandez-vous comme alternative? –

0

Dans SVN, vous pouvez créer des branches pour le matériel "ancien" et "nouveau".

+0

Mais ne devrais-je pas vérifier "ancien" et "nouveau" séparément et appliquer une modification à la fois manuellement? – Holgerwa

+0

Oui, vous devriez le faire de cette façon: changer de vieux et d'appliquer les modifications manuellement à nouveau. –

9

Je ne vois pas la nécessité d'un versionnement sophistiqué. Il suffit d'organiser vos sources dans la structure comme ceci:

Project 
|-CommonSource95% 
|-HardwareA 
|-HardwareB 

Utilisez makefiles ou #ifdefs pour personnaliser le code pour le matériel particulier.

1

Isolez le code qui est spécifique à une certaine version du matériel: Mettez-le dans différentes fonctions ou utilisez une macro pour échanger les différentes parties. C'est ce que les systèmes d'exploitation de haut niveau appellent "pilote de périphérique".

Dans le fichier de construction ou lors de l'exécution, déterminez la version dont vous avez besoin et activez-la. Les pointeurs de fonction sont vos amis. Facteur code commun et utilisez-le des deux versions. De cette façon, vous réduisez la duplication de code, vous pouvez voir les deux versions en même temps. Si vous séparez cela en utilisant les révisions SVN, cela ne sera pas possible.

0

Je ne résoudrais pas ce problème en effectuant des branchements dans votre système de contrôle de version. Les branches peuvent diverger à un point où il devient difficile de porter les changements entre eux.

Cette question m'a fait penser au projet Apache Portable Runtime. Vous pouvez utiliser la même idée pour votre code: masquer les différences d'implémentation pour différents matériels derrière un Hardware Abstraction Layer. Les différentes implémentations de cette couche peuvent vivre côte à côte dans le même tronc. La plupart du code ne devrait pas se soucier du matériel et y accéder par l'intermédiaire de la HAL.

Questions connexes