Dastur ishlab chiqishda kopi-paste — bu nima, nima uchun xavfli va undan qanday qochish kerak

Muallif: IT Sectr Nashr etilgan: 2026-07-27 O'qish vaqti: 10 daq

Kopi-paste (copy-paste) — bu kod qismlarini bir joydan ikkinchi joyga yangi kontekstga moslashtirmasdan nusxalash amaliyotidir. Ko'pincha dasturchi mavjud moduldan blokni nusxalaydi, minimal o'zgarishlar kiritadi va yangisiga joylashtiradi — xatolar, eskirgan izohlar va keraksiz bog'liqliklar bilan birga. TIOBE Code Quality Survey (2025) tadqiqotiga ko'ra, yuqori darajadagi kopi-pastega ega loyihalarda har ming qator kodda uch baravar ko'p defekt mavjud. Kodning takrorlanishi — texnik qarzning asosiy manbai: har bir nusxa alohida qo'llab-quvvatlashni talab qiladi va bir joyda xatoni tuzatish qolgan joylarda ham tuzatilishini kafolatlamaydi.

Asosiy fikrlar

  • Kopi-paste — kodni tushunmasdan va moslashtirmasdan nusxalash, texnik qarzning asosiy manbai.
  • Kopi-paste xavfi: xatolar loyiha bo'ylab ko'payadi, bir nusxadagi tuzatish qolganlarini tuzatmaydi.
  • DRY (Don't Repeat Yourself) — kopi-paste paydo bo'lishining oldini oluvchi asosiy tamoyil.
  • Takrorlashlarni topish vositalari: PMD CPD, SonarQube, ESLint takrorlash qoidalari bilan.
  • Kopi-paste refaktoringi — umumiy kodni funksiya, sinf yoki kutubxonaga ajratish.

Kopi-paste nima?

Kopi-paste (copy-paste programming) — mavjud kodni kichik o'zgarishlar bilan yoki o'zgarishsiz yangi joyga ko'chirishdir. Bu atama haqoratli ma'noda ishlatiladi: dasturchi yechimni loyihalashtirmaydi, balki tayyor blokni mexanik ravishda nusxalaydi, ko'pincha uning qanday ishlashini to'liq tushunmaydi.

Kopi-paste ikki xil bo'ladi: asosli (intentional) va tasodifiy (accidental). Asosli — dasturchi ataylab kodni keyingi refaktoring rejasi bilan nusxalaganda (lekin reja ko'pincha bajarilmaydi). Tasodifiy — takrorlanish sezilmasdan paydo bo'lganda, masalan, ikki dasturchi turli ekranlar uchun bir xil mantiqni mustaqil yozganda.

SonarQube State of Clean Code (2025) hisobotiga ko'ra, takrorlanadigan kod tijorat loyihalarida umumiy kod hajmining o'rtacha 12–18 foizini tashkil qiladi. Shu bilan birga, takrorlanadigan koddagi xatoni tuzatish narxi yagona implementatsiyaga ega koddan 2,5 baravar yuqori, chunki dasturchi barcha nusxalarni topib tuzatishi kerak.

Kopi-pastega qarshi kurashning asosiy vositasi DRY (Don't Repeat Yourself) tamoyilidir. Biroq DRYni mutlaqlashtirish ham xavfli: ba'zan ikki nusxa bir-biridan mustaqil rivojlanishi kerak bo'lganda nusxalash asosli bo'lishi mumkin. “Tasodifiy takrorlanish” (bartaraf qilinishi kerak) va “zaruriy takrorlanish” (hujjatlashtirilishi kerak) ni farqlash muhimdir.

Kopi-paste nima uchun xavfli

Birinchi va eng asosiy xavf — xatolarning ko'payishi. Agar manba kodida nuqson bo'lsa, u kod bilan birga barcha yangi joylarga nusxalanadi. Nuqson aniqlanib, manba modulda tuzatilganda, nusxalar tuzatilmagan holda qoladi. Dasturchi xato besh xil faylda mavjudligini bilmasligi ham mumkin.

Ikkinchi xavf — notekis evolyutsiya. Bir algoritmning ikki nusxasi vaqt o'tishi bilan turli o'zgarishlarga ega bo'ladi. Bir nusxada chegara qiymatlarini validatsiya qilish qo'shilgan, ikkinchisida — chiqish formati o'zgartirilgan. Bir necha oydan so'ng qaysi versiya “to'g'ri” ekanligini aniqlash imkonsiz bo'ladi va loyiha xatti-harakatlar izchilligini yo'qotadi.

Uchinchi xavf — test hajmining oshishi. Har bir kopi-paste o'z testlarini talab qiladi. Agar umumiy mantiqni bitta funksiyaga ajratish mumkin bo'lsa, uni bir test to'plami bilan qoplab qayta ishlatish mumkin. Takrorlanishda har bir nusxani alohida test qilish kerak — bu CI ish vaqtini va saqlanadigan test bazasi hajmini bir necha baravar oshiradi.

To'rtinchi xavf — samaradorlik illyuziyasi. Kopi-paste soxta tezlik hissini yaratadi: dasturchi kodni tez joylashtiradi va ekran ishlayotganini ko'radi. Ammo bu “tezlik” texnik qarzga aylanadi, uni takrorlanadigan blokda xato topilganda yoki biznes mantig'ida o'zgarish talab qilinganda foiz bilan qaytarish kerak bo'ladi.

Nega dasturchilar kodni nusxalaydilar

Kopi-paste sabablarini tushunish to'g'ri profilaktika qurishga yordam beradi. Ko'pincha dasturchilar kodni dangasalikdan emas, balki muddat bosimi, bilim yetishmasligi yoki noqulay arxitektura tufayli nusxalaydilar.

Birinchi sabab — muddatlar. Ekranni ikki kunda tayyorlash kerak bo'lganda va shunga o'xshash ekran allaqachon mavjud bo'lsa, dasturchi uni to'liq nusxalaydi va faqat foydalanuvchi ko'rgan narsani o'zgartiradi. Umumiy komponentni ajratish bilan refaktoring qilishga vaqt yo'q — mijoz natija kutadi. Natijada 80 foiz umumiy kodga ega, ammo mustaqil o'zgarishlar tarixiga ega ikkinchi ekran paydo bo'ladi.

Ikkinchi sabab — yagona abstraksiyaning yo'qligi. Agar loyihada odatiy vazifa uchun umumiy komponent bo'lmasa (masalan, pull-to-refresh bilan ro'yxat ekrani), har bir dasturchi o'z implementatsiyasini yozadi yoki qo'shnisinikini nusxalaydi. Loyiha boshida qabul qilingan arxitektura qarorlari kelajakdagi kopi-paste miqdoriga bevosita ta'sir qiladi.

Uchinchi sabab — ishlayotgan kodni buzish qo'rquvi. Dasturchi mavjud modul ishlayotganini biladi. Umumiy kodni ajratish bilan refaktoring mavjud funksionallikka ta'sir qilishi mumkin. Agar test qamrovi past bo'lsa, buzish xavfi refaktoringning qabul qilinadigan foydasidan ustun keladi va dasturchi xavfsiz yo'lni — nusxalashni tanlaydi.

Sabablarni bartaraf qiling, alomatlarni emas. Muddatlarni qisqartirish va code review joriy qilish muammoni hal qilmaydi, agar loyihada umumiy arxitektura bazasi bo'lmasa. Erta bosqichlarda qayta ishlatiladigan komponentlarni yaratishga vaqt ajrating — bu kelajakda kopi-paste vasvasasini kamaytirishning yagona yo'lidir.

Takrorlashlarni aniqlash vositalari

Kopi-paste qidiruvi kod qismlarini solishtiradigan va berilgan chegaradan yuqori mosliklarni aniqlaydigan avtomatik analizatorlar tomonidan amalga oshiriladi. Eng yaxshi vositalar AST (abstrakt sintaksis daraxti) darajasida ishlaydi va formatlash, o'zgaruvchi nomlari va izohlarni e'tiborsiz qoldiradi.

PMD CPD (Copy-Paste Detector) — Java, Kotlin, Swift, JavaScript, Python va C++ uchun eng keng tarqalgan vosita. CPD manba kodining tokenlarini tahlil qiladi va berilgan minimal token sonidan (standart 100) uzunroq takrorlashlarni topadi. Chegarani sozlash sifatli natija uchun kalitdir: juda past chegara ko'plab noto'g'ri mosliklarni beradi (importlar kabi umumiy naqshlar), juda yuqori — haqiqiy takrorlashlarni o'tkazib yuboradi.

PMD CPDni Gradle orqali ishga tushirish

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 takrorlash detektorini to'g'ridan-to'g'ri Quality Gate-ga o'rnatadi. Duplicated Blocks (%) qoidasi takrorlanadigan kod ulushini ko'rsatadi. 5 foiz chegara tijorat loyihalari uchun sog'lom hisoblanadi. Chegaradan oshib ketish reliz tarmog'iga promosyonni bloklaydi. SonarQube qo'shimcha ravishda takrorlashlarni turi bo'yicha guruhlaydi: aniq nusxalar (exact match) va strukturaviy nusxalar (o'zgartirilgan nomlar bilan).

JavaScript va TypeScript uchun takrorlashlar ESLint bilan eslint-plugin-sonarjs (no-duplicate-string qoidasi) va 150+ tilni qo'llab-quvvatlovchi jscpd vositasi orqali qidiriladi. jscpd ayniqsa monorepozitoriyalar uchun qulay: u paketlar o'rtasida takrorlashlarni topadi, faqat bitta modul ichida emas.

Takrorlanadigan kodni refaktoring qilish strategiyalari

Kopi-paste refaktoringi bir tamoyilga asoslanadi: umumiy narsani ajrating va farqlarni parametrlashtiring. Muayyan usul takrorlanish hajmi va kontekstga bog'liq.

Eng oddiy hol — bitta sinf ichida takrorlanish (masalan, bir xil mantiqqa ega, ammo turli tiplarga ega ikkita metod). Yechim — generiklar orqali umumlashtirish yoki tip parametri bilan metoddan qayta foydalanish. Agar takrorlanish bir necha sinfni qamrab olsa — umumiy kodni utilit sinfga yoki kengaytma funksiyasiga ajrating.

Murakkabroq hol — ekranlar yoki modullar darajasida takrorlanish. Bu yerda oddiy funksiya ajratish yordam bermaydi, chunki UI strukturasi, hayotiy tsikl mantig'i va ma'lumotlarni bog'lash takrorlanadi. Yechim — ekranning umumiy bazaviy sinfini yoki kompozit View komponentini yaratish, farqlarni parametrlar yoki protokol orqali uzatish.

swift
// oldin - bir xil UITableViewController ning ikki nusxasi
class UserListController: UITableViewController {
    private let viewModel = UserListViewModel()
    // 40 qator kod
}

class ProductListController: UITableViewController {
    private let viewModel = ProductListViewModel()
    // User o'rniga Product bilan bir xil 40 qator
}

// keyin - umumiy bazaviy sinf ulashildi
class ListViewController<T: ListViewModel>: UITableViewController {
    let viewModel: T
    // 40 qator kod - faqat bir marta

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

Eng murakkab hol — mikroxizmatlar yoki kutubxonalar o'rtasida takrorlanish. Umumiy kodni ajratish tsiklik bog'liqliklarga yoki asossiz birikishga olib kelishi mumkin. Bunday hollarda kopi-paste ongli qaror bo'lishi mumkin: ikki jamoa mustaqil xizmatlarni qo'llab-quvvatlaydi va umumiy kutubxona hal qilganidan ko'ra ko'proq muammo yaratadi. Eng muhimi — bunday qarorni hujjatlashtirish va nusxalar birlashtirish vaqti kelgan darajada ajralib ketganligini muntazam tekshirib turish.

Jamoa darajasida kopi-paste oldini olish

Kopi-paste profilaktikasi allaqachon takrorlanadigan kodni refaktoring qilishdan ko'ra samaraliroqdir. Asosiy profilaktika choralari texnologiyalarda emas, balki rivojlanish jarayonini tashkil etishdadir.

Birinchi chora — takrorlanishga e'tibor qaratadigan code review. Tekshirish ro'yxati quyidagi bandni o'z ichiga olishi kerak: “Bu PRda loyihada allaqachon mavjud bo'lgan kod bormi?”. Agar ko'rib chiqaruvchi kopi-paste ko'rsa, umumiy komponent ajratilgunga qadar birlashtirishni bloklaydi. Bu talab jamoaning Definition of Done hujjatida mustahkamlangan bo'lishi kerak.

Ikkinchi chora — umumiy komponentlar kutubxonasi. Ikki yoki undan ortiq ekranda uchraydigan har bir UI namunasi umumiy modulga ajratilishi kerak. Loyihada umumiy modul yarating va uni barcha UI komponentlari uchun majburiy kirish nuqtasiga aylantiring. Agar komponent mavjud bo'lmasa — avval uni yarating, keyin ekranda foydalaning.

Uchinchi chora — CI/CDda avtomatlashtirish. Quvur liniyasiga takrorlanadigan kodni tekshirish qadamini qo'shing (PMD CPD, jscpd, SonarQube). Chegaradan oshib ketish — qurilish xatosi. Dasturchi kopi-paste ulushini ruxsat etilgan darajadan yuqori ko'taradigan PRni birlashtira olmaydi. Bu mas'uliyatni code reviewdan avtomatlashtirishga o'tkazadi va hech qanday takrorlash o'tkazib yuborilmasligini kafolatlaydi.

“Bitta implementatsiya — bitta joy” madaniyatini joriy qiling. Agar qayta foydalanish imkoniyatini ko'rsangiz, refaktoringni keyinga qoldirmang. “Keyinroqqa” qoldirilgan har bir kopi-paste ko'payadi va boshqarib bo'lmaydigan texnik qarzga aylanadi.

Tez-tez so'raladigan savollar

Kopi-paste har doim yomonmi?

Yo'q, ongli takrorlanish ssenariylari mavjud: mustaqil rivojlanishi kerak bo'lgan turli mikroxizmatlar; o'chirish rejasi bilan eksperiment uchun nusxalangan kod; turli API versiyalari uchun shablon DTOlar. Eng muhimi — sababni hujjatlashtirish va refaktoring uchun tekshirish muddati belgilash.

Kopi-paste bilan sog'lom qayta foydalanishni qanday farqlash mumkin?

Kopi-paste — kodning ikki qismi bir xil ishni bajaradi, lekin umumiy abstraksiyaga ega emas. Sog'lom qayta foydalanish — umumiy kod funksiya, sinf yoki modulga ajratilgan va farqlar parametrlashtirilgan. Agar mantiq o'zgarishi uch yoki undan ko'p joyda tuzatishni talab qilsa — bu kopi-pastedir.

iOS loyihalarida kopi-paste qidiradigan vositalar qanday?

PMD CPD Swift va Objective-C ni qo'llab-quvvatlaydi. Xcode uchun SwiftCop kabi plaginlar va AppCode-da o'rnatilgan takrorlash detektori mavjud. SonarQube ham Swift loyihalarini tahlil qiladi, takrorlanadigan bloklarni to'g'ridan-to'g'ri pull requestda ko'rsatadi.

Agar kopi-paste allaqachon mavjud bo'lsa, ammo refaktoringga vaqt bo'lmasa nima qilish kerak?

Har bir katta nusxaning refaktoringi uchun texnik topshiriq yarating. Prioritetni belgilang: tez-tez o'zgaradigan ekranlar — birinchi navbatda, barqarorlari — ikkinchi navbatda. Takrorlanadigan kodga tegadigan har bir yangi PRda bosqichma-bosqich konsolidatsiya uchun 15–20 foiz vaqt ajrating.

AI vositalari kopi-paste aniqlashga yordam beradimi?

Ha, zamonaviy AI yordamchilari (GitHub Copilot, Codeium) kontekstni tahlil qilib, takrorlanadigan naqshlar aniqlanganda umumiy kodni ajratishni taklif qilishi mumkin. Biroq ular avtomatik analizatorlarni almashtirmaydi — Copilotni prevensiya uchun, CPD / SonarQube ni esa deteksiya uchun foydalaning.

Xulosa

  • Kopi-paste — moslashtirmasdan nusxalash orqali kodni takrorlash, texnik qarzning asosiy manbai.
  • Xatolarning ko'payishi: bir nusxadagi tuzatish qolganlarini tuzatmaydi, nuqsonlar loyiha bo'ylab tarqaladi.
  • Asosiy sabablar: muddatlar, umumiy abstraksiyaning yo'qligi, refaktoringda ishlayotgan kodni buzish qo'rquvi.
  • Qidiruv vositalari: PMD CPD, SonarQube, jscpd, ESLint sonarjs/no-duplicate-string, SwiftCop.
  • Refaktoring: umumiy kodni funksiya, generik sinf yoki farqlarni parametrlashtirish bilan umumiy komponentga ajratish.
  • Profilaktika: takrorlash tekshiruvi bilan code review, umumiy komponentlar kutubxonasi, CI da takrorlash tekshiruvi.
  • Madaniy qoida: bitta implementatsiya — bitta joy. Ongli takrorlashni hujjatlashtirish va muddatlarni nazorat qilish.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing