Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Réécriture de code vieux de 17 ans

Réécriture de code vieux de 17 ans

Anna Filina

October 27, 2017
Tweet

More Decks by Anna Filina

Other Decks in Programming

Transcript

  1. Anna Filina • Sauvetage de projet • Code legacy •

    Développement • Conférences • Formations privées • Contrebande d'éléPHPants
  2. Vous vous sentez vieux? • Bug de l'an 2000. •

    Internet Explorer 5. • ICQ commençait à devenir cool. • Coins ronds = marque de distinction. • PHP 4!
  3. Préoccupations mixtes <?php mysql_query('...'); $total = 0; foreach ($products as

    $p) { $total += $p['qty'] * $p['price']; } ?> <p>Total: <?= $total ?></p>
  4. Conditions douteuses if ($order_id > 20117) { // use this

    sql } else { // use that sql } // faiblesse = occasion pour le refactoring
  5. Longues méthodes public function importCsv($path, $googleApiKey, $databaseDsn, $databaseUser, $databasePassword) {

    // Convert CSV to array of conferences $lines = file($path); $csv = array_map('str_getcsv', $lines); $conferences = []; foreach ($csv as $line) { $conference = new Conference(); $conference->name = $line[0]; $conference->location = $line[1]; $conferences[] = $conference; // Get coordinates for location $location = urlencode($conference->location); $url = 'https://maps.googleapis.com/maps/api/geocode/json?address='.$location.'&key='.$googleApiKey; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($curl); curl_close($curl); $json = json_decode($response); if (count($json->results) == 0) { continue; } $latitude = $json->results[0]->geometry->location->lat; $longitude = $json->results[0]->geometry->location->lng; $coordinates = $latitude.','.$longitude; $conference->coordinates = $coordinates; // Save conference to database $pdo = new PDO($databaseDsn, $databaseUser, $databasePassword); $statement = $pdo->prepare('REPLACE INTO conference (name, location, coordinates) VALUES (?, ?, ?)'); $statement->execute([ $conference->name, $conference->location, $conference->coordinates, ]);
  6. Fichier de code legacy moyen • 3000-6000 lignes de code.

    • La moitié est commentée "juste au cas". • Des méthodes de 800 lignes. • Parfois pas de classes.
  7. Stratégie • Bâtir une stratégie selon les contraintes • Réécriture

    complète vs progressive: ◦Par classe. ◦Par feature/module. ◦Par appel HTTP. • Exécuter le code côte à côte: ◦Partage de BD/session. ◦mod_rewrite.
  8. Les données se perdent, les choses se brisent • Sauvegarde:

    test de restauration. • Anonymisez les données sensibles. • Staging: simulez les déploiements/processus batch. • Automatisez les tests avant les changements. • Faites une évaluation de risque: ◦ Ne soyez pas trop optimistes. ◦ Tenez compte des effets secondaires.
  9. PHP 3 vers PHP 5.6 • HTML + PHP +

    SQL dans un fichier. • Des include partout. • SQL concaténé par des if. • Tentative de réécriture: ◦ Échouée, a rendu les choses pires. ◦ Dossiers de code mort. ◦ Classes avec méthodes statiques (pas d'instances).
  10. Solution • Réécrire les formulaires complexes en Symfony: ◦ mod_rewrite

    pour les pages concernées. • Réécrire le plus gros module en orienté- objet: ◦ Extraction de design. ◦ Architecture flexible. ◦ Tests automatisés.
  11. Éviter d'être biaisé par le code • Ancien code →

    design. • Valider le design: ◦Clarifier les règles d'affaires. • Améliorer le design: ◦Réduire la dette technique. ◦Plus flexible. • Design → nouveau code.
  12. Duplication de code • Un bogue répété 80 fois. •

    Enlever les doublons au plus vite.
  13. Corriger les méga-méthodes • Extraire la partie brisée dans sa

    propre méthode. • Écrire des tests unitaires pour la nouvelle méthode. • Réparer. • Appeller à partir de la méga-méthode.
  14. Trouver les groupes logiques Convert CSV to array of conferences.

    Get coordinates for conference location. Save conference to database. Bloc de code Commentaire Bloc de code Commentaire Bloc de code Commentaire
  15. Extraire et tester Bloc de code Méthode Bloc de code

    Commentaire Bloc de code Commentaire Appel
  16. Nommer Bloc de code Méthode Bloc de code Méthode Bloc

    de code Méthode Appel Appel Appel getConferencesFromCsv getLocationCoordinates saveConference
  17. ASP Classic vers PHP 5.6 • Spaghetti et raccourcis (15+).

    • Langage plus supporté. • Gros ERP avec beaucoup de code.
  18. Solution • Réécrire page par page vers Symfony. • mod_rewrite

    pour les pages concernées. • Adaptateur de sessions en BD dans les deux applications. • Page dans n'importe quel langage = requête HTTP.
  19. Essayez quelque chose de nouveau • Partagez les idées. ◦

    De nouvelles personnes pour élargir la vision. • Est-ce que ça a déjà été fait? • Puis-je essayer une autre approche?
  20. À retenir • Faire une stratégie. • Vous le touchez,

    vous le refactorisez. • Utiliser des outils et des méthodologies connus. • Inspirez-vous des autres. • Le refactoring devient plus facile. • Chaque problème a une solution.