# Kodun yeniden kullanımı
Yazılım geliştirme (ve genel olarak bilgisayar programlama) bağlamında, kod tekrar kullanımı, ya da yazılım tekrar kullanımı, mevcut yazılım, veya yazılım bilgisinin yeni yazılımlar oluşturmak için kullanılmasıdır, bu süreç yeniden kullanılabilirlik prensiplerine dayanır.
Kod tekrar kullanımı, seçilen programlama dilinin karmaşıklığına bağlı olarak çeşitli yollarla gerçekleştirilebilir ve basit kod kopyalama (örneğin, kod parçaları aracılığıyla) gibi daha düşük seviyeli yaklaşımlardan, basit fonksiyonlar (prosedürler veya alt yordamlar) veya bir dizi nesne veya fonksiyonun modüller (örneğin, kütüphaneler) ya da özel ad alanılar, paketler, çerçeveler veya daha yüksek seviyelerde yazılım paketilerle uzanabilir.
Kod tekrar kullanımı, kod bakımını zorlaştırabilecek bağımlılıklar içerir. En az bir çalışma, kod tekrar kullanımının teknik borçu azalttığını bulmuştur.


## Genel bakış.
Ad hoc kod tekrar kullanımı, programlamanın ilk günlerinden beri uygulanmaktadır. Programcılar her zaman kodun, şablonların, fonksiyonların ve prosedürlerin bölümlerini tekrar kullanmışlardır. Ancak, yazılım tekrar kullanımı, yazılım mühendisliğinde tanınan bir çalışma alanı olarak yalnızca 1968'de Douglas McIlroy'un Bell Laboratuvarları'nda yeniden kullanılabilir bileşenlere dayanan bir yazılım endüstrisi önerdiği zaman ortaya çıkmıştır.
Kod tekrar kullanımı, yazılım ürünü geliştirme sürecinde zaten bir şekilde oluşturulmuş varlıklardan faydalanarak zaman ve kaynak tasarrufu sağlamayı ve aşırılığı azaltmayı hedefler. Tekrar kullanımındaki ana fikir, bir seferde yazılmış olan bilgisayar programı parçalarının, daha sonra yazılacak diğer programların inşasında kullanılabileceği veya kullanılmasının gerektiğidir.
Kod tekrar kullanımı, yeniden kullanılabilir varlıkların ayrı bir şekilde bakımının yapılmasını gerektirebilir. Kod, tekrar kullanmak için en yaygın seçilen kaynak olsa da, geliştirme sürecinde üretilen diğer varlıklar da yeniden kullanım fırsatları sunabilir: yazılım bileşenleri, test setleri, tasarımlar, belgeler vb.
yazılım kütüphanesi, kod tekrar kullanımının iyi bir örneğidir. Programcılar, programlarının belirli kısımlarının tekrar kullanılabilmesi için içsel soyutlamalar oluşturmayı seçebilir veya kendi kullanımına yönelik özel kütüphaneler oluşturabilir. Yazılımın daha kolay yeniden kullanılabilir hale gelmesini sağlayan bazı özellikler şunlardır: modülerlik, gevşek bağlılık, yüksek kohezyon, bilgi gizleme ve endişelerin ayrımı.
Yeni yazılmış bir kodun mevcut bir kod parçasını kullanabilmesi için, bir tür arayüz veya iletişim yöntemi tanımlanmalıdır. Bunlar genellikle bir alt yordam, nesne, sınıf veya prototip kullanımını içerir. Kurumlarda, bu tür uygulamalar alan mühendisliği (diğer adıyla yazılım ürün hattı mühendisliği) tarafından resmîleştirilir ve standart hale getirilir.
Mevcut bir programın önceki versiyonunu bir sonraki versiyon için başlangıç noktası olarak kullanma genel uygulaması da bir kod tekrar kullanım biçimidir.
Sözde kod "tekrar kullanımı", mevcut bir programdan bir kısmını veya tamamını yeni bir programa kopyalamaktan ibarettir. Bu yaklaşım, organizasyonların yeni bir ürün için pazara çıkma süresi avantajları elde etmesini sağlasa da, sonrasında kes ve yapıştır programlama nedeniyle ortaya çıkan birçok aynı kod tekrarı sorunuyla karşılaşabilirler.
Birçok araştırmacı, tekrar kullanımı daha hızlı, daha kolay, daha sistematik ve programlama sürecinin normal bir parçası haline getirmek için çalışmıştır. Bu, nesne yönelimli programlamanın icadının arkasındaki ana hedeflerden biridir ve bu, resmi olarak yeniden kullanımın en yaygın biçimlerinden biri haline gelmiştir. Biraz daha sonra geliştirilen bir başka icat da generic programmingdir.
Bir diğer, daha yeni yöntem, yazılım "üreticileri" kullanmaktır; bu, kullanıcıların seçtiği bir dizi parametreye dayalı olarak belirli bir türde yeni programlar oluşturabilen programlardır. Bu tür sistemler üzerine yapılan çalışmalar ise üretken programlama ve metaprogramlama alanlarıdır.


## Tekrar Kullanım Türleri.
Motivasyon ve etkenler açısından, tekrar kullanım şu şekillerde olabilir:
 - Fırsatçı – Bir projeye başlamak üzere hazırlık yaparken, ekip mevcut bileşenlerin yeniden kullanılabileceğini fark eder.
  - Planlı – Bir ekip, bileşenleri gelecekteki projelerde yeniden kullanılabilecek şekilde stratejik olarak tasarlar.
Tekrar kullanım daha da sınıflandırılabilir:
  - Dahili tekrar kullanım – Bir ekip, kendi bileşenlerini yeniden kullanır. Bu, projenin kritik bir bileşenini kontrol etmek isteyen ekip için bir iş kararı olabilir.
  - Harici tekrar kullanım – Bir ekip, üçüncü taraf bir bileşeni lisanslamayı tercih edebilir. Üçüncü taraf bir bileşeni lisanslamak, genellikle ekibe, dahili olarak geliştirmeye kıyasla %1 ila %20 arasında bir maliyet getirir. Ekip ayrıca bileşeni bulma, öğrenme ve entegre etme süresini de göz önünde bulundurmalıdır.
Tekrar kullanımın formu veya yapısı açısından, kod şu şekillerde olabilir:
  - Referanslı – İstemci kodu, yeniden kullanılan koda bir referans içerir ve bu nedenle ayrı yaşam döngülerine sahip olabilirler ve farklı versiyonlara sahip olabilirler.
  - Fork edilmiş – İstemci kodu, yeniden kullanılan kodun yerel veya özel bir kopyasını içerir ve bu nedenle tek bir yaşam döngüsüne ve tek bir versiyona sahip olurlar.
Fork-edilmiş tekrar kullanımı genellikle teşvik edilmez çünkü bu, kod tekrarının bir biçimidir; bu durumda her hatanın her kopyada düzeltilmesi gerekir ve yeniden kullanılan kodda yapılan iyileştirmelerin her kopyada manuel olarak birleştirilmesi ya da güncel kalmamaları gerekir. Ancak, fork-edilmiş tekrar kullanımın izolasyon, yeniden kullanılan kodu değiştirme esnekliği, daha kolay paketleme, dağıtım ve versiyon yönetimi gibi avantajları olabilir.


## Sistematik.
Sistematik yazılım tekrar kullanımı, verimliliği artırma ve yazılım endüstrisinin kalitesini iyileştirme stratejisidir. Kavram olarak basit olmasına rağmen, başarılı yazılım tekrar kullanımı uygulaması pratikte zordur. Bunun nedeni, yazılım tekrar kullanımının uygulandığı bağlama bağımlılığıdır. Sistematik yazılım tekrar kullanımı ile ilgili ele alınması gereken bazı sorunlar şunlardır:
  - Belirgin ve iyi tanımlanmış bir ürün vizyonu, bir yazılım ürün hattı (SPL) için temel bir gerekliliktir.
  - Evrimsel bir uygulama stratejisi, şirket için daha pragmatik bir strateji olacaktır.
  - Başarıyı sağlamak için sürekli yönetim desteği ve liderliğine ihtiyaç vardır.
  - SPL mühendisliğini destekleyecek uygun bir örgütsel yapı gereklidir.
  - Proje odaklı bir şirketten ürün odaklı bir şirkete geçiş zihniyeti önemlidir.


## Örnekler.
### Yazılım Kütüphaneleri.
Kodun yeniden kullanımı ile ilgili çok yaygın bir örnek, yazılım kütüphanesinin kullanılmasıdır. Bilgiyi farklı tanınmış formatlar arasında dönüştürmek, harici depolama alanına erişmek, dış programlarla arayüz oluşturmak veya bilgileri (sayılar, kelimeler, isimler, yerler, tarihler vb.) yaygın şekillerde manipüle etmek gibi birçok yaygın işlem, farklı programlar tarafından gereklidir. Yeni program yazarları, bu görevleri yerine getirmek için tamamen yeni kod yazmak yerine, bir yazılım kütüphanesindeki kodu kullanabilirler; bu, "tekerleği yeniden icat etmemek" anlamına gelir. Kütüphane uygulamaları genellikle iyi test edilmiştir ve alışılmadık veya karmaşık durumları kapsama avantajına sahiptir. Dezavantajları arasında ise performansı veya istenen çıktıyı etkileyebilecek detayları ayarlama imkânının olmaması ve kütüphanenin edinilmesi, öğrenilmesi ve yapılandırılmasının zaman ve maliyet gerektirmesi yer alır.


### Tasarım Desenleri.
Tasarım deseni, tekrarlayan bir probleme genel bir çözüm sunar. Tasarım desenleri, somut olandan çok daha kavramsaldır ve belirli ihtiyaçlara göre değiştirilebilir. Ancak, belirli desenleri uygulamak için soyut sınıflar ve arayüzler yeniden kullanılabilir.


### Çerçeveler.
Geliştiriciler, genellikle üçüncü taraf uygulamalar ve çerçeveler aracılığıyla büyük yazılım parçalarını yeniden kullanır; ancak çerçeveler genellikle alan bazlıdır ve yalnızca belirli uygulama ailelerine uygulanabilir.


### Yüksek Düzey Fonksiyon.
Fonksiyonel programlamada yüksek düzey fonksiyonlar, tasarım desenleri veya çerçevelerin daha önce kullanıldığı birçok durumda kullanılabilir.


### Retro Hesaplama.
Retro Hesaplama, eski bilgisayarlarda veya bunlar için emülatörlerde çalıştırılan retro programlar nedeniyle kodun yeniden kullanımını kapsar.


### Bilgisayar Güvenliği.
Bilgisayar güvenliği alanında, kod yeniden kullanımı bir yazılım istismar yöntemi olarak kullanılır. Bir saldırgan, örneğin W^X gibi kod enjeksiyonu savunmaları bulunduğunda, bir programın kontrol akışını doğrudan değiştiremediğinde, kontrol akışını bellekte mevcut kod dizilerine yönlendirebilir.
Kod yeniden kullanım saldırılarına örnekler arasında return-to-libc saldırısı, return-oriented programming ve jump-oriented programming yer alır.
Sure! Here's the translation of the provided text into Turkish:


### Bileşenler.
Bir bileşen, nesne yönelimli bir bağlamda, bir dizi işbirlikçi sınıfı (ya da yalnızca bir sınıfı) ve onun arayüzlerini temsil eder. Arayüzler, bileşenlerin değiştirilmesini sağlamakla sorumludur. Yeniden kullanılabilir bileşenler, bileşen kaynak kodu yönetim teknolojileri (CSCM) kullanılarak izole edilebilir ve SCM depoları arasında senkronize edilebilirler.


### Bilgisayar Dışında.
" Kodun yeniden kullanımı" kavramı, yazılımın dışındaki mühendislik uygulamalarını da kapsayabilir. Örneğin, parametrik modelleme bilgisayar destekli tasarımda yeniden kullanılabilir tasarımlar oluşturmayı sağlar. Standartlaştırma, birçok bağlamda yeniden kullanılabilecek, birbirleriyle uyumlu parçaların yaratılmasına yol açar.


## Eleştiri.
Kodun yeniden kullanımı, yeniden kullanılan bileşene bağımlılık yaratır. Rob Pike, "Biraz kopyalama, biraz bağımlılıktan iyidir" görüşündedir. Google'a katıldığında, şirket kodun yeniden kullanımına büyük önem veriyordu. Google'ın kod tabanının, derleme hızı ve sürdürülebilirlik açısından bu eski politikanın sonuçlarından hâlâ etkilendiğine inanmaktadır.
Yeniden kullanılabilir kod genellikle yazılması ve tasarlanması daha fazla çaba gerektirir. Fred Brooks, bu çabanın neden olduğu önemli maliyetin, "Çamur Tuzağı" ve "Gümüş Mermi Yok" adlı denemelerinde tartışmaktadır. Yanılgı, çabanın çoğunlukla, bu maliyetin nasıl geri kazanılacağı mekanizmaları dikkatlice anlaşılmadan harcandığıdır. Gerekçe genellikle, fiziksel bir üretim sürecindeki yeniden kullanılabilir parçalarla yanlış paraleller çizilerek elde edilir. Yanlış, çünkü kod yazmak, bir ürünün tasarımına benzer, çok sayıda birimin üretilmesine değil.