Maison >Java >javaDidacticiel >Odeur de code – Expressions régulières non testées
Regex sans tests demande des ennuis - Ne soyez pas paresseux. C'est gratuit avec l'IA !
TL;DR : utilisez des expressions régulières claires et concises et testez-les minutieusement.
Les expressions régulières sont puissantes mais délicates.
Si vous écrivez une expression régulière sans tests, vous demandez des erreurs inattendues.
Si vous écrivez une expression régulière cryptique et ignorez les tests automatisés, vous pourriez manquer des cas importants, provoquant des problèmes de sécurité ou la frustration des utilisateurs.
public class PasswordValidator { public static boolean isValidPassword(String password) { return password.matches( "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$"); // This is a cryptic Regular Expression } }
import java.util.ArrayList; import java.util.List; public class PasswordValidator { public static List<String> validatePassword(String password) { List<String> errors = new ArrayList<>(); if (password.length() < 8) { errors.add( "Password must be at least 8 characters long."); } if (!password.matches(".*[A-Z].*")) { errors.add( "Password must contain at least one uppercase letter."); } if (!password.matches(".*[a-z].*")) { errors.add( "Password must contain at least one lowercase letter."); } if (!password.matches(".*\d.*")) { errors.add( "Password must contain at least one digit."); } if (errors.isEmpty()) { errors.add( "Password is valid."); } return errors; // You no longer need a Regular Expression!! } } import static org.junit.Assert.*; import org.junit.Test; public class PasswordValidatorTest { // Now you have a lot of tests // You can use a Regular Expression, // a String Validator // an External Library // Whatever you want as long as it passes the tests! @Test public void testValidPassword() { List<String> result = PasswordValidator.validatePassword( "StrongPass1"); assertEquals("Password is valid.", result.get(0)); } @Test public void testTooShortPassword() { List<String> result = PasswordValidator.validatePassword( "Short1"); assertTrue(result.contains( "Password must be at least 8 characters long.")); } @Test public void testNoUppercase() { List<String> result = PasswordValidator.validatePassword( "nouppercase1"); assertTrue( result.contains( "Password must contain at least one uppercase letter.")); } @Test public void testNoLowercase() { List<String> result = PasswordValidator.validatePassword( "NOLOWERCASE1"); assertTrue(result.contains( "Password must contain at least one lowercase letter.")); } @Test public void testNoNumber() { List<String> result = PasswordValidator.validatePassword( "NoNumberPass"); assertTrue(result.contains( "Password must contain at least one digit.")); } }
[X] Automatique
Vous pouvez détecter quand votre regex est découverte en la modifiant pour échouer et en exécutant tous vos tests.
Si votre validation renvoie « faux » sans explications conviviales, c'est un signe clair que vous devez la refactoriser et améliorer les commentaires.
[X] Débutant
L'IA peut générer des expressions régulières mais ne parvient souvent pas à fournir des messages d'erreur utiles.
Sans instructions appropriées, les validateurs générés par l'IA peuvent ne pas réussir à guider les utilisateurs dans la correction de leurs entrées.
L'IA peut détecter les modèles d'expressions régulières de base et les commentaires manquants avec des invites claires.
il se peut qu'il ne crée pas automatiquement des cas de test ou des descriptions détaillés, sauf demande spécifique.
Rappelez-vous : les assistants IA font beaucoup d'erreurs
Without Proper Instructions | With Specific Instructions |
---|---|
ChatGPT | ChatGPT |
Claude | Claude |
Perplexity | Perplexity |
Copilot | Copilot |
Gemini | Gemini |
Une expression régulière sans retour clair est peu conviviale et sujette aux erreurs.
Il serait utile que vous décriviez pourquoi ils ont échoué et que vous rédigiez des tests approfondis pour vous assurer que votre regex fonctionne comme prévu.
Les odeurs de code sont mon opinion.
Photo par rc.xyz Galerie NFT sur Unsplash
Le feedback est le petit-déjeuner des champions.
Ken Blanchard
Cet article fait partie de la série CodeSmell.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!