Form Validation — məlumatları serverə göndərməzdən əvvəl formanın bütün sahələrinin düzgünlüyünü yoxlama prosesidir. Ayrı-ayrı sahənin doğrulanmasından fərqli olaraq, Form Validation sahələr arasındakı qarşılıqlı əlaqələri nəzərə alır: şifrənin təsdiqi, bir sahənin digərindən asılılığı, şərti məcburilik. Google Developers, 2026 məlumatına görə, Form Validation göndərmə zamanı formanı tamamilə yoxlamalı və istifadəçiyə bütün səhvlərin xülasəsini təqdim etməlidir. Düzgün forma doğrulaması qeydiyyat konversiyasını 25-35% artırır və daxiletmə zamanı səhvlərin sayını azaldır.
Əsas məqamlar
Form Validation — istifadəçinin formaya daxil etdiyi bütün məlumatların serverə göndərilməzdən əvvəl biznes tələblərinə uyğun olmasını təmin edən prosesdir. Forma doğrulaması hər bir sahənin ayrıca yoxlanılmasını, həmçinin çarpaz yoxlamaları əhatə edir: şifrənin təsdiqlə uyğunluğu, ən azı bir checkboxın seçilib-seçilməməsi, bütün məcburi sahələrin doldurulması, tarixin düzgünlüyü (məsələn, doğum tarixi gələcəkdə olmamalıdır).
Sadə sahə doğrulamasından fərq ondadır ki, Form Validation formanı vahid bir bütöv kimi idarə edir. Şərti sahə doldurulmadıqda göndərməni bloklaya və ya dialoq pəncərəsində səhvlərin xülasəsini göstərə bilər. Mürəkkəb formalarda (qeydiyyat, sifariş vermə, anket) forma doğrulaması UI-dan asılı olmayaraq test edilən ayrıca məntiq qatıdır.
NN Group UX tədqiqatlarına görə, istifadəçilər hər bir sahədən sonra ayrı-ayrılıqda deyil, səhvləri göndərmədən dərhal sonra gördükdə formanı doldurmağı 3 dəfə daha tez başa çatdırırlar. Bununla belə, ən yaxşı nəticə kombinasiya verir: sadə sahələrin ani doğrulaması (uzunluq, format) + çarpaz sahələr və biznes məntiqi üçün göndərmə zamanı tam yoxlama.
Sahənin doğrulanması suala cavab verir: bu konkret sahədə daxiletmə düzgündürmü? Email user@domain.com formatındadır, telefon rəqəmlərdən ibarətdir, şifrə 6 simvoldan uzundur. Sahənin doğrulanması təcrid olunmuşdur — digər sahələrdən asılı deyil və real vaxtda yerinə yetirilə bilər. Nəticə: konkret sahə üçün səhv və ya onun olmaması.
Formanın doğrulanması suala cavab verir: formanı tamamilə göndərmək olarmı? O, təkcə hər bir sahəni deyil, həm də onların kombinasiyalarını nəzərə alır: şifrə və təsdiq uyğun olmalıdır, başlama tarixi bitmə tarixindən gec ola bilməz, sahələrin cəmi 100% olmalıdır. Formanın doğrulanması göndərmə zamanı yerinə yetirilir və ümumi nəticə qaytarır: forma etibarlıdır və ya yox.
Arxitektura baxımından sahənin doğrulanması UI qatında (fraqment, ViewModel), formanın doğrulanması isə domain qatında (use case, interactor) yerləşdirilir. Bu, forma doğrulamasını müxtəlif UI komponentlərində təkrar istifadə etməyə və onu emulyator olmadan test etməyə imkan verir. Clean Architecture-da forma doğrulaması biznes qaydasıdır, UI məntiqi deyil.
| Meyar | Sahənin doğrulanması | Formanın doğrulanması |
|---|---|---|
| Yoxlama obyekti | Bir sahə | Bütün sahələr + onların qarşılıqlı əlaqələri |
| Yerinə yetirmə vaxtı | Real vaxtda / fokus itirildikdə | Forma göndərildikdə |
| Nəticə | Konkret sahənin səhvi | Formanın ümumi statusu + səhvlərin siyahısı |
| Arxitektura qatı | UI qatı | Domain qatı |
Form Validation üçün iki əsas yanaşma mövcuddur. Birincisi — imperativ: proqramçı ardıcıl olaraq hər sahəni yoxlayan və səhvlərin siyahısını toplayan funksiya yazır. Bu yanaşma başa düşmək üçün sadədir, lakin kod hər yeni sahə ilə böyüyür. 5 sahəsi olan forma üçün imperativ yanaşma hələ əlverişlidir, 15 sahə üçün — artıq problemlidir.
İkinci yanaşma — deklarativ: doğrulama qaydaları annotasiyalar və ya konfiqurasiya ilə təsvir olunur. Kitabxana özü bütün sahələri gəzir, qaydaları tətbiq edir və nəticə qaytarır. Nümunə: emailData sahəsi üzərində @Email annotasiyası, təsdiq sahəsi üzərində @ConfirmPassword. Deklarativ yanaşma doğrulama kodunu 3-5 dəfə qısaldır və onu oxunaqlı edir.
Üçüncü yanaşma — reaktiv RxJava və ya Kotlin Flow istifadə etməklə. Hər bir sahə Observable və ya StateFlow kimi təqdim olunur. Forma doğrulaması bütün sahələrin dəyişikliklərinə abunə olur və hər dəyişiklikdə ümumi vəziyyəti yenidən hesablayır. Bütün sahələr etibarlı olduqda göndərmə düyməsi avtomatik aktivləşir. Bu yanaşma reaktiv proqramlaşdırmanı başa düşməyi tələb edir, lakin ən hamar UX təmin edir.
Qeydiyyat formasını üç sahə ilə nəzərdən keçirək: email, şifrə və şifrənin təsdiqi. Forma doğrulaması daxildir: emailin Patterns.EMAIL_ADDRESS vasitəsilə yoxlanılması, şifrənin minimum 8 simvol uzunluğunda və rəqəm olmasının yoxlanılması, şifrə və təsdiqin uyğunluğunun yoxlanılması. Yalnız hər üç yoxlama keçdikdə formanı göndərmək olar.
data class RegistrationForm(
val email: String,
val password: String,
val confirmPassword: String
)
fun validateRegistration(form: RegistrationForm): ValidationResult {
if (!Patterns.EMAIL_ADDRESS.matcher(form.email).matches())
return ValidationResult(false, "Invalid email address")
if (form.password.length < 8)
return ValidationResult(false, "Password too short")
if (form.password != form.confirmPassword)
return ValidationResult(false, "Passwords do not match")
return ValidationResult(true)
}
Nümunədə validateRegistration formanın data classını qəbul edir və ValidationResult qaytarır. Ən azı bir yoxlama keçməzsə, müvafiq mesajla false qaytarılır. Göndərmə düyməsinin idarə edilməsi Result əsasında qurulur: əgər isValid = true, düymə aktivdir. Real vaxtda vəziyyəti yeniləmək üçün LiveData<ValidationResult> istifadə edə və hər hansı sahə dəyişdikdə düyməni yeniləyə bilərsiniz.
Kotlin Flow ilə reaktiv yanaşma formanın vəziyyətini avtomatik yenidən hesablamağa imkan verir. Hər bir sahə MutableStateFlow<String> kimi təqdim olunur, combine isə onları bir Flow<ValidationResult> birləşdirir. UI-də abunəlik göndərmə düyməsini əl ilə doğrulama çağırmadan yeniləyir. Bu nümunə Google tərəfindən Jetpack Compose və MVVM arxitekturası üçün tövsiyə olunur.
Android Saripaar — Android üçün ən populyar doğrulama kitabxanası. Sahələri və View-ları birbaşa annotasiya etməyə imkan verir: @Email, @NotEmpty, @Password(min = 8, scheme = Password.Scheme.ALPHA_NUMERIC). Doğrulama bir sətirlə validator.validate() callback ilə çağrılır. Saripaar avtomatik olaraq EditText-də setError vasitəsilə səhv təyin edir. Kitabxana spesifik biznes qaydaları üçün fərdi annotasiyaları da dəstəkləyir.
RxBinding + RxJava — ayrıca doğrulama kitabxanası olmadan reaktiv yanaşma. Hər bir sahə dəyişiklikləri RxTextView.textChanges() vasitəsilə yayımlayır. combineLatest operatoru bütün sahələri birləşdirir və ümumi statusu hesablayır. Üstünlük: doğrulama pipeline-ı üzərində tam nəzarət, debounce, throttle, filter əlavə etmək imkanı. Çatışmazlıq: RxJava bilikləri tələb olunur.
Material Design Components — TextInputLayout və TextInputEditText üçün daxili dəstək. Kitabxana doğrulamanın özünü təmin etmir, lakin səhvləri göstərmək üçün UI verir: setError(), setHelperText(), setCounterEnabled(). Doğrulamanın özü üçün hələ də əl ilə məntiq və ya Saripaar lazımdır. Material Components yoxlama üçün deyil, göstərmə üçün cavabdehdir.
Birinci səhv — yalnız müştəri tərəfində doğrulama. Müştəri tərəfində Form Validation UX üçün nəzərdə tutulub, təhlükəsizlik üçün deyil. Təcavüzkar doğrulamanı keçərək birbaşa API-ə sorğu göndərə bilər. Server bütün sahələri təkrar yoxlamalıdır. Müştəri doğrulaması yeganə müdafiə olmamalıdır — bu istifadəçi rahatlığı üçün əlavə qatdır, məlumat təhlükəsizliyi üçün deyil.
İkinci səhv — mesajlar olmadan göndərmə düyməsini bloklamaq. Düymə qeyri-aktivdirsə, istifadəçi hansı sahələri düzəltməli olduğunu görməlidir. İzahsız boz düymə — formaların aşağı konversiyasının ən tez-tez rast gəlinən səbəblərindən biridir. Düymə bloklanmış olsa belə, həmişə sahə səhvlərini onların yanında göstərin. İstifadəçi göndərməyə nəyin mane olduğunu başa düşməlidir.
Üçüncü səhv — çarpaz sahələrə məhəl qoymamaq. Hər bir sahənin ayrıca doğrulanması kifayət deyil. Sahələr bir-birindən asılı ola bilər: şifrə və təsdiq, başlama və bitmə tarixi, ölkə və şəhər. Form Validation bu qarşılıqlı əlaqələri yoxlamalıdır. Yalnız ayrı-ayrı sahələrin yoxlanılması yalançı təhlükəsizlik hissi yaradır — forma uyğunsuz məlumatlarla göndərilə bilər.
| Səhv | Nəticə | Həll |
|---|---|---|
| Yalnız müştəri doğrulaması | Təhlükəsizlik zəifliyi | Məcburi server yoxlaması |
| Mesajlar olmadan düymə | Formanın aşağı konversiyası | Sahə səhvlərini göstərmək |
| Çarpaz yoxlamaların olmaması | Uyğunsuz məlumatlar | Sahə qarşılıqlı əlaqələrinin doğrulanması |
| Çox tez-tez yoxlamalar | İstifadəçinin qıcıqlanması | Debounce və fokus itirildikdə yoxlama |
Tez-tez soruşulan suallar
Sahənin doğrulanması bir dəyəri format və ya uzunluq baxımından yoxlayır. Form Validation bütün sahələri birlikdə yoxlayır, çarpaz yoxlamalar daxil olmaqla: şifrələrin uyğunluğu, sahələrin bir-birindən asılılığı. Sahənin doğrulanması UI qatında, Form Validation isə domain qatında biznes qaydası kimi yerinə yetirilir.
Reaktiv yanaşma istifadə edin: bütün sahələri bir Flow və ya Observable-da birləşdirin və dəyişikliklərə abunə olun. Hər hansı sahə dəyişdikdə formanın ümumi statusunu yenidən hesablayın. Status etibarlıdırsa — düymə aktivdir. Avtomatik yeniləmə üçün Kotlin Flow ilə combine və ya RxJava ilə combineLatest istifadə edin.
Android Saripaar — annotasiyalarla deklarativ doğrulama üçün ən yaxşı seçimdir. Layihə RxJava istifadə edirsə — RxBinding ayrıca kitabxana olmadan reaktiv yanaşma təmin edir. Sadə formalar üçün xarici asılılıqlar olmadan Patterns və TextUtils ilə əl ilə doğrulama kifayətdir.
Mütləq. Müştəri doğrulaması UX-i yaxşılaşdırır, lakin təhlükəsizliyi təmin etmir. Server bütün məlumatları təkrar yoxlamalıdır, çünki API birbaşa əlçatandır. Yanlış və ya zərərli məlumatlardan qorunmaq üçün heç vaxt yalnız müştəri doğrulamasına etibar etməyin.
Jetpack Compose-da hər bir sahənin vəziyyətini saxlamaq üçün Kotlin Flow və ya StateFlow istifadə edin. Doğrulama funksiyası formanın vəziyyətini qəbul edir və ValidationResult qaytarır. Göndərmə düyməsi ümumi statusa abunə olur. Səhvləri göstərmək üçün OutlinedTextField və ya TextField Compose-da isError istifadə edin.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun