“Kostıllamaq” və ya “kostılla dəstəkləmək” — problemi müvəqqəti həll etmək, bug-i bağlamaq və ya funksionallıq əlavə etmək, lakin əsas səbəbi aradan qaldırmamaq və layihənin memarlıq standartlarına uyğun gəlməmək deməkdir. Kostıllar istənilən inkişafda qaçılmazdır: son tarixlər, sistemin natamam anlaşılması və xarici məhdudiyyətlər kompromis qərarlar qəbul etməyə məcbur edir. Refactoring Guru-nın məlumatına görə, praqmatik kostılla texniki borc arasındakı əsas fərq — qərarın şüurlu olması və onun aradan qaldırılması planının mövcudluğundadır. Düzgün müvəqqəti həllərdən istifadə intizam və sənədləşdirmə tələb edir.
Əsas məqamlar
Kostıl (crutch) — işləyən, lakin “ələyrisə” hazırlanmış proqram həllidir: konkret problemi bağlayır, lakin onun səbəbini aradan qaldırmır, layihənin memarlığına uyğun gəlmir və ətraf mühitin ən kiçik dəyişikliklərində sına bilər. Metafora dəqiqdir — real kostıl kimi, belə kod “getməyə” kömək edir, lakin “ayağı” müalicə etmir.
Proqramçılar “kostılla dəstəkləyirlər” bug-ları, versiya uyğunsuzluqlarını, platforma xüsusiyyətlərini və təcili müştəri tələblərini. Tipik kostıl — kostıl-şərt: əgər iOS 15, boşluq əlavə et; əgər Huawei — düyməni gizlət. Bu cür yoxlamalar çoxalır və kodu platforma və versiya budaqlarından ibarət “qatlı tort”-a çevirir.
Kostıllar müxtəlif miqyasda olur: bir sətirlik kostıl-şərtdən tutmuş, kitabxananın davranışını “düzəldən” bütöv modula qədər. Anlamaq vacibdir ki, kostıl həmişə pis deyil: düzgün əllərdə bu, məhsulu vaxtında buraxmağa imkan verən bir alətdir. Problem kostıl koddə əbədi qaldıqda başlayır.
Əsas səbəb — ideal həll ilə layihənin real məhdudiyyətləri arasında ziddiyyət. Proqramçı necə düzgün etməyi bilir, lakin vaxt, pul və ya texniki məhdudiyyətlər buna imkan vermir. Nəticədə “sadəcə işləyən” kompromis həll yaranır.
Dörd əsas səbəbi nəzərdən keçirək. Bu səbəbləri anlamaq kostıllara səhv kimi deyil, idarəetmə tələb edən praqmatik alət kimi yanaşmağa kömək edir.
Ən çox yayılmış səbəb. Buraxılış sabahdır, bug yalnız konkret modeldə təkrarlanır, memarlıq düzəlişi iki həftə çəkir. Kostıl-şərt bir saat çəkir və problemi bağlayır. Buraxılışdan sonra komanda qayıdıb düzgün yazmağa söz verir. “Müvəqqətidən daha daimi heç nə yoxdur” — məhz belə kostıllar haqqında.
Kitabxana A Android 12 tələb edir, lakin tətbiqiniz Android 10-u dəstəkləyir. Həll — aralıq təbəqə yazmaq, ƏS versiyasını yoxlayan və icra yolunu seçən. Bu kostıldır, çünki kitabxana yenilənəndə aralıq təbəqəni yenidən yazmaq lazım olacaq. Lakin alternativ — kitabxanadan və ya köhnə cihazların dəstəyindən imtina — daha pis ola bilər.
// API 29 uyğunluğu üçün kostıl
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
useModernApi()
} else {
useLegacyFallback()
}
Layihənin asılı olduğu kitabxana bug ehtiva edir, lakin onun yenilənməsi həftələr çəkə bilər (PR, kod-icmal, nəşr lazımdır). Gözləmək əvəzinə komanda wrapper yazır, kitabxananın davranışını anında yamalayan. Düzəldilmiş kitabxana versiyası çıxdıqdan sonra wrapper silinir. Silinməzsə — bu artıq memarlıq problemidir.
Legacy-layihədə yeni proqramçı kodun niyə belə işlədiyini anlamır. Bunu anlamaq əvəzinə, mövcud kodun üzərinə yeni şərt əlavə edir. Bu ən təhlükəli kostıl növüdür, çünki müəllif bunun kostıl olduğunu dərk etmir. Yeganə dərman — kod-icmal və komandanın yeni üzvləri üçün cütlük proqramlaşdırmadır.
Hər kostıl pis deyil. Real inkişafda mütləq kod təmizliyi əldə edilməz və çox vaxt məqsədəuyğun deyil. Praqmatik yanaşma etiraf edir ki, müvəqqəti həllər prosesin bir hissəsidir, lakin onların şüurlu olmasını, sənədləşdirilməsini və aradan qaldırılmasının planlaşdırılmasını tələb edir. Kostıl biznes tapşırığını təmiz memarlıq həllindən daha sürətli həll etdikdə haqlıdır.
Haqlı kostılın meyarları: konkret problemi bağlayır, sahibi var (kim silinməsinə cavabdehdir) və refaktorinq planı mövcuddur. Üç şərtdən heç olmasa biri yoxdursa — kostıl texniki borca çevrilir. TODO-şərhlər trackerda ticket ilə — sənədləşdirmənin minimal üsuludur.
Buraxılış budağında kritik bug, sabahkı yerləşdirməyə qədər bağlanmalıdır. Təmiz həll memarlıq refaktorinqi tələb edir və iki həftə çəkəcək. Kostıl — nil yoxlaması əlavə etmək və hotfix kimi göndərmək. Haqlılıq şərtləri: trackerda refaktorinq üçün ticket yaradılıb, məsul şəxs təyin edilib, kostıl şərh ilə qeyd olunub. İki həftədən sonra komanda tapşırığa qayıdır.
// TODO: IT-1234 — remove this crutch after AuthService refactoring
guard let userId = session.user?.id else {
return Result.failure(.notAuthenticated)
}
Şüurlu kostıl ilə memarlıq problemi (texniki borc) arasındakı sərhəd iki parametr üzrə keçir: qərarın şüurlu olması və onun aradan qaldırılması planının mövcudluğu. Kostıl həmişə məlum ömür müddəti olan müvəqqəti həlldir. Texniki borc — diqqətsiz qalmış çoxsaylı kostılların nəticəsidir.
| Parametr | Şüurlu kostıl | Texniki borc |
|---|---|---|
| Şüurluluq | Komanda bunun müvəqqəti həll olduğunu bilir | Heç kim kodun niyə belə olduğunu xatırlamır |
| Sənədləşmə | TODO, trackerda ticket var | Şərh, keçid, təsvir yoxdur |
| Aradan qaldırma planı | Refaktorinq üçün sprint təyin edilib | “Nə vaxtsa yenidən yazarıq” |
| Təsir | Yerli, yeni funksionallığa mane olmur | Dəyişiklikləri bloklayır, inkişafı yavaşladır |
Vəziyyət pisləşir, o zaman ki kostılların sayı kritik kütləni keçir. Hər yeni kostıl sistemin “kövrəkliyini” artırır: bir yerdə dəyişiklik digərini sındırır. Nəticədə inkişaf yavaşlayır, bug-lar çoxalır, yeni proqramçı müəllifin köməyi olmadan kodu başa düşə bilmir. Bu anda kostıllar müvəqqəti həll olmaqdan çıxıb memarlıq probleminə çevrilir.
Koddə ƏS versiyası, cihaz istehsalçısı və konkret kitabxananın mövcudluğu üçün beş iç-içə yoxlama varsa — bu kostıl deyil, memarlıq problemidir. Bir düzəlişin əlavə edilməsi qonşu modullarda üç reqressiyaya səbəb olursa — kostıllar lokal olmaqdan çıxıb. Kod-icmal “daha bir kostıla” görə mütəmadi olaraq rədd edilirsə — refaktorinq planlaşdırmaq vaxtıdır.
Kostılların refaktorinqi — müvəqqəti həllərin memarlıq cəhətdən düzgün olanlarla əvəz edilməsi prosesi. Bu vaxt tələb edir, buna görə prioritetləşdirmə strategiyası lazımdır: bütün kostılları dərhal aradan qaldırmaq lazım deyil. Yaxşı strategiya — hər kostılı iki parametr üzrə qiymətləndirmək: kodun bu sahəsində dəyişiklik tezliyi və istifadəçilərə təsir.
Yüksək prioritet — tez-tez dəyişən modullardakı kostıllar (biznes məntiqi, ümumi təyinatlı UI), inkişafı yavaşladan və reqressiyalara səbəb olan. Orta prioritet — nadir dəyişən modullardakı, lakin istifadəçilərə potensial təsiri olan kostıllar (ödəniş emalı, avtorizasiya). Aşağı prioritet — stabil işləyən və dəyişdirilməsi planlaşdırılmayan legacy-koddakı kostıllar.
Addım 1: inventarlaşdırma — kostıllarla əlaqəli bütün TODO və FIXME-ləri tapın. Addım 2: qiymətləndirmə — hansının hələ də aktual olduğunu müəyyən edin. Addım 3: planlaşdırma — yüksək prioritetdən başlayaraq kostılların refaktorinqini sprinta təyin edin. Addım 4: əvəz etmə — təmiz həll tətbiq edin, kostılı və onun TODO-şərhini silin. Addım 5: yoxlama — testlərin keçdiyinə və reqressiyaların olmadığına əmin olun.
# Find all TODO-crutches in the project
grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.kt" --include="*.swift" .
Kostıllarla mübarizənin ən yaxşı yolu onları lazımsız yerə yaratmamaqdır. Kostıl yazmazdan əvvəl özünüzə üç sual verin: ağlabatan vaxtda təmiz həll etmək olarmı? Kostıl olmayan alternativ varmı? Komandanın qayıdıb bunu yenidən yazmağa vaxtı olacaq? Heç olmasa bir suala cavab “xeyr”-dirsə — kodu “dəstəkləməzdən” əvvəl bir daha düşünün.
Tez-tez verilən suallar
Kostıllamaq — problemi bağlayan, lakin səbəbini aradan qaldırmayan müvəqqəti həll yazmaq. Kod işləyir, lakin layihənin memarlığına uyğun gəlmir və dəyişikliklər zamanı sına bilər.
Kostıl — aradan qaldırma planı olan şüurlu müvəqqəti həll. Texniki borc — çoxsaylı unudulmuş kostılların nəticəsi. Kostıl lokal, borc sistematikdir və inkişafı bloklayır.
Son tarix kritik olduqda, təmiz həll vaxt tələb edir və kostıl sənədləşdirilib TODO-şərhi və trackerda ticket ilə. Şərt: kostılın yaxın gələcəkdə silinmə planı var.
TODO və ya FIXME əlavə edin, ticket nömrəsi və düzgün həllin qısa təsviri ilə. Nümunə: // TODO: IT-567 — Factory pattern ilə yenidən yaz. Ticketsiz kostıl unudulacaq.
Bütün TODO-ların inventarlaşdırmasını aparın, prioriteti qiymətləndirin, tez-tez dəyişən modullardan başlayın. Kostılı təmiz həll ilə əvəz edin, şərhi silin və testlərlə yoxlayın.
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