Учините регуларне изразе проверљивим и разумљивим
ТЛ;ДР: Можете да разбијете сложени регуларни израз валидације на мање делове да бисте тестирали сваки део појединачно и пријавили тачне грешке.
Решени проблеми 😔
- Регуларне изразе које је тешко тестирати
- Нејасно пријављивање грешака
- Отклањање грешака у ноћним морама
- Изазови одржавања
- Предуги редови и методе
- Неодрживи изрази
- Примитивна опсесија
- Изолација грешке
- Силоси знања
- Застарели коментари
- Грешке без емпатије према крајњим корисницима
Сродни кодови мирише 💨
хттпс://хацкерноон.цом/хов-то-финд-тхе-стинки-партс-оф-иоур-цоде-парт-ккв
хттпс://хацкерноон.цом/хов-то-финд-тхе-стинки-партс-оф-иоур-цоде-парт-и-ккз3евд
хттпс://хацкерноон.цом/хов-то-финд-тхе-стинки-партс-оф-иоур-цоде-парт-и-ккз3евд
хттпс://хацкерноон.цом/хов-то-финд-тхе-стинки-партс-оф-иоур-цоде-парт-ккквии
хттпс://хацкерноон.цом/хов-то-финд-тхе-стинки-партс-оф-иоур-цоде-парт-кк-ве-хаве-реацхед-100
хттпс://хацкерноон.цом/хов-то-финд-тхе-стинки-партс-оф-иоур-цоде-парт-ик-7рр33ол
Кораци 👣
- Анализирајте регуларни израз да бисте идентификовали његове логичке компоненте.
- Разбијте регуларни израз на мање, именоване подобразце за сваку компоненту.
- Напишите јединичне тестове за сваки под-образац да бисте били сигурни да ради исправно.
- Комбинујте тестиране подобразце у потпуну логику валидације.
- Рефакторирајте код да бисте обезбедили јасне поруке о грешци за сваки неисправан део.
Пример кода 💻
Пре 🚨
function validateURL(url) { const urlRegex = /^(https?:\/\/)([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(\/.*)?$/; // Criptic and untesteable return urlRegex.test(url); }
После 👉
// 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"); }); });
Откуцајте 📝
- [к] Полуаутоматски
Безбедност 🛡
Ово рефакторисање је безбедно ако пажљиво пратите кораке.
Тестирање сваке компоненте осигурава да ћете рано ухватити грешке.
Зашто је Кодекс бољи? ✨
Рефакторисани код је бољи јер побољшава читљивост, одржавање и могућност тестирања.
Растављање редовног израза на мање делове олакшава разумевање шта сваки део ради.
Такође можете пријавити одређене грешке када валидација не успе, што помаже корисницима да поправе свој унос.
Ово је такође одлична прилика за примену технике развоја вођеног тестом , постепено повећавајући сложеност увођењем нових подделова.
Како то побољшава бијекцију? 🗺
Растављањем редовног израза на мање, смислене компоненте, стварате ближе мапирање између захтева из стварног света (нпр. „УРЛ мора да има важећи протокол“) и кода.
Ово смањује двосмисленост и осигурава да код тачно одражава домен проблема.
Ограничења ⚠
Овај приступ може додати неке додатне трошкове за врло једноставне обрасце регуларних израза где би њихово разбијање било непотребно.
Рефактор са АИ 🤖
Можете да користите АИ алате да бисте лакше идентификовали компоненте регуларног израза.
Замолите вештачку интелигенцију да објасни шта ради сваки део редовног израза, а затим вас води у разбијању на мање делове који се могу тестирати. На пример, можете питати: „Шта ради овај регуларни израз?“ и наставите са: "Како да га поделим на мање делове?".
2025. година, ниједан програмер више не би требало да пише нове регуларне изразе .
Овај механички задатак треба да препустите АИ.
Предложени упит: 1. Анализирајте регуларни израз да бисте идентификовали његове логичке компоненте.2. Разбијте регуларни израз на мање, именоване подобразце за сваку компоненту.3. Напишите јединичне тестове за сваки под-образац како бисте били сигурни да ради исправно.4. Комбинујте тестиране подобразце у пуну логику валидације.5. Рефакторирајте код да бисте обезбедили јасне поруке о грешци за сваки неисправан део.
Без одговарајућих упутстава | Са посебним упутствима |
---|---|
Ознаке 🏷
- Тестабилити
Ниво 🔋
- [к] Средњи
Повезани рефактори 🔄
Погледајте такође 📚
Цредитс 🙏
Слика од Герда Алтмана на Пикабаи-у
Овај чланак је део Рефакторинг серије.