Jadikan Ungkapan Biasa Boleh Diuji dan Boleh Difahami
TL; DR: Anda boleh memecahkan regex pengesahan kompleks kepada bahagian yang lebih kecil untuk menguji setiap bahagian secara individu dan melaporkan ralat yang tepat.
Masalah Diatasi 😔
- Ungkapan biasa yang sukar diuji
- Pelaporan ralat tidak jelas
- Menyahpepijat mimpi ngeri
- Cabaran penyelenggaraan
- Baris dan kaedah yang terlalu panjang
- Ungkapan yang tidak dapat dikekalkan
- Obsesi Primitif
- Ralat pengasingan
- Silo pengetahuan
- Komen usang
- Ralat tanpa empati kepada pengguna akhir
Bau Kod Berkaitan 💨
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxvii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xx-we-have-reached-100
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-ix-7rr33ol
Langkah 👣
- Analisis regex untuk mengenal pasti komponen logiknya.
- Pecah regex kepada sub-corak yang lebih kecil, dinamakan untuk setiap komponen.
- Tulis ujian unit untuk setiap sub-corak untuk memastikan ia berfungsi dengan betul.
- Gabungkan sub-corak yang diuji ke dalam logik pengesahan penuh.
- Faktorkan semula kod untuk memberikan mesej ralat yang jelas untuk setiap bahagian yang gagal.
Kod Contoh 💻
Sebelum 🚨
function validateURL(url) { const urlRegex = /^(https?:\/\/)([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(\/.*)?$/; // Criptic and untesteable return urlRegex.test(url); }
Selepas 👉
// Step 1: Define individual regex components const protocolPattern = /^(https?:\/\/)/; const domainPattern = /^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; const pathPattern = /^\/.*$/; // Step 2: Write unit tests for each component describe("Protocol Validation", () => { test("should pass for http://", () => { expect(protocolPattern.test("http://")).toBe(true); }); test("should pass for https://", () => { expect(protocolPattern.test("https://")).toBe(true); }); test("should fail for invalid protocols", () => { expect(protocolPattern.test("ftp://")).toBe(false); }); }); describe("Domain Validation", () => { test("should pass for valid domains", () => { expect(domainPattern.test("example.com")).toBe(true); expect(domainPattern.test("sub.domain.org")).toBe(true); }); test("should fail for invalid domains", () => { expect(domainPattern.test("example")).toBe(false); expect(domainPattern.test("domain..com")).toBe(false); }); }); describe("Path Validation", () => { test("should pass for valid paths", () => { expect(pathPattern.test("/path/to/resource")).toBe(true); expect(pathPattern.test("/")).toBe(true); }); test("should fail for invalid paths", () => { expect(pathPattern.test("path/to/resource")).toBe(false); expect(pathPattern.test("")).toBe(false); }); }); // Step 3: Validate each part and report errors function validateURL(url) { if (!protocolPattern.test(url)) { throw new Error("Invalid protocol. Use http:// or https://."); } const domainStartIndex = url.indexOf("://") + 3; const domainEndIndex = url.indexOf("/", domainStartIndex); const domain = domainEndIndex === -1 ? url.slice(domainStartIndex) : url.slice(domainStartIndex, domainEndIndex); if (!domainPattern.test(domain)) { throw new Error("Invalid domain name."); } const path = url.slice(domainEndIndex); if (path && !pathPattern.test(path)) { throw new Error("Invalid path."); } return true; } // Step 4: Add integration tests for the full URL validation describe("Full URL Validation", () => { test("should pass for valid URLs", () => { expect(validateURL("https://lesluthiers.com/tour/")).toBe(true); expect(validateURL("https://bio.lesluthiers.org/")).toBe(true); }); test("should fail for invalid URLs", () => { expect(() => validateURL("ftp://mastropiero.com")). toThrow("Invalid protocol"); expect(() => validateURL("http://estherpsicore..com")). toThrow("Invalid domain name"); expect(() => validateURL("http://book.warren-sanchez")). toThrow("Invalid path"); }); });
Taip 📝
- [x] Separa Automatik
Keselamatan 🛡️
Pemfaktoran semula ini selamat jika anda mengikuti langkah-langkah dengan teliti.
Menguji setiap komponen memastikan anda menangkap ralat lebih awal.
Mengapa Kod Lebih Baik? ✨
Kod refactored adalah lebih baik kerana ia meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehujian.
Pecah regex kepada bahagian yang lebih kecil memudahkan pemahaman perkara yang dilakukan oleh setiap bahagian.
Anda juga boleh melaporkan ralat tertentu apabila pengesahan gagal, yang membantu pengguna membetulkan input mereka.
Ini juga merupakan peluang yang baik untuk menggunakan teknik Pembangunan Dipacu Ujian , secara beransur-ansur meningkatkan kerumitan dengan memperkenalkan subbahagian baharu.
Bagaimana Ia Meningkatkan Bijection? 🗺️
Dengan memecahkan regex kepada komponen yang lebih kecil dan bermakna, anda membuat pemetaan yang lebih rapat antara keperluan Dunia Nyata (cth, "URL mesti mempunyai protokol yang sah") dan kod.
Ini mengurangkan kekaburan dan memastikan kod mencerminkan domain masalah dengan tepat.
Had ⚠️
Pendekatan ini mungkin menambah beberapa overhed untuk corak regex yang sangat mudah di mana memecahkannya tidak diperlukan.
Refactor dengan AI 🤖
Anda boleh menggunakan alatan AI untuk membantu mengenal pasti komponen regex.
Minta AI menerangkan perkara yang dilakukan oleh setiap bahagian regex, kemudian bimbing anda memecahkannya kepada kepingan yang lebih kecil dan boleh diuji. Contohnya, anda boleh bertanya, "Apakah yang dilakukan oleh regex ini?" dan susulan dengan, "Bagaimanakah saya boleh membahagikannya kepada bahagian yang lebih kecil?".
Sudah 2025, Tiada pengaturcara harus menulis Ungkapan Biasa baharu lagi.
Anda harus menyerahkan tugas mekanikal ini kepada AI.
Cadangan Cadangan: 1. Analisis regex untuk mengenal pasti komponen logiknya.2. Pecah regex kepada sub-corak yang lebih kecil, dinamakan untuk setiap komponen.3. Tulis ujian unit bagi setiap sub-corak untuk memastikan ia berfungsi dengan betul.4. Gabungkan sub-corak yang diuji ke dalam logik pengesahan penuh.5. Faktorkan semula kod untuk memberikan mesej ralat yang jelas untuk setiap bahagian yang gagal.
Tanpa Arahan Yang Betul | Dengan Arahan Tertentu |
---|---|
Tag 🏷️
- Kebolehujian
Tahap 🔋
- [x] Pertengahan
Pemfaktoran Semula Berkaitan 🔄
Lihat juga 📚
Kredit 🙏
Imej oleh Gerd Altmann di Pixabay
Artikel ini adalah sebahagian daripada Siri Pemfaktoran Semula.