ホームページ  >  記事  >  Java  >  コードの匂い - 未テストの正規表現

コードの匂い - 未テストの正規表現

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 08:25:30352ブラウズ

テストのない正規表現は問題を引き起こします - 怠惰にしないでください。 AI搭載で無料!

TL;DR: 明確で簡潔な正規表現を使用し、徹底的にテストしてください。

問題点

  • 可読性
  • テストケースはありません
  • エッジケースの見逃し
  • デバッグの課題
  • 不明瞭な障害
  • 隠れた欠陥

ソリューション

  1. お気に入りの AI にテスト ケースを作成してもらいます
  2. 複雑な正規表現をより小さく、読みやすい部分に分割します。
  3. エッジケースを確認してください
  4. 出力を検証する
  5. テストを作成したら正規表現をリファクタリングします
  6. エラーメッセージを改善する

コンテクスト

正規表現は強力ですが、注意が必要です。

テストを行わずに正規表現を作成すると、予期しないエラーが発生することになります。

不可解な正規表現を記述して自動テストをスキップすると、重要なケースを見逃して、セキュリティ上の問題やユーザーの不満を引き起こす可能性があります。

サンプルコード

間違っている

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] 自動

正規表現を失敗に変更し、すべてのテストを実行することで、正規表現が検出されたことを検出できます。

ユーザーフレンドリーな説明なしで検証が "false" を返した場合、それをリファクタリングしてフィードバックを改善する必要があるという明らかな兆候です。

タグ

  • テスト

レベル

[X] 初心者

AIの生成

AI は正規表現を生成できますが、役立つエラー メッセージを提供できないことがよくあります。

適切な指示がなければ、AI が生成したバリデーターはユーザーの入力を修正することができない可能性があります。

AI検出

AI は、明確なプロンプトにより、基本的な正規表現パターンと欠落しているフィードバックを検出できます。

特に要求されない限り、詳細なテスト ケースや説明が自動的に作成されない場合があります。

試してみてください!

覚えておいてください: AI アシスタントは多くの間違いを犯します

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

結論

明確なフィードバックのない正規表現はユーザーにとって使いにくく、エラーが発生しやすくなります。

失敗した理由を説明し、正規表現が期待どおりに動作することを確認するための徹底的なテストを作成していただければ助かります。

関係

免責事項

コードの匂いは私の意見です。

クレジット

Unsplash の rc.xyz による写真


フィードバックはチャンピオンの朝食です。

ケン・ブランチャード


この記事は CodeSmell シリーズの一部です。

以上がコードの匂い - 未テストの正規表現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。