Tətbiq inkişafında kopi-paste — bu nədir, nə üçün təhlükəlidir və ondan necə qaçınmaq olar

Müəllif: IT Sectr Dərc olunub: 2026-07-27 Oxuma vaxtı: 10 dəq

Kopi-paste (copy-paste) — bu, kod fraqmentlərinin bir yerdən başqa yerə yeni kontekstə uyğunlaşdırılmadan köçürülməsi təcrübəsidir. Əksər hallarda tərtibatçı mövcud moduldan bir bloku köçürür, minimal düzəlişlər edir və yenisinə yapışdırır — səhvlər, köhnəlmiş şərhlər və lazımsız asılılıqlarla birlikdə. TIOBE Code Quality Survey (2025) araşdırmasına görə, yüksək səviyyədə kopi-paste olan layihələrdə hər min sətir kodda üç dəfə çox defekt olur. Kodun təkrarlanması — texniki borcun əsas mənbəyidir: hər bir surət ayrıca dəstək tələb edir və bir yerdə səhvin düzəldilməsi qalanlarında düzəldiləcəyinə zəmanət vermir.

Əsas məqamlar

  • Kopi-paste — kodu anlamadan və uyğunlaşdırmadan köçürmək, texniki borcun əsas mənbəyi.
  • Kopi-pastenin təhlükəsi: səhvlər layihə boyu yayılır, bir surətdə düzəliş qalanlarını düzəltmir.
  • DRY (Don't Repeat Yourself) — kopi-pastenin qarşısını alan əsas prinsip.
  • Təkrarlamaları aşkarlamaq üçün alətlər: PMD CPD, SonarQube, ESLint təkrarlama qaydaları ilə.
  • Kopi-pastenin refaktorinqi — ümumi kodun funksiya, sinif və ya kitabxanaya ayrılması.

Kopi-paste nədir?

Kopi-paste (copy-paste programming) — mövcud kodun kiçik dəyişikliklərlə və ya dəyişikliksiz yeni yerə köçürülməsidir. Termin mənfi mənada işlədilir: o, tərtibatçının həlli dizayn etmədiyini, əksinə hazır bloku mexaniki şəkildə köçürdüyünü, çox vaxt onun necə işlədiyini tam başa düşmədiyini göstərir.

Kopi-paste iki növ olur: əsaslandırılmış (intentional) və təsadüfi (accidental). Əsaslandırılmış — tərtibatçı qəsdən kodu sonrakı refaktorinq planı ilə köçürdükdə (lakin plan çox vaxt yerinə yetirilmir). Təsadüfi — təkrarlama gözədəyməz yarandıqda, məsələn, iki tərtibatçı müxtəlif ekranlar üçün eyni məntiqi müstəqil yazdıqda.

SonarQube State of Clean Code (2025) hesabatına görə, təkrarlanan kod kommersiya layihələrində ümumi kod həcminin orta hesabla 12–18 faizini təşkil edir. Eyni zamanda, təkrarlanan koddakı səhvin düzəldilməsi xərci vahid tətbiqi olan koddan 2,5 dəfə yüksəkdir, çünki tərtibatçı bütün surətləri tapıb düzəltməlidir.

Kopi-paste ilə mübarizənin əsas aləti DRY (Don't Repeat Yourself) prinsipidir. Lakin DRY-i mütləqləşdirmək də təhlükəlidir: bəzən iki surət bir-birindən asılı olmayaraq inkişaf etməli olduqda köçürmə əsaslandırıla bilər. “Təsadüfi təkrarlamanı” (aradan qaldırılmalı olan) və “zəruri təkrarlamanı” (sənədləşdirilməli olan) fərqləndirmək vacibdir.

Kopi-paste nə üçün təhlükəlidir

Birinci və ən əsas təhlükə — səhvlərin çoxalması. Əgər mənbə kodunda defekt varsa, o, kodla birlikdə bütün yeni yerlərə köçürülür. Defekt aşkarlandıqda və mənbə modulda düzəldildikdə, surətlər düzəldilməmiş qalır. Tərtibatçı səhvin beş fərqli faylda mövcud olduğundan xəbərsiz ola bilər.

İkinci təhlükə — qeyri-bərabər təkamül. Eyni alqoritmin iki surəti zamanla müxtəlif düzəlişlərlə böyüyür. Bir surətdə hədd dəyərlərinin validasiyası əlavə edildi, digərində — çıxış formatı dəyişdirildi. Bir neçə aydan sonra hansı versiyanın “düzgün” olduğunu müəyyən etmək qeyri-mümkün olur və layihə davranış ardıcıllığını itirir.

Üçüncü təhlükə — test həcminin artması. Hər bir kopi-paste öz testlərini tələb edir. Ümumi məntiqi vahid funksiyaya ayırmaq olar, onu bir test dəsti ilə əhatə edib təkrar istifadə etmək olar. Təkrarlama zamanı hər bir surəti ayrıca test etmək lazımdır — bu, CI işləmə müddətini və saxlanılan test bazasının həcmini dəfələrlə artırır.

Dördüncü təhlükə — məhsuldarlıq illüziyası. Kopi-paste sürətin yalançı hissini yaradır: tərtibatçı kodu tez yerləşdirir və ekranın işlədiyini görür. Lakin bu “sürət” texniki borca çevrilir ki, onu təkrarlanan blokda səhv tapıldıqda və ya biznes məntiqində dəyişiklik tələb olunduqda faizlə qaytarmaq lazım gələcək.

Tərtibatçılar niyə kod köçürürlər

Kopi-pastenin səbəblərini anlamaq düzgün profilaktika qurmağa kömək edir. Əksər hallarda tərtibatçılar kodu tənbəllikdən deyil, müddət təzyiqi, bilik çatışmazlığı və ya əlverişsiz arxitektura səbəbindən köçürürlər.

Birinci səbəb — müddətlər. Ekranı iki günə hazırlamaq lazım olduqda və oxşar ekran artıq mövcud olduqda, tərtibatçı onu tamamilə köçürür və yalnız istifadəçinin gördüyünü dəyişir. Ümumi komponenti ayırmaqla refaktorinq etməyə vaxt yoxdur — müştəri nəticə gözləyir. Nəticədə 80 faiz ümumi kodu olan, lakin müstəqil dəyişiklik tarixçəsinə malik ikinci ekran yaranır.

İkinci səbəb — vahid abstraksiyanın olmaması. Layihədə tipik tapşırıq üçün ümumi komponent yoxdursa (məsələn, pull-to-refresh ilə siyahı ekranı), hər bir tərtibatçı öz tətbiqini yazacaq və ya qonşununkini köçürəcək. Layihənin başlanğıcında qəbul edilmiş arxitektura qərarları gələcək kopi-pastenin miqdarına birbaşa təsir göstərir.

Üçüncü səbəb — işləyən kodu sındırmaq qorxusu. Tərtibatçı bilir ki, mövcud modul işləyir. Ümumi kodu ayırmaqla refaktorinq mövcud funksionallığa təsir edə bilər. Test əhatəsi aşağı olarsa, sındırma riski refaktorinqin qəbul edilən faydasını üstələyir və tərtibatçı təhlükəsiz yolu — köçürməyi seçir.

Səbəbləri aradan qaldırın, simptomları deyil. Müddətləri qısaltmaq və code review tətbiq etmək problemi həll etməyəcək, əgər layihədə ümumi arxitektura bazası yoxdursa. Erkən mərhələlərdə təkrar istifadə olunan komponentlərin yaradılmasına vaxt ayırın — bu, gələcəkdə kopi-paste həvəsini azaltmağın yeganə yoludur.

Təkrarlamaları aşkarlamaq üçün alətlər

Kopi-paste axtarışı kod fraqmentlərini müqayisə edən və verilmiş həddən yuxarı uyğunluqları müəyyən edən avtomatik analizatorlar tərəfindən aparılır. Ən yaxşı alətlər AST (abstrakt sintaksis ağacı) səviyyəsində işləyir və formatlaşdırma, dəyişən adları və şərhləri nəzərə almır.

PMD CPD (Copy-Paste Detector) — Java, Kotlin, Swift, JavaScript, Python və C++ üçün ən geniş yayılmış alətdir. CPD mənbə kodunun tokenlərini analiz edir və verilmiş minimal token sayından (standart 100) uzun olan təkrarlamaları tapır. Həddin tənzimlənməsi keyfiyyətli nəticə üçün açardır: çox aşağı hədd çoxlu yanlış uyğunluqlar verir (importlar kimi ümumi nümunələr), çox yüksək — real təkrarlamaları buraxır.

PMD CPD-ni Gradle vasitəsilə işə salmaq

groovy
plugins {
    id 'pmd'
}

pmd {
    toolVersion = '7.0.0'
    ruleSetFiles = files("pmd-rules.xml")
}

tasks.register('cpd') {
    doLast {
        exec {
            workingDir = projectDir
            commandLine 'cpd',
                '--minimum-tokens', '75',
                '--language', 'kotlin',
                '--files', 'src/main/kotlin',
                '--format', 'xml',
                '--failOnViolation', 'true'
        }
    }
}

SonarQube təkrarlama detektorunu birbaşa Quality Gate-ə quraşdırır. Duplicated Blocks (%) qaydası təkrarlanan kodun payını göstərir. 5 faiz həddi kommersiya layihələri üçün sağlam hesab olunur. Həddi aşmaq buraxılış qoluna promosyonu bloklayır. SonarQube əlavə olaraq təkrarlamaları növünə görə qruplaşdırır: dəqiq surətlər (exact match) və struktur surətlər (dəyişdirilmiş adlarla).

JavaScript və TypeScript üçün təkrarlamalar ESLint ilə eslint-plugin-sonarjs (no-duplicate-string qaydası) və 150+ dil dəstəkləyən jscpd vasitəsi ilə aşkarlanır. jscpd monorepozitoriyalar üçün xüsusilə əlverişlidir: o, təkcə bir modul daxilində deyil, paketlər arasında da təkrarlamaları tapır.

Təkrarlanan kodun refaktorinq strategiyaları

Kopi-pastenin refaktorinqi bir prinsipə əsaslanır: ümumini ayırın və fərqləri parametrləşdirin. Konkret üsul təkrarlamanın həcmindən və kontekstdən asılıdır.

Ən sadə hal — bir sinif daxilində təkrarlama (məsələn, eyni məntiqli, lakin fərqli tipli iki metod). Həll — generiklər vasitəsilə ümumiləşdirmək və ya tip parametri olan metodu təkrar istifadə etmək. Əgər təkrarlama bir neçə sinfi əhatə edirsə — ümumi kodu utilit sinifə və ya genişləndirmə funksiyasına ayırın.

Daha mürəkkəb hal — ekranlar və ya modullar səviyyəsində təkrarlama. Burada sadə funksiya ayırması kömək etmir, çünki UI strukturu, həyat dövrü məntiqi və data binding təkrarlanır. Həll — ekranın ümumi baza sinfini və ya kompozit View komponentini yaratmaq, fərqləri parametrlər və ya protokol vasitəsilə ötürmək.

swift
// əvvəl - eyni UITableViewController-ın iki surəti
class UserListController: UITableViewController {
    private let viewModel = UserListViewModel()
    // 40 sətir kod
}

class ProductListController: UITableViewController {
    private let viewModel = ProductListViewModel()
    // User əvəzinə Product ilə eyni 40 sətir
}

// sonra - ümumi baza sinfi paylaşılır
class ListViewController<T: ListViewModel>: UITableViewController {
    let viewModel: T
    // 40 sətir kod - yalnız bir dəfə

    init(viewModel: T) {
        self.viewModel = viewModel
        super.init(style: .plain)
    }
}

Ən mürəkkəb hal — mikroxidmətlər və ya kitabxanalar arasında təkrarlama. Ümumi kodu ayırmaq tsiklik asılılıqlara və ya əsassız birləşməyə səbəb ola bilər. Belə hallarda kopi-paste şüurlu qərar ola bilər: iki komanda müstəqil xidmətləri dəstəkləyir və ümumi kitabxana həll etdiyindən daha çox problem yaradır. Əsas odur ki, belə bir qərarı sənədləşdirin və surətlərin birləşdirmə vaxtı gələnə qədər ayrıldığını mütəmadi yoxlayın.

Komanda səviyyəsində kopi-pastenin qarşısının alınması

Kopi-pastenin profilaktikası artıq təkrarlanan kodun refaktorinqindən daha effektivdir. Əsas profilaktik tədbirlər texnologiyalarda deyil, inkişaf prosesinin təşkilindədir.

Birinci tədbir — təkrarlamaya diqqət yetirən code review. Yoxlama siyahısına belə bir bənd daxil edilməlidir: “Bu PR-də layihədə artıq mövcud olan kod varmı?”. Rəyçi kopi-paste görərsə, ümumi komponent ayrılana qədər birləşməni bloklayır. Bu tələb komandanın Definition of Done sənədində təsbit edilməlidir.

İkinci tədbir — ümumi komponentlər kitabxanası. İki və daha çox ekranda rast gəlinən hər bir UI nümunəsi ümumi modula ayrılmalıdır. Layihədə paylaşılan modul yaradın və onu bütün UI komponentləri üçün məcburi giriş nöqtəsi edin. Komponent yoxdursa — əvvəlcə onu yaradın, sonra ekranda istifadə edin.

Üçüncü tədbir — CI/CD-də avtomatlaşdırma. Boru kəmərinə təkrarlanan kodu yoxlama addımını əlavə edin (PMD CPD, jscpd, SonarQube). Həddi aşma — tikinti xətası. Tərtibatçı kopi-paste payını icazə verilən səviyyədən yuxarı artıran PR-i birləşdirə bilməz. Bu, məsuliyyəti code review-dan avtomatlaşdırmaya keçirir və heç bir təkrarlamanın buraxılmamasına zəmanət verir.

“Bir tətbiq — bir yer” mədəniyyətini tətbiq edin. Təkrar istifadə imkanı görürsünüzsə, refaktorinqi sonraya saxlamayın. “Sonraya” saxlanılan hər bir kopi-paste çoxalır və idarəolunmaz texniki borca çevrilir.

Tez-tez verilən suallar

Kopi-paste həmişə pisdir?

Xeyr, şüurlu təkrarlama ssenariləri var: müstəqil inkişaf etməli olan müxtəlif mikroxidmətlər; silinmə planı ilə eksperiment üçün köçürülmüş kod; müxtəlif API versiyaları üçün şablon DTO-lar. Əsas odur ki, səbəbi sənədləşdirin və refaktorinq üçün yoxlama müddəti təyin edin.

Kopi-paste ilə sağlam təkrar istifadəni necə fərqləndirmək olar?

Kopi-paste — kodun iki hissəsi eyni şeyi edir, lakin ümumi abstraksiyaya malik deyil. Sağlam təkrar istifadə — ümumi kod funksiyaya, sinfə və ya modula ayrılıb və fərqlər parametrləşdirilib. Əgər məntiq dəyişikliyi üç və daha çox yerdə düzəliş tələb edirsə — bu kopi-pastedir.

iOS layihələrində kopi-paste axtaran hansı alətlər var?

PMD CPD Swift və Objective-C dəstəkləyir. Xcode üçün SwiftCop kimi plaginlər və AppCode-da quraşdırılmış təkrarlama detektoru var. SonarQube də Swift layihələrini analiz edir, təkrarlanan blokları birbaşa pull request-də göstərir.

Kopi-paste artıq mövcuddursa, amma refaktorinqə vaxt yoxdursa nə etməli?

Hər bir böyük surətin refaktorinqi üçün texniki tapşırıq yaradın. Prioriteti müəyyənləşdirin: tez-tez dəyişən ekranlar — birinci növbədə, sabit olanlar — ikinci növbədə. Təkrarlanan koda toxunan hər yeni PR-də tədricən konsolidasiya üçün 15–20 faiz vaxt ayırın.

AI alətləri kopi-paste aşkarlamağa kömək edirmi?

Bəli, müasir AI asistentləri (GitHub Copilot, Codeium) konteksti analiz edə və təkrarlanan nümunələr aşkarlandıqda ümumi kodun ayrılmasını təklif edə bilər. Lakin onlar avtomatik analizatorları əvəz etmir — Copilot-u prevensiya üçün, CPD / SonarQube-u isə deteksiya üçün istifadə edin.

Nəticə

  • Kopi-paste — uyğunlaşdırmadan köçürmə yolu ilə kodun təkrarlanması, texniki borcun əsas mənbəyi.
  • Səhvlərin çoxalması: bir surətdə düzəliş qalanlarını düzəltmir, defektlər layihə boyu yayılır.
  • Əsas səbəblər: müddətlər, ümumi abstraksiyanın olmaması, refaktorinq zamanı işləyən kodu sındırmaq qorxusu.
  • Axtarış alətləri: PMD CPD, SonarQube, jscpd, ESLint sonarjs/no-duplicate-string, SwiftCop.
  • Refaktorinq: ümumi kodun funksiyaya, generik sinfə və ya fərqlərin parametrləşdirilməsi ilə ümumi komponentə ayrılması.
  • Profilaktika: təkrarlama yoxlaması ilə code review, ümumi komponentlər kitabxanası, CI-də təkrarlama yoxlaması.
  • Mədəni qayda: bir tətbiq — bir yer. Şüurlu təkrarlamanı sənədləşdirin və müddətləri nəzarətdə saxlayın.

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.

Layihəni müzakirə et

Həm də oxuyun