Heim > Java > javaLernprogramm > Code Smell – Ungetestete reguläre Ausdrücke

Code Smell – Ungetestete reguläre Ausdrücke

Susan Sarandon
Freigeben: 2024-10-26 08:25:30
Original
406 Leute haben es durchsucht

Regex ohne Tests fordert Ärger – seien Sie nicht faul. Mit KI ist es kostenlos!

TL;DR: Verwenden Sie klare und prägnante reguläre Ausdrücke und testen Sie sie gründlich.

Probleme

  • Lesbarkeit
  • Keine Testfälle
  • Fälle fehlender Kanten
  • Debugging-Herausforderungen
  • Unklare Fehler
  • Versteckte Mängel

Lösungen

  1. Bitten Sie Ihre Lieblings-KI, Testfälle zu schreiben
  2. Komplexe reguläre Ausdrücke in kleinere, besser lesbare Teile zerlegen.
  3. Überprüfen Sie Randfälle
  4. Ausgaben validieren
  5. Refaktorieren Sie den regulären Ausdruck, sobald Sie die Tests erstellt haben
  6. Verbessern Sie die Fehlermeldungen

Kontext

Reguläre Ausdrücke sind leistungsstark, aber knifflig.

Wenn Sie einen regulären Ausdruck ohne Tests schreiben, treten unerwartete Fehler auf.

Wenn Sie eine kryptische Regex schreiben und automatisierte Tests überspringen, könnten Ihnen wichtige Fälle entgehen, was zu Sicherheitsproblemen oder Benutzerfrustration führen könnte.

Beispielcode

Falsch

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
    }
}
Nach dem Login kopieren

Rechts

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."));
    }
}
Nach dem Login kopieren

Erkennung

[X] Automatisch

Sie können erkennen, wann Ihr regulärer Ausdruck aufgedeckt wird, indem Sie ihn in „fehlschlagen“ ändern und alle Ihre Tests ausführen.

Wenn Ihre Validierung ohne benutzerfreundliche Erklärungen „falsch“ zurückgibt, ist das ein klares Zeichen dafür, dass Sie sie umgestalten und das Feedback verbessern müssen.

Schlagworte

  • Testen

Ebene

[X] Anfänger

KI-Generierung

KI kann reguläre Ausdrücke generieren, liefert aber oft keine hilfreichen Fehlermeldungen.

Ohne entsprechende Anweisungen können KI-generierte Validatoren Benutzer möglicherweise nicht durch die Korrektur ihrer Eingaben führen.

KI-Erkennung

KI kann grundlegende Muster regulärer Ausdrücke und fehlendes Feedback mit klaren Anweisungen erkennen.

Es werden möglicherweise nicht automatisch detaillierte Testfälle oder Beschreibungen erstellt, es sei denn, Sie werden ausdrücklich darum gebeten.

Probieren Sie sie aus!

Denken Sie daran: KI-Assistenten machen viele Fehler

Without Proper Instructions With Specific Instructions
ChatGPT ChatGPT
Claude Claude
Perplexity Perplexity
Copilot Copilot
Gemini Gemini

Abschluss

Ein regulärer Ausdruck ohne klares Feedback ist benutzerfreundlich und fehleranfällig.

Es wäre hilfreich, wenn Sie beschreiben würden, warum sie fehlgeschlagen sind, und gründliche Tests schreiben würden, um sicherzustellen, dass Ihre Regex wie erwartet funktioniert.

Beziehungen

Haftungsausschluss

Code Smells sind meine Meinung.

Credits

Foto von rc.xyz NFT-Galerie auf Unsplash


Feedback ist das Frühstück der Champions.

Ken Blanchard


Dieser Artikel ist Teil der CodeSmell-Reihe.

Das obige ist der detaillierte Inhalt vonCode Smell – Ungetestete reguläre Ausdrücke. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage