Kopyala yapıştır (copy-paste), kod parçalarını yeni bağlama uyarlamadan bir yerden başka bir yere kopyalama pratiğidir. Çoğu zaman geliştirici, mevcut bir modülden bir blok kopyalar, minimum düzenleme yapar ve yeni bir tanesine yapıştırır — hatalar, eski yorumlar ve gereksiz bağımlılıklarla birlikte. TIOBE Code Quality Survey (2025)'e göre, yüksek düzeyde kopyala yapıştır içeren projeler, birleşik bir soyutlamaya sahip projelere göre bin satır kod başına üç kat daha fazla hata içerir. Kod tekrarı teknik borcun ana kaynağıdır: her kopya ayrı bakım gerektirir ve bir yerdeki hatayı düzeltmek diğerlerinde düzeltileceğini garanti etmez.
Önemli Noktalar
Kopyala yapıştır (kopyala-yapıştır programlama), mevcut kodu az veya hiç değişiklik yapmadan yeni bir yere taşımaktır. Terim aşağılayıcı anlamda kullanılır: geliştiricinin bir çözüm tasarlamadığını, aksine mekanik olarak hazır bir bloğu kopyaladığını, genellikle nasıl çalıştığını tam olarak anlamadığını ima eder.
Kopyala yapıştır iki türde gelir: kasıtlı ve kazara. Kasıtlı — geliştiricinin daha sonra yeniden düzenleme planıyla bilinçli olarak kodu kopyalaması (ancak plan genellikle terk edilir). Kazara — tekrarlamanın fark edilmeden ortaya çıkması, örneğin iki geliştiricinin farklı ekranlar için bağımsız olarak aynı mantığı yazması.
SonarQube State of Clean Code (2025) raporuna göre, ticari projelerde tekrarlanan kod, toplam kod hacminin ortalama yüzde 12-18'ini oluşturur. Aynı zamanda, tekrarlanan koddaki bir hatayı düzeltmenin maliyeti, tek uygulamalı koda göre 2,5 kat daha fazladır çünkü geliştiricinin tüm kopyaları bulması ve düzeltmesi gerekir.
Kopyala yapıştıra karşı ana araç DRY (Don't Repeat Yourself) ilkesidir. Ancak, DRY'yi mutlaklaştırmak da tehlikelidir: bazen iki kopyanın birbirinden bağımsız olarak evrilmesi gerektiğinde kopyalama haklı olabilir. “Kazara tekrarlama” (ortadan kaldırılması gereken) ile “gerekli tekrarlama” (belgelenmesi gereken) arasında ayrım yapmak önemlidir.
İlk ve en kritik tehlike hataların yayılmasıdır. Orijinal kodda bir kusur varsa, kodla birlikte tüm yeni yerlere kopyalanır. Kusur keşfedildiğinde ve orijinal modülde düzeltildiğinde, kopyalar düzeltilmemiş halde kalır. Geliştirici, hatanın beş farklı dosyada bulunduğunu bile bilmeyebilir.
İkinci tehlike eşit olmayan evrimdir. Aynı algoritmanın iki kopyası zamanla farklı değişiklikler biriktirir. Bir kopya sınır değer doğrulaması ekler, diğeri çıktı biçimini değiştirir. Birkaç ay sonra, hangi sürümün “doğru” olduğunu söylemek imkansız hale gelir ve proje davranışsal tutarlılığını kaybeder.
Üçüncü tehlike artmış test hacmidir. Her kopyala yapıştır örneği kendi testlerini gerektirir. Ortak mantık tek bir işleve çıkarılırsa, bir test setiyle kapsanabilir ve yeniden kullanılabilir. Tekrarlamayla, her kopya ayrı ayrı test edilmelidir — bu, CI çalışma süresini ve bakımı yapılacak test tabanının boyutunu katlayarak artırır.
Dördüncü tehlike üretkenlik yanılsamasıdır. Kopyala yapıştır, hız konusunda yanlış bir his yaratır: geliştirici kodu hızla yapıştırır ve ekranın çalıştığını görür. Ancak bu “hız”, tekrarlanan blokta bir hata bulunduğunda veya iş mantığı değişikliği gerektiğinde faiziyle geri ödenmesi gereken teknik borca dönüşür.
Kopyala yapıştırın nedenlerini anlamak, uygun önleme yöntemlerinin oluşturulmasına yardımcı olur. Çoğu zaman, geliştiriciler tembellikten değil, teslim tarihi baskısı, bilgi eksikliği veya elverişsiz mimari nedeniyle kodu kopyalar.
İlk neden teslim tarihleridir. Bir ekranın iki günde yapılması gerektiğinde ve benzer bir ekran zaten mevcutsa, geliştirici onu tamamen kopyalar ve yalnızca kullanıcının gördüklerini değiştirir. Ortak bir bileşeni çıkarmak için yeniden düzenlemeye zaman yoktur — müşteri sonuç ister. Sonuç olarak, yüzde 80 ortak koda sahip ancak bağımsız bir değişiklik geçmişi olan ikinci bir ekran ortaya çıkar.
İkinci neden birleşik bir soyutlamanın olmamasıdır. Projede tipik bir görev için (örneğin, yenilemek için çekmeli liste ekranı) ortak bir bileşen yoksa, her geliştirici kendi uygulamasını yazacak veya yanındakinin uygulamasını kopyalayacaktır. Projenin başında alınan mimari kararlar, gelecekteki kopyala yapıştır miktarını doğrudan etkiler.
Üçüncü neden çalışan kodu bozma korkusudur. Geliştirici, mevcut modülün çalıştığını bilir. Ortak kodu çıkarmak için yeniden düzenleme, mevcut işlevselliği etkileyebilir. Test kapsamı düşükse, bozulma riski yeniden düzenlemenin algılanan faydasından daha ağır basar ve geliştirici güvenli yolu seçer — kopyalamak.
Semptomları değil, nedenleri ele alın. Proje sağlam bir mimari temele sahip değilse, teslim tarihlerini kısaltmak ve kod incelemesi başlatmak sorunu çözmez. Erken aşamalarda yeniden kullanılabilir bileşenler oluşturmaya zaman ayırın — gelecekte kopyala yapıştır cazibesini azaltmanın tek yolu budur.
Kopyala yapıştır tespiti, kod parçalarını karşılaştıran ve belirli bir eşiğin üzerindeki eşleşmeleri tanımlayan otomatik analizörler tarafından gerçekleştirilir. En iyi araçlar, AST (Soyut Sözdizimi Ağacı) düzeyinde çalışır ve biçimlendirmeyi, değişken adlarını ve yorumları yok sayar.
PMD CPD (Copy-Paste Detector), Java, Kotlin, Swift, JavaScript, Python ve C++ için en yaygın araçtır. CPD, kaynak kod belirteçlerini analiz eder ve belirtilen minimum belirteç sayısından (varsayılan 100) daha uzun tekrarları bulur. Eşiği yapılandırmak, kaliteli sonuçlar için anahtardır: çok düşük eşik çok sayıda yanlış pozitif (içe aktarmalar gibi yaygın desenler) üretir, çok yüksek eşik gerçek tekrarları kaçırır.
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, doğrudan Quality Gate'e bir tekrar algılayıcı yerleştirir. Duplicated Blocks (%) kuralı, tekrarlanan kodun yüzdesini gösterir. Ticari projeler için yüzde 5 eşiği sağlıklı kabul edilir. Bunun aşılması, sürüm dalına yükseltmeyi engeller. SonarQube ayrıca tekrarları türe göre gruplandırır: tam eşleşmeler ve yapısal kopyalar (yeniden adlandırılmış tanımlayıcılarla).
JavaScript ve TypeScript için tekrarlar, ESLint'in eslint-plugin-sonarjs eklentisi (no-duplicate-string kuralı) ve jscpd yardımcı programı kullanılarak tespit edilir. jscpd, 150'den fazla dili destekler. jscpd özellikle monorepo'lar için kullanışlıdır: yalnızca tek bir modül içinde değil, paketler arasında da tekrarlar bulur.
Kopyala yapıştır yeniden düzenlemesi tek bir ilkeye indirgenir: ortak kısmı çıkarmak ve farklılıkları parametrelendirmek. Belirli teknik, tekrarlamanın kapsamına ve bağlama bağlıdır.
En basit durum tek bir sınıf içindeki tekrarlamadır (örneğin, aynı mantığa ancak farklı türlere sahip iki yöntem). Çözüm, jeneriklerle genelleme yapmak veya bir tür parametresi olan bir yöntemi yeniden kullanmaktır. Tekrarlama birden çok sınıfa yayılıyorsa — ortak kodu bir yardımcı sınıfa veya genişletme işlevine çıkarın.
Daha karmaşık bir durum ekran veya modül düzeyinde tekrarlamadır. Burada, yalnızca bir işlevi çıkarmak yardımcı olmaz çünkü kullanıcı arayüzü yapısı, yaşam döngüsü mantığı ve veri bağlama tamamen tekrarlanmıştır. Çözüm, ortak bir temel ekran sınıfı veya birleşik bir Görünüm bileşeni oluşturmak ve farklılıkları parametreler veya bir protokol aracılığıyla iletmektir.
// before - two copies of the same UITableViewController
class UserListController: UITableViewController {
private let viewModel = UserListViewModel()
// 40 lines of code
}
class ProductListController: UITableViewController {
private let viewModel = ProductListViewModel()
// same 40 lines but with Product instead of User
}
// after - generic base class shared
class ListViewController<T: ListViewModel>: UITableViewController {
let viewModel: T
// 40 lines of code - once only
init(viewModel: T) {
self.viewModel = viewModel
super.init(style: .plain)
}
}
En karmaşık durum mikro hizmetler veya kütüphaneler arasındaki tekrarlamadır. Paylaşılan kodu çıkarmak, döngüsel bağımlılıklara veya haksız bağlantıya yol açabilir. Bu gibi durumlarda, kopyala yapıştır bilinçli bir karar olabilir: iki ekip bağımsız hizmetleri sürdürür ve paylaşılan bir kütüphane çözdüğünden daha fazla sorun yaratır. Anahtar, böyle bir kararı belgelemek ve kopyaların birleştirmeyi haklı çıkaracak kadar ayrışıp ayrışmadığını düzenli olarak kontrol etmektir.
Kopyala yapıştırı önlemek, zaten tekrarlanmış kodu yeniden düzenlemekten daha etkilidir. Ana önleyici tedbirler teknolojide değil, geliştirme sürecinin organizasyonunda yatar.
İlk önlem tekrarlamaya odaklanan kod incelemesidir. İnceleme kontrol listesi şu maddeyi içermelidir: “Bu PR, projede zaten var olan kodu içeriyor mu?” İncelemeci kopyala yapıştır görürse — ortak bileşen çıkarılana kadar birleştirmeyi engeller. Bu gereksinim, ekibin Tanımlanmış Bitmiş Kriterleri'nin bir parçası olmalıdır.
İkinci önlem paylaşılan bir bileşen kütüphanesidir. İki veya daha fazla ekranda görünen her kullanıcı arayüzü deseni, ortak bir modüle çıkarılmalıdır. Projede paylaşılan bir modül oluşturun ve bunu tüm kullanıcı arayüzü bileşenleri için zorunlu giriş noktası yapın. Bir bileşen yoksa — önce oluşturulur, ardından ekranda kullanılır.
Üçüncü önlem CI/CD'de otomasyondur. Boru hattına bir tekrarlanan kod kontrol adımı (PMD CPD, jscpd, SonarQube) ekleyin. Eşiğin aşılması, derleme hatasına neden olur. Geliştirici, kopyala yapıştır oranını izin verilen seviyenin üzerine çıkaran bir PR'ı birleştiremez. Bu, sorumluluğu kod incelemesinden otomasyona kaydırır ve hiçbir tekrarın gözden kaçmamasını sağlar.
“Bir uygulama — bir yer” kültürünü teşvik edin. Yeniden kullanım fırsatı görürseniz — yeniden düzenlemeyi sonraya bırakmayın. “Sonra” bırakılan her kopyala yapıştır çoğalır ve kontrol edilemeyen teknik borca dönüşür.
Sıkça Sorulan Sorular
Hayır, bilinçli tekrarlama senaryoları vardır: bağımsız olarak evrilmesi gereken farklı mikro hizmetler; silme planı olan bir deney için kopyalanmış kod; farklı API sürümleri için şablon DTO'lar. Önemli olan nedeni belgelemek ve yeniden düzenleme için bir kontrol süresi belirlemektir.
Kopyala yapıştır, kodun iki parçasının aynı şeyi yapması ancak ortak bir soyutlamaya sahip olmamasıdır. Sağlıklı yeniden kullanım, ortak kodun bir işleve, sınıfa veya modüle çıkarılması ve farklılıkların parametrelendirilmesidir. Mantığı değiştirmek üç veya daha fazla yerde düzenleme gerektiriyorsa — bu kopyala yapıştırdır.
PMD CPD, Swift ve Objective-C'yi destekler. Xcode için SwiftCop gibi eklentiler ve AppCode'da yerleşik bir tekrar algılayıcı bulunur. SonarQube ayrıca Swift projelerini analiz eder ve tekrarlanan blokları doğrudan çekme isteklerinde gösterir.
Her büyük kopya için yeniden düzenleme teknik bileti oluşturun. Öncelikleri belirleyin: sık değişen ekranlar önce, kararlı olanlar sonra. Tekrarlanan koda dokunan her yeni PR için aşamalı birleştirme için yüzde 15-20 zaman ayırın.
Evet, modern yapay zeka asistanları (GitHub Copilot, Codeium) bağlamı analiz edebilir ve yinelenen desenler tespit ettiğinde paylaşılan kodu çıkarmayı önerebilir. Ancak, otomatik analizörlerin yerini almazlar — Copilot'u önleme için, CPD / SonarQube'u ise tespit için kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun