Her yazılım projesinde er ya da geç kullanım dışı kalmış kodlar, güncelliğini yitirmiş, kullanımı önerilmeyen veya kaldırılması planlanan bileşenlerle karşılaşılır. @deprecated Java'da ek açıklama (annotation), DeprecationWarning Python'da, IDE'nizin otomatik tamamlama özelliğindeki üstü çizili metin gibi tüm bunlar, kullandığınız veya sürdürdüğünüz bir şeyin artık geçerliliğini yitirdiğine dair kod tabanından gelen sinyallerdir. Bu sinyalleri görmezden gelmek, bir bağımlılık kaldırılana, bir güvenlik yaması eski bir API'yi atlayana veya bir çerçeve yükseltmesi, üç ana sürüm önce kullanımdan kaldırılan şeye hala dayanan her şeyi bozana kadar sessizce risk biriktirir.
Kullanımdan kaldırılmış (deprecated) kavramının ne anlama geldiğini, neden önemli olduğunu ve sistematik olarak nasıl ele alınacağını anlamak, bir geliştirme ekibinin geliştirebileceği en pratik bakım becerilerinden biridir. Bu kılavuz, konunun tamamını ele almaktadır: net tanımlar, benzer terimlerle karşılaştırma, diller arası kullanımdan kaldırma uyarıları ve kullanımdan kaldırılmış bağımlılıkların üretim olaylarına dönüşmeden önce yönetilmesine yönelik yapılandırılmış bir yaklaşım.
Üretimde Kullanımdan Kaldırılan Özellikleri Keşfetmeyi Bırakın
SMART TS XL Yüzeyler, olay haline gelmeden önce kullanım dışı bırakılmış bileşenleri gösterir.
Daha fazla bilgiKullanımdan Kaldırılmış Kod Nedir?
Kullanımdan kaldırılmış kod, hâlâ işlevsel olan ancak resmi olarak kullanımı önerilmeyen fonksiyonları, metotları, API'leri, kütüphaneleri veya tüm bileşenleri ifade eder. Kod çalışmaya devam eder, derlenir, yürütülür ve sonuç üretir, ancak bakımını üstlenenler gelecekteki bir sürümde kaldırılacağını, daha iyi bir alternatifle değiştirileceğini veya basitçe artık bakımının yapılmayacağını veya güncellenmeyeceğini belirtmiştir. Kullanımdan kaldırılmış kodu kullanmak, sorumlularının artık önemsemediği bir şeye güvenmek anlamına gelir.
Kullanımdan kaldırma (deprecation), teknik bir durum değil, bir iletişim mekanizmasıdır. Bir kütüphane yöneticisi bir fonksiyonu kullanımdan kaldırılmış olarak işaretlediğinde, şunu söylüyor: "Bu fonksiyon bugün hala çalışıyor, ancak onu kaldırmayı planlıyoruz ve bu gerçekleşmeden önce ondan uzaklaşmalısınız." Kullanımdan kaldırma bildirimi ile gerçek kaldırma arasındaki süre değişebilir; bir ana sürüm veya beş yıl olabilir, ancak yön her zaman aynıdır. Kullanımdan kaldırılmış demek, sonunda kaldırılacak demektir.
"Deprecated" ve "Depreciated": Yazım Karmaşası
Bu iki kelime sıklıkla karıştırılır ve yazım denetleyicileri de yardımcı olmaz çünkü ikisi de farklı anlamlara sahip gerçek İngilizce kelimelerdir.
Kullanımdan kaldırılmış (yazılımda): güncelliğini yitirmiş, tavsiye edilmeyen, kaldırılması planlanan olarak işaretlenmiş. Yazılım bağlamlarında doğru terim.
Amortisman (muhasebede): Zamanla değerinin azalması. Örneğin, "sunucu donanımı üç yıl içinde değer kaybetti."
Teknik bir belgede "depreciated code" ifadesini görürseniz, bu neredeyse her zaman "deprecated code" anlamına gelir; yazar yazılım terimini kastederken muhasebe terimini kullanmıştır. Bu hata o kadar yaygındır ki, bu makalenin Arama Konsolu verilerinde bile yer almaktadır. Yazılımda her zaman " deprecated" terimini kullanın.
Kullanımdan kaldırılmış, eski, miras niteliğinde veya ölü kod
Bu terimler birbiriyle ilişkili olsa da, kodun farklı durumlarını tanımlar. Bunları karıştırmak, kesin olmayan konuşmalara ve yanlış önceliklendirme kararlarına yol açar.
| Dönem | Ne demek | Kaldırıldı mı? | Bakımı yapılıyor mu? | Risk seviyesi |
|---|---|---|---|---|
| Onaylanmamış | Resmi olarak tavsiye edilmemektedir, gelecekte kaldırılmak üzere işaretlenmiştir. | Hayır, hala mevcut. | Hayır, bakım çalışmaları durduruldu. | Orta, zamanla büyüyor |
| Eski | Artık geçerli veya uygulanabilir değil; yerini yenisine bırakmış. | Bazen | Yok hayır | Orta Yüksek |
| miras | Hâlâ çalışan ve muhtemelen hâlâ üretimde olan eski kodlar. | Hayır, hala aktif. | Nadiren | Değişken, değişim oranına bağlıdır. |
| Ölü kod | İnfaz sırasında hiçbir zaman aranmadı veya ulaşılamadı. | Hayır, hala kaynakta. | Yok, asla çalışmaz | Düşük-Orta, göç/denetim riski |
| Eski kod | Uzun zamandır dokunulmamış ancak resmi olarak kullanımdan kaldırılmamış kod. | Yok hayır | belirsiz | Medium, varsayımları gizleyebilir. |
Kullanımdan kaldırılmış vs. eskimiş"Kullanımdan kaldırıldı" ifadesi resmi bir tanımlamadır, birisi bunu açıkça belirtmiştir. @deprecated veya bir kullanımdan kaldırma bildirimi yayınlanmıştır. Eskimiş, daha gevşek bir tanımlamadır; kod hala çalışıyor olabilir ancak modern alternatifler göz önüne alındığında artık makul bir kullanım alanı kalmamıştır. Tüm kullanımdan kaldırılmış kodlar sonunda eskimiş hale gelir, ancak tüm eskimiş kodlar resmi olarak kullanımdan kaldırılmamıştır.
Kullanımdan kaldırılmış ve kaldırılmış kod : Kullanımdan kaldırılmış kod hala kod tabanında mevcuttur. Kaldırılmış kod ise tamamen yok olmuştur. Kullanımdan kaldırma süresi, iki durum arasındaki zaman dilimidir; kodunuzun bozulmadan önce geçiş yapmanız gereken süredir.
Kullanımdan kaldırılmış kod ile eski kod arasındaki fark : Eski kod, genellikle hala aktif olarak kullanılan ve bakımı yapılan, daha önceki bir teknolojik dönemde yazılmış eski üretim kodudur. Kullanımdan kaldırılmış kod ise özellikle kaldırılmak üzere işaretlenmiştir. Günlük işlemleri işleyen eski COBOL programları kullanımdan kaldırılmış değildir, eski koddur ancak aktif olarak bakımı yapılır. Kütüphane sağlayıcısı tarafından kullanımdan kaldırılmış olarak işaretlenen bir COBOL API fonksiyonu kullanımdan kaldırılmıştır.
Kullanımdan kaldırma (Deprecate) ve devre dışı bırakma (Decommission) arasındaki fark : Kullanımdan kaldırma, bir kod tabanı veya kütüphane içindeki teknik bir sinyaldir. Devre dışı bırakma ise operasyonel bir karardır; bir hizmetin kapatılması, altyapının kaldırılması, bir ürün için desteğin sonlandırılması anlamına gelir. Kullanımdan kaldırılmış bir API yıllarca çalışmaya devam edebilir; devre dışı bırakılmış bir API ise belirli bir tarihte kapatılır.
Kullanımdan Kaldırılmış İçerik Nasıl Görünür: Diller Arasında Uyarılar
Kullanımdan kaldırılma uyarıları, kullanılan dile ve araçlara bağlı olarak farklı biçimlerde ortaya çıkar. Bunları görür görmez tanımak, onlarla başa çıkmanın ilk adımıdır.
Python: Kullanımdan Kaldırılma Uyarısı
piton
import warnings
# Marking a function as deprecated
def old_function():
warnings.warn(
"old_function is deprecated, use new_function instead",
DeprecationWarning,
stacklevel=2
)
# original implementation
def new_function():
# improved implementation
pass
Python, kullanım dışı bırakılan sürümlerle ilgili uyarıları çalışma zamanında gösterir. Yaygın derleyici mesajı şöyledir:
DeprecationWarning: old_function is deprecated, use new_function instead
Veya üçüncü taraf paketler için:
DeprecationWarning: pkg_resources is deprecated as an API.
Use importlib.resources or importlib.metadata instead.
Java: @Deprecated Ek Açıklaması
Java
public class LegacyProcessor {
@Deprecated
public void processData(String input) {
// old implementation
}
// Replacement method
public void processDataV2(String input, ProcessOptions options) {
// new implementation
}
}
Java derleyicisi şunları üretir:
Note: SomeFile.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
JavaScript/TypeScript: JSDoc @kullanımdan kaldırıldı
javascript
/**
* @deprecated Use fetchUserById() instead.
* This function will be removed in version 4.0.
*/
function getUser(id) {
// old implementation
}
// Modern replacement
async function fetchUserById(id) {
// new implementation
}
daktilo ile yazılmış yazı
class ApiClient {
/** @deprecated Use post() with typed options instead */
sendRequest(url: string): Promise<any> {
// deprecated implementation
}
}
IDE'ler görüntüler getUser Çağrıldığı her yerde üstü çizili olarak ve TypeScript'in @typescript-eslint/no-deprecated Bu kural, CI'da bunu işaretliyor.
C++: [[kullanımdan kaldırıldı]] Öznitelik
cpp
// C++14 and later
[[deprecated("Use processV2() instead")]]
void process(int value) {
// old implementation
}
void processV2(int value, ProcessFlags flags = ProcessFlags::Default) {
// new implementation
}
Derleyiciler şunları üretir:
warning: 'process' is deprecated: Use processV2() instead [-Wdeprecated-declarations]
Swift: @available with deprecated
hızlı
@available(*, deprecated, renamed: "fetchUser(withID:)")
func getUser(id: String) -> User {
// old implementation
}
func fetchUser(withID id: String) -> User {
// replacement
}
Kotlin/Java: @Deprecated, ReplaceWith ile birlikte kullanılıyor.
KOTLIN
@Deprecated(
message = "Use processItems() instead",
replaceWith = ReplaceWith("processItems(items)"),
level = DeprecationLevel.WARNING
)
fun handleItems(items: List<Item>) {
// deprecated
}
fun processItems(items: List<Item>) {
// replacement
}
Kullanımdan kaldırılmış kod neden gerçek sorunlara yol açar?
Kullanımdan kaldırılmış kod yalnızca bir bakım sorunu değildir. Dört boyutta somut ve artan riskler yaratır:
Güvenlik açıkları. Kullanımdan kaldırılmış API'ler ve kütüphaneler artık güvenlik yamaları almıyor. Yamalanmamış bir CVE'ye sahip kullanımdan kaldırılmış bir kütüphane, kalıcı bir güvenlik açığını temsil eder; geliştiriciler herkesin başka bir kütüphaneye geçmesini istedikleri için düzeltmeyi durdurmuşlardır. Kullanımdan kaldırılmış bileşenleri kullanan kuruluşlar, bilerek güvenlik açığı olan kodları kullanmaktadır.
Yükseltmelerde bağımlılık kopması. Kullanımdan kaldırma bildirimi özellikle kaldırma işleminin yakında gerçekleşeceği için mevcuttur. Ana sürüm yükseltmesi geldiğinde ve kullanımdan kaldırılmış API'yi kaldırdığında, ona hala bağımlı olan her sistem aynı anda, en kötü anda, rutin olması gereken bir yükseltme sırasında bozulur.
Bakım karmaşıklığı artar. Kullanımdan kaldırılmış kod, geliştiricilerin aynı anda iki zihinsel modeli birden kavramasını gerektirir: eski kodun ne yaptığı ve yeni eşdeğerinin ne yaptığı. Her yeni ekip üyesi, kod tabanının hangi bölümlerinden kaçınılması gerektiğini ve nedenini öğrenmelidir. Bu çift yönlü karmaşıklık, her ek kullanımdan kaldırılmış bileşenle birlikte artar.
Teknik borç katlanarak artıyor. Her kullanımdan kaldırılmış bağımlılık, bir teknik borç birimidir. Diğer borçlardan farklı olarak, kullanımdan kaldırılmış kod borcunun bir son tarihi vardır; kullanımdan kaldırılmış bileşen gerçekten kaldırıldığı anda "uyarı" durumundan "bozuk" durumuna geçer.
Yazılım Projesinde Kullanımdan Kaldırılmış Bağımlılıklarla Nasıl Başa Çıkılır?
Adım 1: Tüm Amortisman Giderlerini Kaydedin
Eski bileşenleri tek tek keşfetmek yerine sistematik bir tarama yapın. Çoğu araç, tüm envanteri ortaya çıkarmak için yöntemler sunar:
darbe
# Python: find all DeprecationWarning instances
python -W error::DeprecationWarning -m pytest
# JavaScript/Node.js: run with deprecation tracing
node --trace-deprecation app.js
# Java: compile with full deprecation details
javac -Xlint:deprecation *.java
# npm: find deprecated packages
npm outdated
npm audit
Adım 2: Risk Düzeyine Göre Sınıflandırma
Her kullanım dışı bırakma durumu acil müdahale gerektirmez. Her birini sınıflandırın:
| Öncelik | Kriterler | Action |
|---|---|---|
| Kritik | Kullanımdan kaldırılmış güvenlik açısından kritik kütüphane; bilinen bir CVE açığı; bir sonraki büyük sürümde kaldırılacak. | Hemen göç edin |
| Yüksek | Mevcut ana sürümde kullanımdan kaldırılmıştır; CI'da aktif uyarılar mevcuttur. | Mevcut veya sonraki sprint için planlama |
| Orta | Kullanımdan kaldırılmış olsa da 2+ ana sürüm için hala desteklenmektedir; güvenlik riski yoktur. | Zaman çizelgesiyle yapılacaklar listesine ekle |
| Düşük | Düşük değişim oranına sahip dahili kodda kullanımdan kaldırılmış açıklama | İlgili yeniden yapılandırma sırasında izleme ve adresleme. |
3. Adım: Geçiş Yapmadan Önce Tüm Kullanım Alanlarını Bulun
Kullanımdan kaldırılmış bir bileşeni değiştirmeden önce, kullanıldığı her yeri belirleyin. Eksiksiz bir harita olmadan değiştirmek, sessizce bozulmaya yol açabilecek kullanımları gözden kaçırma riskini taşır:
piton
# Using grep for basic search
grep -r "old_function" src/
# Using ast-grep for code-aware search (TypeScript/JS)
ast-grep --pattern 'getUser($ID)' --lang ts
# Using ripgrep with file type filtering
rg "deprecated_method" --type java
Büyük kod tabanları için, otomatik statik analiz araçları, özellikle dinamik dağıtım veya kalıtım yoluyla dolaylı kullanımlar söz konusu olduğunda, manuel grep'e göre daha doğru bir şekilde eksiksiz bir çapraz referans haritası oluşturur.
4. Adım: Sistematik Olarak Geçiş Yapın
Kullanımdan kaldırılmış ifadeleri tek tek değiştirin ve bir sonrakine geçmeden önce her birini doğrulayın:
piton
# Before: deprecated
import imp
module = imp.load_source('mymodule', '/path/to/mymodule.py')
# After: replacement
import importlib.util
spec = importlib.util.spec_from_file_location('mymodule', '/path/to/mymodule.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
javascript
// Before: deprecated event property
document.addEventListener('keydown', (event) => {
const key = event.keyCode; // deprecated
});
// After: modern replacement
document.addEventListener('keydown', (event) => {
const key = event.key; // current standard
});
Adım 5: CI/CD'ye Kullanımdan Kaldırma Kontrolleri Ekleyin
Temizleme işleminden sonra, kullanım dışı bırakılmış yeni kullanımların kod tabanına girmesini engelleyin:
tatlım
# .github/workflows/deprecation-check.yml
- name: Check for deprecated API usage (Java)
run: javac -Xlint:deprecation -Werror src/**/*.java
- name: Check for deprecated packages (Node)
run: npm audit --audit-level=moderate
- name: ESLint no-deprecated rule (TypeScript)
run: npx eslint --rule '{"@typescript-eslint/no-deprecated": "error"}' src/
Amortisman Politikası Oluşturma
Kullanımdan kaldırma işlemlerini iyi yöneten kuruluşlar, bunu sadece teknik bir sorun olarak değil, bir politika sorunu olarak ele alırlar. Kullanımdan kaldırma politikası şunları tanımlar:
Kimler kullanımdan kaldırabilir? Tek bir geliştirici, ekip incelemesi olmadan yaygın olarak kullanılan dahili bir API'yi tek taraflı olarak kullanımdan kaldırmamalıdır. Kullanımdan kaldırma kararları, kullanan bileşenlerin sahiplerini de içermelidir.
Kullanımdan kaldırma süresinin ne kadar sürdüğü. Makul bir varsayılan değer: kaldırılmadan önce bir ana sürüm döngüsü boyunca bildirim. Genel kullanıma açık API'ler için iki ana sürüm. Dahili API'ler için bir sürüm döngüsü.
Kullanımdan kaldırılan özelliklerin nasıl iletildiği. Kod içindeki açıklamalar, değişiklik günlüğü girdileri ve bilinen kullanıcılara doğrudan bildirim. Yalnızca kod yorumunda bulunan bir kullanımdan kaldırma bildirimi gözden kaçacaktır.
"Kaldırıldı" ne anlama geliyor? Kod silindi mi? Ayrı bir isteğe bağlı pakete mi taşındı? Bir özellik bayrağının arkasına mı gizlendi? Son durumu açıkça tanımlayın.
Göç yolunun nasıl belgelendiği. Her kullanımdan kaldırma açıklaması, yerine geçecek olan ürüne bir referans içermelidir. @deprecated Use fetchUserById() instead daha kullanışlıdır @deprecated.
Kullanımdan kaldırılmış kod hala çalışıyor mu?
Evet, ta ki durum değişene kadar. Kullanımdan kaldırılmış kod, gerçekten kaldırıldığı sürüme kadar normal şekilde çalışır. Kullanımdan kaldırılmış kodun en tehlikeli özelliği de budur: yanlış bir güvenlik hissi yaratır. Yıllardır kullanımdan kaldırılmış API'lerle çalışan sistemler istikrarlı görünebilirken, ani bir arıza riski her sürüm döngüsünde artar.
"Eski kod çalıştırmak güvenli mi?" sorusunun cevabı şudur: Kaldırma tarihine ne kadar yakın olduğuna ve eski bileşenin güvenlik durumuna bağlıdır. Aktif olarak bakımı yapılan bir kütüphanenin küçük bir sürümünde kullanımdan kaldırılan ve bilinen hiçbir CVE'si olmayan bir fonksiyon, düşük anlık risk taşır. Yama yapılmamış bir güvenlik açığına sahip ve kullanım ömrünün sona erme tarihi açıklanmış eski bir kimlik doğrulama kütüphanesi ise yüksek anlık risk taşır.
Ne kadar SMART TS XL Kurumsal sistemlerdeki kullanımdan kaldırılmış kodları belirler.
Tek dilli bir projede, kullanım dışı bırakılmış kodu bulmak, doğru derleyici bayrağını veya lint kuralını çalıştırmakla ilgili bir meseledir. COBOL, JCL, Java, Python ve modern hizmetleri kapsayan kurumsal bir ortamda, her dilin kullanım dışı bırakılmış bileşenlerinin eş zamanlı olarak bulunması gerekir ve aralarındaki ilişkiler, kullanım dışı bırakılmaların kendileri kadar önemlidir.
SMART TS XL'S statik kod analizi Ortamdaki her dili tarar ve tüm kod tabanında aynı anda kullanımdan kaldırılmış ek açıklamaları, eski API kullanımlarını ve ölü kod kalıplarını ortaya çıkarır. Bir COBOL copybook'u kullanımdan kaldırılmış olarak işaretlendiğinde, SMART TS XL Bu yöntem, onu içeren her programı tanımlar. Bir Java API yöntemi kullanımdan kaldırıldığında, portföydeki her hizmetteki her çağrı noktasını izler.
Etki analizi özelliği bunu bir adım daha ileri götürüyor: Kullanımdan kaldırılmış herhangi bir bileşeni kaldırmadan önce, bu kaldırmanın hangi programları, hangi iş akışlarını, hangi alt hizmetleri ve her dili etkileyeceğini tam olarak ortaya koyuyor. Bu, riskli "ne bozulacak?" sorusunu, kaldırma işlemine devam etmeden önce doğrulanması gereken her şeyin yapılandırılmış, numaralandırılmış bir listesine dönüştürüyor.
Kurumsal arama özelliği, envanteri sorgulanabilir hale getirir: Belirli bir kullanımdan kaldırılmış fonksiyonun her kullanımını, kullanımdan kaldırılmış bir copybook'a yapılan her referansı, eski bir API'ye yapılan her çağrıyı saniyeler içinde, birden fazla dildeki milyonlarca satır kodda bulun. Kullanımdan kaldırılmış bileşen envanterinin geçiş kapsamını belirlemek için başlangıç noktası olduğu eski sistem modernizasyon programlarında, bu arama özelliği haftalarca süren manuel denetimi hedefli bir sorguyla değiştirir.