Rumah  >  Artikel  >  Java  >  Bau Kod - Ungkapan Biasa Yang Belum Diuji

Bau Kod - Ungkapan Biasa Yang Belum Diuji

Susan Sarandon
Susan Sarandonasal
2024-10-26 08:25:30352semak imbas

Regex Tanpa Ujian Meminta Masalah - Jangan malas. Ia percuma dengan AI!

TL;DR: Gunakan ungkapan biasa yang jelas dan ringkas, dan ujinya dengan teliti.

Masalah

  • Kebolehbacaan
  • Tiada kes ujian
  • Kes tepi yang terlepas
  • Cabaran nyahpepijat
  • Kegagalan yang tidak jelas
  • Kecacatan yang tersembunyi

Penyelesaian

  1. Minta AI kegemaran anda untuk menulis kes ujian
  2. Pecahkan ungkapan biasa yang kompleks kepada bahagian yang lebih kecil dan lebih mudah dibaca.
  3. Semak sarung tepi
  4. Sahkan output
  5. Refactor regex sebaik sahaja anda membuat ujian
  6. Tingkatkan Mesej Ralat

Konteks

Ekspresi biasa berkuasa tetapi rumit.

Jika anda menulis regex tanpa ujian, anda meminta ralat yang tidak dijangka.

Jika anda menulis regex samar dan melangkau ujian automatik, anda boleh terlepas kes penting, menyebabkan isu keselamatan atau kekecewaan pengguna.

Kod Contoh

salah

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
    }
}

Betul

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."));
    }
}

Pengesanan

[X] Automatik

Anda boleh mengesan apabila regex anda ditemui dengan menukarnya kepada gagal dan menjalankan semua ujian anda.

Jika pengesahan anda mengembalikan "palsu" tanpa penjelasan yang mesra pengguna, ini adalah petanda yang jelas anda perlu memfaktorkannya semula dan menambah baik maklum balas.

Tag

  • Ujian

Tahap

[X] Pemula

Penjanaan AI

AI boleh menjana ungkapan biasa tetapi selalunya gagal memberikan mesej ralat yang berguna.

Tanpa arahan yang betul, pengesah yang dijana AI mungkin gagal membimbing pengguna untuk membetulkan input mereka.

Pengesanan AI

AI boleh mengesan corak ungkapan biasa asas dan tiada maklum balas dengan gesaan yang jelas.

ia mungkin tidak membuat kes ujian terperinci atau penerangan secara automatik melainkan ditanya secara khusus.

Cuba Mereka!

Ingat: AI Assistants melakukan banyak kesilapan

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

Kesimpulan

Ungkapan biasa tanpa maklum balas yang jelas adalah tidak mesra pengguna dan terdedah kepada ralat.

Adalah membantu jika anda menerangkan sebab mereka gagal dan menulis ujian menyeluruh untuk memastikan regex anda berfungsi seperti yang diharapkan.

perhubungan

Penafian

Bau Kod adalah pendapat saya.

Kredit

Foto oleh rc.xyz NFT galeri pada Unsplash


Maklum balas adalah sarapan pagi juara.

Ken Blanchard


Artikel ini adalah sebahagian daripada Siri CodeSmell.

Atas ialah kandungan terperinci Bau Kod - Ungkapan Biasa Yang Belum Diuji. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn