ホームページ >Java >&#&チュートリアル >コードの匂い - 未テストの正規表現
テストのない正規表現は問題を引き起こします - 怠惰にしないでください。 AI搭載で無料!
TL;DR: 明確で簡潔な正規表現を使用し、徹底的にテストしてください。
正規表現は強力ですが、注意が必要です。
テストを行わずに正規表現を作成すると、予期しないエラーが発生することになります。
不可解な正規表現を記述して自動テストをスキップすると、重要なケースを見逃して、セキュリティ上の問題やユーザーの不満を引き起こす可能性があります。
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 アシスタントは多くの間違いを犯します
Without Proper Instructions | With Specific Instructions |
---|---|
ChatGPT | ChatGPT |
Claude | Claude |
Perplexity | Perplexity |
Copilot | Copilot |
Gemini | Gemini |
明確なフィードバックのない正規表現はユーザーにとって使いにくく、エラーが発生しやすくなります。
失敗した理由を説明し、正規表現が期待どおりに動作することを確認するための徹底的なテストを作成していただければ助かります。
コードの匂いは私の意見です。
Unsplash の rc.xyz による写真
フィードバックはチャンピオンの朝食です。
ケン・ブランチャード
この記事は CodeSmell シリーズの一部です。
以上がコードの匂い - 未テストの正規表現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。