“Mıxla vurmaq” vę “hardkod etmək” – dəyərləri parametrlərə və ya konfiqurasiyaya çıxarmaq əvəzinə birbaşa proqram kodunda sərt şəkildə təsbit edən jarqon terminlərdir. Hardkod proqramlaşdırmada ən tanınmış anti-nümunələrdən biridir, çünki o kodun çevikliyini və təkrar istifadə olunma qabiliyyətini azaldır. Refactoring Guru-nun məlumatlarına görə, hardkod test etməni, dəstəyi və tətbiqin müxtərif mühitlərə uyğundaşdırılmasını çətinləşdirir. Düşünülmüş şəkildə hardkod əvəzinə konstantlardan istifadə etmək yetkin arxitekturanın əlamətidir.
Başlıca
Hardkod etmək (mıxla vurmaq) – konkret dəyəri proqram koduna elə yerləşdirmək ki, onu dəyişmək üçün mənbə kodunu redaktə etmək və tətbiqi yenidən kompilyasiya etmək lazım olacaq. “Mıxla vurmaq” metaforası mahiyyəti dəqiq əks etdirir: dəyər möhkəm şəkildə təsbit olunub və onu koddan ayırmaq yalnız səylə mümkündür.
Hardkod nümunəsi – funksiyanın gövdəsində birbaşa sətir kimi yazılmış server URL-i. Server başqa ünvana köçərsə, proqramçı koddakı sətri tapmalı, onu dəyişməli, tətbiqi yenidən qurmalı və buraxılışı təqdim etməlidir. Düzgün arxitekturaya malik tətbiqdə belə bir URL konfiqurasiya faylına, ətraf mühit dəyişəninə və ya konfiqurasiya xidmətinə çıxarılardı.
“Mıxla vurmaq” termini daha emosional çalara malikdir: dəyərin möhkəm şəkildə vurulduğunu və sürətli dəyişdirilməsinin mümkün olmadığını vurğulayır. Azərbaycan dilində hər iki ifadə tam sinonim kimi mənfi çalarla işlədilir. Bəzən hardkodu istehza ilə “konstantdan ayrı konstanta çıxarılmış konstant” adlandırırlar.
Hardkod anti-nümunədir, çünki o kodun saxlanıla bilmə, test edilə bilmə və genişləndirilə bilmə prinsiplərini pozur. Dəyərlərin “mıxla vurulduğu” koddakı hər hansı bir mühit, dizayn və ya məntiq dəyişikliyi mənbələrdə əl ilə axtarış və dəyişdirmə tələb edir. Bu, səhv riskini artırır və inkişafı yavaşaldır.
Tipik bir mobil tətbiq nümunəsində hardkodun konkret nəticələrini nəzərdən keçirək. Bütün dümələrin girintisi koddakı rəqəmlə göstərilirsə, resurs vasitəsilə deyil – dizayn dəyişikliyi bütün halların tapılmasını və dəyişdirilməsini tələb edəcək. Endpoint URL-i sərt şəkildə yazılıbsa – mühitlər (dev, stage, prod) arasında keçid etmək yenidən kompilyasiya olmadan mümkün deyil.
| Nəticə | Təsvir | Kritiklik səviyyəsi |
|---|---|---|
| Dəstək çətinliyi | Dəyişiklik bütün kodun axtarılmasını tələb edir | Yüksək |
| Köçürmə səhvləri | Bütün hallar tapılmır və dəyişdirilmir | Yüksək |
| Test etmənin qeyri-mümkünlüyü | Test məlumatlarını əvəz etmək olmur | Orta |
| Lokallaşdırma problemləri | Koddakı mətnlər tərcümə edilmir | Orta |
| Code-review-in çətinləşməsi | Yoxlayan şəxs bütün kontekstləri yadda saxlamalıdır | Aşağı |
Sehrli rəqəmlər və sərt yazılmış sətrlərdən istifadə edən funksiya hardkodun klassik nümunəsidir. Bir aydan sonra müəllif 18, 0.07 və 2.5-in nə demək olduğunu xatırlamayacaq. Bir ildən sonra – komandada heç kəs məntiqi pozmaq qorxusundan bu rəqəmləri dəyişməyə cəsaret etməyəcək. Dəyərləri adlandırılmış konstantlara çıxarmaq kodu özünü sənədləşdirən edir.
// Pis: sehrli rəqəmlər və sətirlər
fun calculatePrice(base: Double): Double {
val tax = base * 0.07
val tip = base * 0.15
val discount = if (base > 100) 10 else 0
return base + tax + tip - discount
}
Hardkod edilmiş verilənlər bazası URL-i yerli in-memory verilənlər bazasında testləri işə salmağa imkan verməyəcək. Proqramçı tam hüquqlu server qaldırmalı və ya test etməzdən əvvəl kodu dəyişməlidir. Konfiqurasiyanı koddan çıxarmaq problemi həll edir: testlər test parametrlərindən, istehsalat – istehsalat parametrlərindən istifadə edir və kod dəyişmir.
Hardkod anti-nümunədir, lakin sərt yazılmış dəyərin nəinki yol verilən, həm də üstünlük verilən olduğu qanuni istisnalar mövcuddur. Sərhəd dəyişkənlik oxu boyunca keçir: əgər dəyər tətbiqin həyat dövüründə heç və ya demək olar ki, heç vaxt dəyişmirsə, onu hardkod etmək olar. Potensial olaraq dəyişə bilərsə – konfiqurasiyaya çıxarın.
Riyazi və fiziki konstantlar – Pi sayı, sərbəst düşmə təcili, saniyədəki millisaniyələrin sayı – hardkod üçün təhlükəsizdir. Onlar təbiət və ya standartlarla müəyyən edilir və dəyişməyəcək. Konstant massivlərin ölçüləri də spesifikasiya ilə müəyyən edilmiş şəkildə sərt təsbit edilə bilər, ancaq rəqəmin mənşəyi barədə şərh ilə.
Saniyədəki millisaniyələrin sayı zaman standartı ilə müəyyən edilmiş sabit konstantdır. Onu konfiqurasiyaya çıxarmağın mənası yoxdur, çünki o heç vaxt dəyişməyəcək. Lakin hətta belə konstantları başa düşülən adla bəyan etmək daha yaxşıdır ki, kod “sehrli rəqəmlər” ehtiva etməsin: 1000 əvəzinə MILLISECONDS_IN_SECOND yazmaq.
// Əsaslandırılmış hardkod: sabit konstantlar
private const val MILLIS_IN_SECOND = 1000
private const val LOGIN_TIMEOUT_SECONDS = 30
fun formatDuration(ms: Long): String {
val seconds = ms / MILLIS_IN_SECOND
return "${seconds} sec."
}
Hardkoddan qaçmağın bir neçə sınaqdan keçmiş üsulu var, hər biri öz dəyər növü üçün uyğundur. Alternativin seçimi dəyərin nə qədər tez-tez dəyişməsindən və onu kimin dəyişməsindən asılıdır: proqramçı, devops və ya son istifadəçi.
Server URL-ləri, API açarları və funksiya flagları üçün JSON, YAML və ya TOML formatlarında konfiqurasiya fayllarından istifadə edin. Android-də bu build.gradle buildConfigField və ya res/values/config.xml ilədir. iOS-da – Info.plist və ya xcconfig. Konfiqlər tətbiqlə birlikdə yığılır, lakin müxtəlif qurma sxemləri üçün fərqli ola bilər.
Sirrlər (tokenlər, şifrələr) və ətraf mühit parametrləri üçün ətraf mühit dəyişənlərindən istifadə edin. Onlar repozitoriya daxil olmur və dev, stage və prod serverlərində fərqli ola bilər. Mobil inkişafda ətraf mühit dəyişənləri tez-tez Xcode qurma sxemləri və ya Gradle-də build flavor-ları vasitəsilə emulyasiya olunur.
Sətrlər, rənglər, ölçülər, şəkillər resurs fayllarına çıxarılmalıdır: Android-də strings.xml, iOS-da Localizable.strings, Flutter-də ARB faylları. Bu lokallaşdırmanı, müxtəlif ekranlara uyğundaşdırmanı və qaranlıq rejimi asanlaşdırır. Resurslarda sətrin dəyişdirilməsi kodun yenidən yazılmasını tələb etmir.
<!-- Android: res/values/strings.xml -->
<resources>
<string name="app_name">MyApp</string>
<string name="api_base_url">https://api.example.com</string>
</resources>
Xidmətlər və təminatçılar üçün Android-də Dagger, Hilt və ya Koin, iOS-da Swinject vasitəsilə Dependency Injection-dan istifadə edin. DI çərçivələri testlər, müxtəlif mühitlər və müxtəlif istifadəçilər üçün implementasiyaları anında dəyişməyə imkan verir. Bu, dəyərin “mıxla vurulmasının” kənardan daxil edilmə ilə əvəz olunduğu ən yüksək abstraksiya səviyyəsidir.
Hardkodun refaktorinqi – sərt yazılmış dəyərləri konfiqurasiyaya və ya resurslara çıxarma prosesidir. Bu, metodik şəkildə yerinə yetirilərsə, refaktorinqin ən təhlükəsiz əməliyyatlarından biridir. Aşağıda təsvir edilmiş ardıcıllıq istənilən dil və platforma üçün uyğundur.
Axtarış IDE (Search in Project) və ya skript vasitəsilə edilə bilər. Sətrləri, URL-ləri, ədədi literalları, ölçüləri, vaxt limitlərini axtarın. Xüsusi diqqət – təkrarlanan dəyərlərə: əgər eyni rəqəm beş yerdə görünürsə, bu konstantaya çıxarma üçün namizəddir. Grep və ya IDEA / Xcode daxili axtarışından istifadə edin.
Hər tapılan dəyər üçün mənalı adı olan konstant yaradın. Konstantları modullara və ya siniflərə görə qruplaşdırın. Ad dəyərin nə demək olduğunu izah etməli, necə istifadə olunduğunu yox: API_TIMEOUT, TIMEOUT_30 yox. Əvəz etdikdən sonra koddakı heç bir rəqəm izahsız qalmamalıdır.
// Əvvəl: sehrli rəqəm 0.4
let cardHeight = screenHeight * 0.4
// Sonra: adlandırılmış konstant
private let cardHeightRatio: CGFloat = 0.4
let cardHeight = screenHeight * cardHeightRatio
Əgər dəyər qurmalar və ya mühitlər arasında dəyişə bilərsə – onu konfiqurasiya faylına və ya tətbiq resurslarına çıxarın. Sətrlər üçün lokallaşdırma fayllarından istifadə edin. URL üçün – build config və ya xcconfig. Ölçülər üçün – resurs faylları (Android-də dimens.xml). Çıxarmadan sonra tətbiqin yığıldığını və düzgün işlədiyini yoxlayın.
Refaktorinqdən sonra konfiqurasiyanın düzgün yükləndiyini və dəyərlərin gözlənilənə uyğun olduğunu yoxlayan test yazın. Gələcəkdə kimsə konfiqi dəyişərsə, test uyğunsuzluğu göstərəcək. Konfiqurasiya testi reqressiyanın qarşısını almaq üçün sürətli və etibarlı bir üsuldur.
Konfiqurasiyaya çıxardıqdan sonra köhnə dəyərin istifadə olunduğu bütün yerlərin vahid mənbəyə istinad etdiyini yoxlayın. Şerh edilmiş kodu və artıq istifadə olunmayan köhnə konstantları silin. Hansı dəyərlərin hara çıxarıldığını təsvir edən mesajla refaktorinqi commit-lə yekunlaşdırın.
Tez-tez verilən suallar
Hardkod etmək – dəyəri konfiqurasiyaya və ya resurslara çıxarmaq əvəzinə birbaşa mənbə kodunda sərt şəkildə yazmaq. Bu kodu daha az çevik və dəstəklənməsi daha çətin edir.
Hardkod tətbiqin davranışını dəyişməyi çətinləşdirir, test etməyə mane olur, təkrarlanma yaradır və köçürmə zamanı səhv riskini artırır. Hardkod edilmiş dəyərin dəyişdirilməsi tətbiqin yenidən yığılmasını və yenidən buraxılmasını tələb edir.
Yol verilən riyazi konstantlar, tətbiqin həyat dövüründə dəyişməyən sabit dəyərlər və müvəqqəti prototiplər üçündür. İstehsalatda hətta konstantları da adlandırılmış dəyişənlərə çıxarmaq daha yaxşıdır.
Axtarış vasitəsilə bütün sehrli rəqəmləri tapın, onları adlandırılmış konstantlarla əvəz edin və ya konfiqurasiya faylına çıxarın. Konfiqurasiyanın yüklənməsini yoxlayan test yazın. Dublikatları silin və dəyişikliklərin təsviri ilə commit edin.
Konstant – koddakı adlandırılmış dəyər, bir yerdə dəyişmək üçün əlçatandır. Hardkod – kod boyu səpələnmiş adsız dəyərlərdir. Yaxşı təcrübə: həmişə mənalı adları olan adlandırılmış konstantlardan istifadə edin.
Nəticələr
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