Accueil🇫🇷Chercher

Programmation par copier-coller

La programmation par copier-coller est la production de code source par de nombreux copier-coller. Elle est un palliatif Ă  des compĂ©tences insuffisantes en programmation informatique, mais peut ĂŞtre due Ă  des limitations technologiques (par exemple, un environnement de dĂ©veloppement peu expressif) lĂ  oĂą des fonctions ou des bibliothèques logicielles seraient normalement utilisĂ©es. Elle est considĂ©rĂ©e comme acceptable voire nĂ©cessaire, par exemple avec le code redondant (boilerplate en anglais), le dĂ©roulage de boucle manuel (quand le compilateur ne sait pas le faire automatiquement), ou avec certains idiomes de programmation. Dans ces cas, cette pratique est prise en charge, par les Ă©diteurs de texte et environnements de dĂ©veloppement sous la forme de snippets.

Origines

La programmation par copier-coller est souvent pratiquée par des développeurs inexpérimentés ou des étudiants pour qui l’écriture de code à partir de zéro est difficile et qui préfèrent chercher une solution toute faite ou une solution partielle qu'ils peuvent adapter pour résoudre leur propre problème[1].

Les développeurs inexpérimentés qui copient souvent du code ne comprennent pas complètement le code qu'ils copient. Le problème vient plus de leur inexpérience et de leur manque de courage en programmation que du copier-coller en lui-même. Le code vient souvent de sources diverses telles que le code de leurs amis ou de leur collègues, les forums internet, le code produit par les professeurs ou assistant professeurs ou les livres sur la programmation. Le résultat est un assemblage de styles de code différents avec du code superflu.

Cette pratique est également la cause de bugs : les décisions de conception provenant du code copié peuvent ne plus s'appliquer là où le code est reproduit.

Le code collé peut être impénétrable car les noms des variables, classes, fonctions et autres sont rarement modifiés, même si leur utilisation peut être complètement différente dans le nouveau contexte[1].

Duplication

RĂ©Ă©criture de code rĂ©pĂ©titif en utilisant une abstraction telle qu'une fonction.

Utiliser des snippets

Le copier-coller est aussi utilisé par des développeurs expérimentés qui disposent d'une bibliothèque de snippets bien testés et génériques qui sont faciles à adapter pour une tâche spécifique[2].

Étant une forme de duplication de code, la programmation par copier-coller hérite des mêmes problèmes: ces problèmes sont exacerbés si le code ne garde pas de lien sémantique entre la source et les copies. Dans ce cas, si des changements doivent être apportés, le développeur perd du temps à chercher les clones. Ce problème peut être amoindri si le code d'origine et/ou les copies sont commentés de manière appropriée; cependant il faut toujours répéter le même changement en de nombreux endroits. Par ailleurs, puisque les commentaires ne sont souvent pas mis à jour lors de la maintenance[3], les commentaires précisant où trouver les clones ont la réputation de devenir caducs.)

Les tenants des méthodologies orientées objet rejettent l'utilisation du copier-coller avec une bibliothèque de code. Au lieu de copier de manière répétée un algorithme générique, l'algorithme serait abstrait dans une classe encapsulée réutilisable. La classe est écrite d'une manière flexible, pour permettre l'héritage et la surcharge, afin que tout le code appelant puisse utiliser ce code générique directement, au lieu de modifier le code original[4]. Lorsque des fonctionnalités supplémentaires sont nécessaires, la bibliothèque est modifiée (tout en maintenant la compatibilité descendante). Ainsi, si un bug est corrigé dans l'algorithme originel ou bien s'il est amélioré, tous les logiciels qui l'utilisent en bénéficient.

Brancher le code

Brancher le code est une pratique classique dans les grandes équipes de développement, car cela permet de développer sur plusieurs branches en parallèle, ce qui réduit donc les cycles de développement. L'utilisation de branches implique:

Le copier-coller est une alternative moins formelle que l'utilisation de branches, souvent utilisée lorsque l'on s'attend à ce que les branches divergent de plus en plus avec le temps, comme lorsqu'un nouveau produit est créé à partir d'un produit existant.

Lorsque l'on crée un produit à partir d'un produit existant, la programmation par copier-coller présente des avantages évidents puisque les nouveaux développements n'affectent pas le code du produit existant:

  • Il n'y a pas besoin d’exĂ©cuter des tests de rĂ©gression sur le produit existant, ce qui dĂ©gage du temps pour que l'assurance qualitĂ© travaille sur le lancement du nouveau produit, et rĂ©duit le temps de mise sur le marchĂ©.
  • Il n'y a pas de risque d'introduire des bugs dans le produit existant, ce qui pourrait frustrer la base d'utilisateurs existante.

Les désavantages sont:

  • Si le nouveau produit ne diverge pas autant qu’envisagĂ© du produit existant, alors les deux bases de code devront ĂŞtre maintenues (doublant les coĂ»ts) lĂ  oĂą un seul produit aurait suffi. Ceci peut mener Ă  un refactoring coĂ»teux et une fusion manuelle finalement.
  • La base de code dupliquĂ© double le temps nĂ©cessaire pour implĂ©menter les changements demandĂ©s sur les deux produits; ce qui augmente le temps de mise sur le marchĂ© pour ces changements, et pourrait en fait absorber tout le temps gagnĂ© par l'utilisation initiale d'une base de code sĂ©parĂ©e.

Comme ci-dessus, l'alternative au copier-coller serait une approche modulaire:

  • D'abord isoler le code Ă  partager entre les deux produits dans des bibliothèques.
  • Utiliser ces bibliothèques (plutĂ´t qu'une deuxième copie de la base de code) comme fondation pour le dĂ©veloppement du nouveau  produit.
  • Si des versions postĂ©rieures a la deuxième version sont envisagĂ©es par la suite, cette approche fonctionne mieux car les bibliothèques dĂ©jĂ  existantes rĂ©duisent les cycles de dĂ©veloppement de toutes les versions suivant la deuxième [5].

Tâches répétitives ou variations d'une tâche

Difficulté et risque de maintenir du code écrit par copier-coller

Une des formes les plus néfaste de la programmation par copier-coller apparait dans du code exécutant une tâche répétitive, ou une variation de la même tâche qui dépend d'une variable. Chaque instance est copiée-collée depuis le code situé au-dessus, et des modifications mineures sont apportées. Les effets néfastes incluent:

  • Le copier-coller produit souvent de longues mĂ©thodes (qui est un code smell).
  • Chaque instance crĂ©e du code dupliquĂ©, avec tous les problèmes vus prĂ©cĂ©demment, avec une portĂ©e bien plus grande. Il est commun de voir des vingtaines d'instances dupliquĂ©es; voire des centaines parfois. Les corrections de bugs, ou l’évolution du code deviennent très difficiles et coĂ»teux[6].
  • Un tel code devient moins lisible, car il est difficile de discerner exactement ce qui diffère entre chaque rĂ©pĂ©tition. Ceci augmente les risques et le coĂ»t de modifier le code.
  • La programmation procĂ©durale rejette explicitement le copier-coller pour les tâches rĂ©pĂ©titives. Dans ce paradigme, une approche prĂ©fĂ©rable Ă  la succession de tâches rĂ©pĂ©titives consiste Ă  crĂ©er une fonction ou une sous-routine qui regroupe les instructions rĂ©pĂ©tĂ©s. Cette fonction est ensuite appelĂ©e de manière rĂ©pĂ©titive par la routine parente, ou bien mĂŞme appelĂ©e dans une boucle. Un tel code est dit « bien dĂ©composĂ© Â», et il est recommandĂ© car il est plus facile Ă  lire et plus facilement extensible[7].
  • La règle applicable dans ce cas est « ne vous rĂ©pĂ©tez pas Â».

Choix de conception délibéré

La programmation par copier-coller est occasionnellement acceptée comme une pratique de développement appropriée. C'est le cas avec du code code redondant (boilerplate en anglais) tel que les déclarations de classes ou l'import de bibliothèques standards, ou en utilisant un modèle de code existant (avec un contenu vide ou des ébauches de fonctions) en tant que guides à compléter.

L’utilisation d'idiotismes de programmation et de patrons de conception sont similaires au copier-coller, puisqu'ils utilisent un code convenu. Dans certains cas ils peuvent ĂŞtre capturĂ©s dans des snippets, qui sont alors collĂ©s lorsqu'on en a besoin, mĂŞme s'ils sont souvent Ă©crits par le dĂ©veloppeur d’après ses souvenirs. Parfois, ces idiomes ne peuvent pas ĂŞtre rĂ©duits Ă  un snippet. Cependant, dans la plupart des cas, un idiome sera soit suffisamment long pour ĂŞtre abstrait dans une fonction, soit suffisamment court pour qu'il puisse ĂŞtre directement tapĂ© au clavier.

Exemple

Un exemple simple est une boucle for qui peut ĂŞtre Ă©crite comme ceci: for (int i=0; i!=n; ++i) {}.

Voici un exemple de code utilisant une boucle for :

void foo(int n) {
    for (int i=0; i!=n; ++i) {
       /* body */
    }
}

La boucle pourrait avoir été générée avec le snippet suivant (qui spécifie les types et noms de variable):

    for ($type $loop_var = 0; $loop_var != $stop; ++$loop_var) {
        /* body */
    }

Références

  1. (en)"Revisiting Novice Programmers Errors". acm.org.
  2. (en) « Building ASP.NET Web Pages Dynamically in the Code-Behind », codeproject.com (consulté le )
  3. (en)Spinellis, Diomidis.
  4. (en)Lewallen, Raymond. "4 major principles of Object-Oriented Programming". codebetter.com.
  5. (en)Eriksen, Lisa.
  6. (en)Nigel Cheshire and Richard Sharpe.
  7. (en)"Stanford University, CS 106X ("Programming Abstractions") Course Handout: "Decomposition"" (PDF).
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.