KoderKoder.ai
FiyatlandırmaKurumsalEğitimYatırımcılar için
Giriş YapBaşla

Ürün

FiyatlandırmaKurumsalYatırımcılar için

Kaynaklar

Bize UlaşınDestekEğitimBlog

Yasal

Gizlilik PolitikasıKullanım KoşullarıGüvenlikKabul Edilebilir Kullanım PolitikasıKötüye Kullanımı Bildir

Sosyal

LinkedInTwitter
Koder.ai
Dil

© 2026 Koder.ai. Tüm hakları saklıdır.

Ana Sayfa›Blog›Claude Code ile React bileşenlerini güvenle refaktör etmek
30 Ara 2025·7 dk

Claude Code ile React bileşenlerini güvenle refaktör etmek

Karakterizasyon testleri, küçük güvenli adımlar ve durum ayırma ile Claude Code kullanarak React bileşenlerini davranışı değiştirmeden nasıl yapılandıracağınızı öğrenin.

Claude Code ile React bileşenlerini güvenle refaktör etmek

Gerçek kodda React refaktörlerini riskli yapan nedir

React refaktörleri riskli hissettirir çünkü çoğu bileşen küçük, temiz yapı taşları değildir. UI, state, effect'ler ve “bir prop daha ekleyeyim” düzeltmeleriyle yaşayan karışık yapılardır. Yapıyı değiştirdiğinizde çoğunlukla zamanlama, kimlik ya da veri akışını istemeden değiştirirsiniz.

Bir refaktör en sık şu durumlarda davranışı değiştirir:

  • Bir bileşen sınırı taşındığı veya bir key değiştiği için state'in sıfırlanması.
  • Bağımlılıklar kaydığı veya mount/unmount değiştiği için effect'lerin ne zaman çalıştığının değişmesi.
  • Memoization'ın kırılması; böylece handler'lar ve türetilmiş değerler her render'da değişir.
  • Markup sarıldıktan veya bölündükten sonra olay işleme (focus, blur, klavye, pointer) kayması.
  • Mantık kopyalanıp merkezileştirilmediğinde fetch veya aboneliklerin çoğaltılması.

Refaktörler aynı zamanda “temizleme” ile “iyileştirme” karıştığında yeniden yazımlara döner. Bir bileşen çıkarmayla başlarsınız, sonra bir sürü şeyi yeniden adlandırırsınız, sonra state yapısını “düzeltirsiniz”, sonra bir hook’u değiştirirsiniz. Kısa sürede hem mantığı hem de layout'u değiştirmiş olursunuz. Koruyucu önlemler yoksa hangi değişikliğin hataya yol açtığını anlamak zordur.

Güvenli bir refaktörün bir vaadi vardır: kullanıcılar aynı davranışı görür ve ortaya daha anlaşılır kod çıkar. Prop'lar, event'ler, yükleme durumları, hata durumları ve kenar durumları aynı şekilde davranmalı. Eğer davranış değişiyorsa, bu kasıtlı, küçük ve açıkça belirtilmiş olmalıdır.

Claude Code (veya herhangi bir kod yardımcısı) ile React bileşenlerini refaktörlüyorsanız, onu otomatik pilot değil hızlı bir eş programcı gibi ele alın. Düzenleme yapmadan önce riskleri açıklamasını isteyin, küçük adımlardan oluşan bir plan önerisini isteyin ve davranışın aynı kaldığını nasıl kontrol ettiğini açıklamasını isteyin. Sonra kendiniz doğrulayın: uygulamayı çalıştırın, garip yolları tıklayın ve bileşenin bugün ne yaptığını yakalayan testlere güvenin, ideal davranışı değil.

Hedefi seçin ve net bir refaktör hedefi koyun

Zamanınızı aktif olarak çalan tek bir bileşen seçin. Tüm sayfa değil, “UI katmanı” değil ve belirsiz bir “temizlik” de değil. Okuması zor, değiştirmesi zor veya kırılgan state ve yan etkilerle dolu tek bir bileşen seçin. Dar bir hedef, asistan önerilerini doğrulamayı da kolaylaştırır.

Beş dakikada kontrol edebileceğiniz bir hedef yazın. İyi hedefler yapı üzerinedir, sonuç değil: “daha küçük bileşenlere ayır”, “state’i takip etmeyi kolaylaştır”, veya “uygulamanın yarısını mocklamadan test edilebilir yap”. “Daha iyi yap” veya “performansı artır” gibi hedeflerden kaçının; bir metriğiniz ve bilinen bir darboğazınız yoksa.

Düzenleyiciyi açmadan önce sınırları belirleyin. En güvenli refaktörler sıkıcıdır:

  • Görsel değişiklik yok (aynı düzen, aynı metin, aynı boşluk).
  • Yeni özellik yok (“buradayken sıralama ekle” bile yok).
  • Aynı dış davranış (prop girer, UI ve callback'ler çıkar).
  • Bir seferde bir bileşen (birini bitirin, sonra diğerine geçin).

Sonra kodu taşırken davranışı sessizce bozabilecek bağımlılıkları listeleyin: API çağrıları, context provider'ları, routing parametreleri, feature flag'ler, analitik event'leri ve paylaşılan global state.

Somut bir örnek: 600 satırlık bir OrdersTable var ve veri çekiyor, filtreliyor, seçim yönetiyor ve detaylar için bir drawer gösteriyor. Net bir hedef olabilir: “satır render'ını ve drawer UI'ını bileşenlere çıkar, seçim state'ini tek bir reducer'a taşı, UI değişikliği yok.” Bu hedef, “bitti”nin ne olduğunu ve kapsam dışında olanı söyler.

Koda dokunmadan önce davranışı dondurun

Refaktöre başlamadan önce bileşeni siyah kutu gibi ele alın. Göreviniz bileşenin bugün ne yaptığını yakalamaktır, uzun vadede ne yapmasını istediğiniz değil. Bu, refaktörün yeniden tasarıma dönmesini engeller.

Önce mevcut davranışı düz anlatımla yazın: bu girdiler verildiğinde UI şu çıktıyı gösterir. Props, URL parametreleri, feature flag'ler ve context ya da store'dan gelen verileri dahil edin. Claude Code kullanıyorsanız, küçük ve odaklı bir snippet yapıştırıp davranışı daha sonra kontrol edebileceğiniz kesin cümlelerle tekrar ifade etmesini isteyin.

Kullanıcıların gerçekten gördüğü UI durumlarını kapsayın. Bir bileşen mutlu yolunda iyi görünürken, yükleme, boş veya hata durumunda kırılabilir.

Ayrıca gözden kaçması kolay, refaktörlerde davranışı bozan örtük kuralları yakalayın:

  • Varsayılan seçimler (seçilmiş sekme, varsayılan sıralama kolonu, başlangıç filtre değerleri).
  • Biçimlendirme kuralları (tarihler, para birimi, kısaltma, büyük harf kullanımı).
  • Sıralama kuralları (kararlı sıralama, gruplama, sabitlenen öğeler).
  • Etkileşim kuralları (filtre değişince ne sıfırlanır, ne odakta kalır).
  • Kullanıcıların güvendiği kenar durumlar (boş string vs null, sıfır değerleri, kısmi veri).

Örnek: bir kullanıcı tablosu var; sonuçları yüklüyor, arama destekliyor ve “Son aktif”e göre sıralıyor. Arama boşken ne olur, API boş liste döndüğünde ne olur, API hata verdiğinde ne olur ve iki kullanıcının aynı “Son aktif” zamanına sahip olduğu durumda ne olur gibi durumları yazın. Küçük ayrıntılar (sıralama büyük/küçük harf duyarsız mı, filtre değiştiğinde tablo sayfasını koruyor mu) gibi şeyleri not edin.

Notlar sıkıcı ve spesifik hissettikçe hazır hale gelirsiniz.

Mevcut davranışı kilitleyen karakterizasyon testleri ekleyin

Karakterizasyon testleri, “bugün böyle yapıyor” testleridir. Hatta tuhaf veya tutarsız olsa bile mevcut davranışı tanımlarlar. Tuhaf gelebilir ama bu testler refaktörün gizlice yeniden yazılmasını engeller.

React bileşenlerini Claude Code ile refaktörlüyorsanız, bu testler güvenlik raylarınızdır. Araç kodu şekillendirmede yardımcı olabilir ama hangi davranışın değişmemesi gerektiğine siz karar verirsiniz.

Kullanıcıların (ve diğer kodun) dayandığı şeylere odaklanın:

  • Render: önemli durumlar için ne görünür (empty, loading, error, normal).
  • Etkileşimler: tıklamalar, yazma, klavye navigasyonu, seçim, sayfalama.
  • Türev değerler: toplamlar, filtrelenmiş sayılar, biçimlendirme, devre dışı durumlar.
  • Yan etkiler: analitik çağrıları, taslak kaydetme, URL güncellemeleri, odak yönetimi.
  • Hata işleme: bir işlem başarısız olduğunda ne olur.

Testlerin stabil kalması için sonucu iddia edin, implementasyonu değil. “Kaydet butonu devre dışı kalır ve bir mesaj görünür” demek, “setState çağrıldı” demekten iyidir. Bir test bileşenin adını değiştirmek veya hook'ları yeniden sıralamak yüzünden kırılıyorsa davranışı korumuyordu.

Asenkron davranış refaktörlerin sık değiştirdiği zamandır. Bunu açıkça ele alın: UI'nın yerleşmesini bekleyin, sonra iddia edin. Zamanlayıcılar (debounced search, geciktirilmiş toast'lar) varsa fake timer kullanın ve zamanı ilerletin. Ağ çağrıları varsa fetch'i mocklayın ve başarı ile hatadan sonra kullanıcıya görüneni doğrulayın. Suspense benzeri akışlar için hem fallback hem de çözülen görünümü test edin.

Örnek: bir “Users” tablosu, arama tamamlandıktan sonra sadece “Sonuç yok” gösterir. Bir karakterizasyon testi bu sıralamayı kilitlemeli: önce loading göstergesi, sonra satırlar ya da boş mesaj, bileşeni daha sonra nasıl bölerseniz bölün.

Claude Code ile pratik adım adım yöntem

Kazanç “daha büyük değişiklikler daha hızlı” değildir. Kazanç, bileşenin ne yaptığını net görmek ve davranışı sabit tutarak tek seferde küçük değişiklikler yapmaktır.

Önce bileşeni yapıştırın ve sorumluluklarının düz İngilizce (ya da sizin dilinizde) bir özetini isteyin. Spesifik olun: hangi verileri gösteriyor, hangi kullanıcı işlemlerini ele alıyor ve hangi yan etkileri tetikliyor (fetch, timer, abonelik, analitik). Bu genellikle refaktörleri riskli yapan gizli işleri ortaya çıkarır.

Sonra bir bağımlılık haritası isteyin. Her girdi ve çıktının envanterini istiyorsunuz: prop'lar, context okumaları, custom hook'lar, local state, türetilen değerler, effect'ler ve modül-seviyesindeki yardımcılar. Faydalı bir harita ayrıca taşınmasının güvenli olduğu (saf hesaplamalar) ile “yapışkan” olanları (zamanlama, DOM, ağ) da belirtir.

Sonra çıkarma adayları önerisini isteyin, tek katı kural: saf view parçalarını stateful controller parçalarından ayır. Sadece prop alan ve JSX içeren kısımlar ilk extractions için iyidir. Olay işleyiciler, asenkron çağrılar ve state güncellemelerini karıştıran bölümler genellikle değildir.

Güçlü tutan bir iş akışı:

  • Sorumluluk özetinin ve bağımlılık haritasının sizin gördüğünüzle eşleştiğini onaylayın.
  • Çoğunlukla sunumsal olan bir çıkarma adayı seçin ve sadece onu taşıyın.
  • Karakterizasyon testlerini yeniden çalıştırın ve hızlı bir manuel kontrol yapın.
  • Bir state/efekt düğümünü (hepsini değil) ele alın ve tekrar test edin.
  • Orijinal bileşen küçük bir koordinatör gibi okunana kadar tekrarlayın.

Kontrol noktaları önemlidir. Claude Code'dan her adımın commit edilebilir ve geri alınabilir olduğu minimal bir plan isteyin. Pratik bir checkpoint: “\u003cTableHeader\u003e'ı mantık değiştirmeden çıkar” gibi bir hedef, sıralamayı ellememek için iyi bir örnektir.

Somut örnek: bir bileşen müşteri tablosu render ediyor, filtreleri kontrol ediyor ve veriyi çekiyorsa önce tablo markup'ını (header, satırlar, empty state) saf bir bileşene çıkarın. Ondan sonra filtre state'ini veya fetch effect'ini taşımaya geçin. Bu sıra, JSX ile birlikte gezen hataların yayılmasını engeller.

Bileşenleri hataları taşımadan çıkarın

Ekibinizi dahil edin
Tek kişilik refaktörlerden, snapshot'lar ve net planlarla paylaşılan bir iş akışına geçin.
Ekibi Davet Et

Büyük bir bileşeni böldüğünüzde asıl risk JSX'i taşımak değildir; asıl risk veri akışı, zamanlama veya event kablajının istemeden değişmesidir. Çıkarma işlemini önce kopyala-ve-bağla olarak yapın, sonra temizlemeyi ayrı adımda yapın.

Başlamak için UI içinde zaten var olan sınırları arayın, dosya yapısında değil. Bir cümleyle kendi “şeyi” olarak tanımlayabileceğiniz bölümler arayın: butonlu bir header, filtre çubuğu, sonuç listesi, sayfalama footer'ı.

Güvenli ilk hamle saf sunumsal bileşenleri çıkarmaktır: prop alır, JSX verir. Kasıtlı olarak sıkıcı bırakın. Yeni state, yeni effect veya yeni API çağrısı eklemeyin. Orijinal bileşende bir tıklama handler'ı üç şey yapıyorduysa, handler'ı ebeveynde tutun ve aşağıya props olarak gönderin.

Genellikle işe yarayan sınırlar: başlık alanı, liste ve satır öğesi, sadece input içeren filtreler, footer kontrolleri (sayfalama, toplamlar, toplu işlemler) ve dialog'lar (açma/kapatma ve callback'ler props ile verilir).

İsimlendirme insanların düşündüğünden daha çok önemlidir. UsersTableHeader veya InvoiceRowActions gibi spesifik isimler seçin. “Utils” veya “HelperComponent” gibi toplama isimlerinden kaçının; sorumlulukları gizler ve ilgisiz işleri karıştırmaya davetiye çıkarır.

Gerçek bir ihtiyaç olmadıkça bir container bileşeni tanıtmayın: UI'nın bir kısmı state veya effect sahibi olmak zorunda kaldığında container gerekir. Yine de dar tutun. İyi bir container tek bir amaca sahip olur (ör. “filter state”) ve diğer her şeyi prop olarak aktarır.

State ve effect'leri küçük, güvenli adımlarla çözün

Karışık bileşenler genellikle üç tür veriyi karıştırır: gerçek UI state'i (kullanıcının değiştirdiği), türetilmiş veri (hesaplanabilir olan), ve sunucu state'i (ağdan gelen). Hepsini local state gibi ele alırsanız refaktörler riskli olur çünkü güncellemelerin ne zaman olacağını kazara değiştirebilirsiniz.

Önce her veri parçasını etiketleyin. Soru sorun: kullanıcı mu bunu düzenliyor, yoksa prop/state ve çekilen veriden hesaplanabilir mi? Ayrıca sorun: bu değer burada mı sahipleniliyor yoksa sadece geçirilmiş mi?

State'i türetilen değerlerden ayırın

Türetilen değerler useState içinde olmamalı. Küçük bir fonksiyona veya pahalıysa memoize edilmiş bir selector'a taşıyın. Bu state güncellemelerini azaltır ve davranışı öngörülebilir kılar.

Güvenli bir desen:

  • Yalnızca kullanıcı tarafından düzenlenen değerleri useState'te tutun.
  • Görünüm için gerekli türetilmiş değerleri bu girdilerden hesaplayın.
  • Hesaplanmış değerleri aşağıya aktarın, setter'ları sadece bir çocuk gerçekten düzenliyorsa verin.
  • Performans önemliyse ağır hesaplamaları useMemo ile sarın.

Effect'leri sıkıcı ve spesifik yapın

Effect'ler çok fazla şey yaptığında veya yanlış bağımlılıklara tepki verdiğinde davranışı bozar. Her amaç için bir effect hedefleyin: bir effect localStorage ile senkronize etmek için, bir effect fetch için, bir effect abonelikler için. Bir effect çok sayıda değer okuyorsa genellikle ekstra sorumlulukları gizliyordur.

Claude Code kullanıyorsanız küçük bir değişiklik isteyin: bir effect'i ikiye böl veya bir sorumluluğu bir yardımcıya taşı. Sonra her taşımadan sonra karakterizasyon testlerini çalıştırın.

Prop drilling konusunda dikkatli olun. Bunu context ile değiştirmek yalnızca tekrar eden kabloyu kaldırıp sahipliği netleştirdiğinde fayda sağlar. İyi bir işaret, context'in app-seviyesinde bir kavram gibi okunmasıdır (mevcut kullanıcı, tema, feature flag'ler), tek bir bileşen ağacı için geçici bir çözüm olmamalıdır.

Örnek: bir tablo bileşeni hem rows hem de filteredRows state'inde tutuyor olabilir. rows state olarak kalmalı, filteredRows ise rows + query'den hesaplanmalı ve filtreleme kodu saf bir fonksiyonda tutulmalı ki test edilmesi kolay ve kırılması zor olsun.

Hızlı geri alma için checkpoint'ler kullanın

Düzenleme öncesi riskleri haritalayın
Koder.ai planlama modunda riskleri, bağımlılıkları ve commit-boya planı çıkarın.
Planlama Kullan

Refaktörler en çok çok fazla değişiklik yapıp fark etmeden ilerlediğinizde ters gider. Çözüm basit: küçük checkpoint'lerde çalışın ve her checkpoint'i mini bir sürüm gibi ele alın. Aynı dalda çalışıyor olsanız bile değişikliklerinizi PR boyutunda tutun ki neyin kırıldığını ve nedenini görebilin.

Her anlamlı hamleden sonra durup davranışın değişmediğini kanıtlayın. Bu kanıt otomatik olabilir (testler) veya manuel (tarayıcıda hızlı bir kontrol). Amaç mükemmellik değil; hızlı tespit.

Pratik bir checkpoint döngüsü:

  • Bir küçük değişiklik yapın (ekstraksiyon, state taşıma, effect temizliği).
  • Tam test suite'ini veya en azından o alanın karakterizasyon testlerini çalıştırın.
  • Önemli kullanıcı yollarında hızlı bir manuel kontrol yapın.
  • Bir geri alma noktası kaydedin (git commit veya platform snapshot).

Koder.ai gibi bir platform kullanıyorsanız snapshot'lar ve rollback, iterasyon sırasında güvenlik rayı gibi davranabilir. Normal commit'leriniz olsun ama snapshot'lar “bilinen iyi” bir sürümle karşılaştırma veya deneme yanlış gittiğinde geri dönme konusunda yardımcı olur.

Giderken basit bir davranış defteri tutun. Bu sadece neyi doğruladığınıza dair kısa bir nottur ve aynı şeyleri tekrar tekrar kontrol etmenizi engeller.

Örnek:

  • Tablo sıralaması: hala aynı kolona göre sıralanıyor ve ok ikonu durumu aynı.
  • Satır seçimi: seçili sayısı güncelleniyor, toplu işlemler doğru etkinleşiyor.
  • Yükleme ve hata durumları: spinner ve tekrar dene butonu aynı durumlarda görünüyor.

Bir şey kırıldığında defter size neyi yeniden kontrol etmeniz gerektiğini söyler ve checkpoint'ler geri dönmeyi ucuzlatır.

Refaktör sırasında davranışı bozan yaygın tuzaklar

Çoğu refaktör küçük, sıkıcı şekillerde başarısız olur. UI çalışıyor gibi görünür ama bir boşluk kuralı kaybolur, bir tıklama iki kez tetiklenir veya bir liste yazarken odak kaybeder. Asistanlar kodu daha temiz gösterdiği için bu daha zor farkedilir.

Yapıyı değiştirmek en yaygın sebeptir. Bir bileşeni çıkarırsınız ve fazladan bir \u003cdiv\u003e sararsınız veya \u003cbutton\u003e yerine tıklanabilir \u003cdiv\u003e kullanırsınız. Bu, CSS seçicilerini, düzeni, klavye navigasyonunu ve test sorgularını değiştirebilir.

En sık davranışı bozan tuzaklar:

  • Masum görünen DOM değişiklikleri: Fazladan wrapperlar, farklı element tipleri veya taşınan attribute'lar CSS ve testleri bozabilir. Tasarım değişikliğine niyetli olmadıkça aynı tag'leri ve data attribute'larını koruyun.
  • Referans eşitliğini kazara bozmak: Inline yeni nesne/fonksiyonlar ({} veya () => {}) ekstra re-render'lara ve child state'in sıfırlanmasına neden olabilir. Eskiden stabil olan prop'lara dikkat edin.
  • Hook bağımlılık hataları: Mantığı useEffect, useMemo veya useCallback içine taşımak, bağımlılıklar değişirse stale değerler veya döngüler yaratabilir. Bir effect eskiden “click'te” çalışıyorduysa, onu “her şey değiştiğinde” çalışır hale getirmeyin.
  • İzinsiz davranış yükseltmeleri: Kenar durumları “düzeltmek”, sıralama kurallarını değiştirmek veya doğrulamayı geliştirmek ürün değişikliğidir. Önce bugünkü davranışı eşleyin, tuhaf da olsa.

Somut örnek: bir tablo bileşenini bölerken satır anahtarlarını ID yerine dizi indeksiyle değiştirmek iyi görünse de, sıralama olduğunda seçim state'inin bozulmasına neden olabilir. “Temiz” olmak bir bonus olsun; “aynı davranış” gereklilik olsun.

Biten kabul etmeden önce hızlı kontrol listesi

Merge etmeden önce refaktörün davranışı koruduğuna dair kanıt istersiniz. En kolay gösterge sıkıcıdır: testler hala çalışıyor ve siz testleri “düzeltmek” zorunda kalmıyorsunuz.

Son küçük değişiklikten sonra bu hızlı geçişi yapın:

  • Eski testler hiçbir düzenleme gerektirmeden geçmeli ve yeni karakterizasyon testleri de geçmeli (snapshot veya assertion güncellemesi yok).
  • UI aynı görünür durumlara sahip: loading, empty, error, success ve aynı koşullarda ortaya çıkıyorlar.
  • Public prop'lar ve callback sözleşmeleri sabit kaldı: aynı isimler, aynı argüman şekilleri, aynı zamanlama (ör. onChange kullanıcı girdisinde çalışıyor, mount'ta değil).
  • Odak ve klavye davranışı aynı hissettiriyor: tab sırası, Enter ve Escape davranışı, kaydet/kapat/sayfa değişiminden sonra odaklanma.
  • Analitik ve yan etkiler aynı anda ve yalnızca bir kez tetikleniyor (ör. ekran yüklemesinde bir “Viewed” event'i, render başına değil).

Hızlı bir akıl sağlığı kontrolü: bileşeni açın ve garip bir akışı deneyin, mesela bir hatayı tetikleyin, tekrar deneyin, sonra filtreleri temizleyin. Refaktörler genellikle ana yol çalışırken geçişleri bozar.

Herhangi bir madde başarısız olursa son değişikliği geri alın ve daha küçük bir adımla yeniden deneyin. Büyük diff'i debug etmekten genellikle daha hızlıdır.

Gerçekçi bir örnek: karışık bir tablo bileşenini bölme

Dikkatli refaktörleri hızlandırın
Yavaş miras geliştirme döngülerini, adım adım doğrulanabilir sohbet tabanlı bir iş akışıyla değiştirin.
Şimdi Deneyin

Bir ProductTable hayal edin: veri çekiyor, filtreleri yönetiyor, sayfalama kontrol ediyor, silme için onay diyaloğu açıyor ve satır eylemleri (düzenle, kopyala, arşivle) ile uğraşıyor. Küçükken başlamış, sonra 900 satırlık bir dosyaya dönüşmüş.

Belirtiler tanıdık: state useState çağrıları arasında dağılmış, birkaç useEffect belirli bir sıra ile çalışıyor ve bir “zararsız” değişiklik sadece bir filtre aktifken sayfalamayı kırıyor. İnsanlar dokunmamayı tercih ediyor çünkü öngörülemez hissediyor.

Yapıyı değiştirmeden önce birkaç React karakterizasyon testi ile davranışı kilitleyin. Kullanıcıların yaptıklarına odaklanın, iç state'e değil:

  • Filtre uygulamak görünen satırları günceller ve sayfayı 1'e sıfırlar.
  • Sayfalama filtreyi korur ve doğru sayfa sayısını gösterir.
  • “Arşivle” tıklanınca istek sürerken satır devre dışı kalır.
  • Eşleşen sonuç yoksa boş durum gösterilir.
  • Yükleme durumu “No results”i yanıp söndürmez.

Şimdi küçük commit'lerde refaktör yapabilirsiniz. Temiz bir çıkarma planı şöyle olabilir: FilterBar kontrolleri render eder ve filtre değişikliklerini iletir; TableView satırları ve sayfalamayı render eder; RowActions action menüsü ve onay dialog UI'sını tutar; ve useProductTable hook'u karışık mantığı (query param, türetilmiş state ve yan etkiler) sahiplenir.

Sıra önemlidir. Önce saf UI'yi çıkarın (TableView, FilterBar) ve prop'ları değişmeden geçirerek. Riskli kısmı sona bırakın: state ve effect'leri useProductTable içine taşımak. Taşırken eski prop isimlerini ve event şekillerini koruyun ki testler yeşil kalsın. Bir test kırılırsa bir stil değil davranış değiştiğini bulmuşsunuz demektir.

Sonraki adımlar: bu yöntemi tekrarlanabilir kılın

Claude Code ile React bileşenlerini güvenli hissettiren bir hal almak istiyorsanız yaptıklarınızı küçük bir şablona dönüştürün. Amaç daha fazla süreç değil; daha az sürprizdir.

Basit bir refaktör şablonu tutun

Her bileşende, yorgun veya acele halindeyken bile takip edebileceğiniz kısa bir playbook yazın:

  • Bir cümle ile hedefi ifade edin (ne düzeliyor, ne değişmemeli).
  • Mevcut davranışı karakterizasyon testleriyle yakalayın (tuhaf kenar durumlarını dahil edin).
  • Bir küçük değişiklik yapın (ekstraksiyon, yeniden adlandırma, state taşıma, effect izolasyonu).
  • Testleri çalıştırın ve UI'da hızlı bir kontrol yapın.
  • Geri alınabilir bir checkpoint kaydedin.

Bunu notlarınızda veya repo'da snippet olarak saklayın ki sonraki refaktör aynı güvenlik raylarıyla başlasın.

Davranış kilitlendikten sonra ne yapacağınızı belirleyin

Bileşen sabit ve daha okunaklı olduğunda, kullanıcı etkisine göre bir sonraki adımı seçin. Yaygın bir sıra: önce erişilebilirlik (label'lar, odak, klavye), sonra performans (memoization, pahalı render'lar), sonra temizlik (tipler, isimlendirme, ölü kod). Üçünü bir PR'da karıştırmayın.

Koder.ai gibi vibe-coding iş akışları kullanıyorsanız, planlama modu adımları düzenlemenize yardımcı olur ve snapshot/rollback checkpoint'ler olarak iş görür. Bitince kaynak kodunu dışa aktarmak son diffları incelemeyi ve temiz geçmiş tutmayı kolaylaştırır.

Ne zaman durup gönderileceğini bilin

Testler, kırılmasını korktuğunuz davranışları kapsadığında, bir sonraki değişiklik yeni bir özellik olurdu veya “mükemmelleştirme” dürtüsü geldiğinde durun ve gönderin. Eğer büyük formu bölmek karmaşık state'i çözdüyse ve testler validasyon ve submit yollarını kapsıyorsa, gönderin. Kalan fikirleri kısa bir backlog olarak saklayın.

SSS

Why do React refactors break things even when the UI looks the same?

React refaktörleri sıklıkla kimliği ve zamanlamayı fark etmeden değiştirir. Yaygın davranış bozulmaları şunlardır:

  • Bir bileşen sınırı veya key değiştiği için state'in sıfırlanması.
  • Mount/unmount veya bağımlılıklardaki değişiklikler yüzünden efektlerin farklı zamanda çalışması.
  • Markup sarıldıktan veya bölündükten sonra odak/blur/klavye gibi olay işlemenin kayması.

Yapısal bir değişikliğin, testler kanıtlayana dek davranış değişikliği olabileceğini varsayın.

What’s a good refactor goal for a messy React component?

Yapı odaklı, kısa ve kontrol edilebilir bir hedef belirleyin; sonuç odaklı değil. İyi bir hedef şu şekilde olur:

  • “Başlık, satırlar ve drawer’ı bileşenlere ayır, UI değişikliği olmasın.”
  • “Seçim durumunu tek bir reducer’a taşı, eventler veya prop şekilleri değişmesin.”

“Daha iyi yap” gibi belirsiz hedeflerden kaçının; elinizde ölçü ve bilinen bir darboğaz yoksa performans iddiaları koymayın.

How do I “freeze” current behavior before refactoring?

Bileşeni karanlık bir kutu gibi ele alıp kullanıcıların gözlemleyebildiği davranışı yazın:

  • Hangi durumların (loading/empty/error/success) ne zaman göründüğü
  • Varsayılanlar (seçilmiş sekme, sıralama kolonu, başlangıç filtresi)
  • Etkileşim kuralları (filtre değişince ne sıfırlanır, ne odakta kalır)
  • Biçimlendirme ve sıralama kuralları (tarih, para birimi, kararlı sıralama)

Notlar sıkıcı ve spesifik hissettikçe kullanışlıdır.

What tests give the most safety during a React refactor?

Karakterizasyon testleri ekleyin: bileşenin bugünkü davranışını tanımlayan testler, garip veya tutarsız olanı bile. Praktik hedefler:

  • Önemli durumlarda ne render edilir (loading, empty, error)
  • Kullanıcı etkileşimleri (yazma, sayfalama, seçim)
  • Yan etkiler (analitik, URL güncellemeleri, abonelikler)
  • Asenkron diziler (önce spinner, sonra satırlar/empty/error)

Testlerde uygulama çıktısını iddia edin, iç implementasyonu değil.

How should I use Claude Code (or any assistant) without losing control of behavior?

Asistanı dikkatli bir eş programcı gibi kullanın:

  • Önce: sorumlulukları özetlemesini ve giriş/çıkışları (props, context, effectler) listelemesini isteyin.
  • Sonra: commit-boya, küçük adımlardan oluşan bir plan isteyin.
  • Her adım için: neyin kırılabileceğini (state reset, efekt zamanlaması, event wiring) belirtmesini sağlayın.

Büyük bir “yeniden yazma” diff'ini kabul etmeyin; doğrulanabilir küçük değişiklikler talep edin.

What’s the safest order to split a large component into smaller ones?

Önce saf sunumsal parçaları çıkarın:

  • Prop alır, JSX verir
  • Yeni state, efekt veya fetch yok
  • Parent'te tutulan handler'ları aşağıya prop olarak gönderin

Önce kopyala-ve-bağla, sonra temizle. UI güvenle bölündükten sonra state/efekt adımlarına geçin.

Why is changing list keys during a refactor so dangerous?

Gerçek kimliğe bağlı, istikrarlı anahtarlar (ID gibi) kullanın; dizi indeksleri tehlikelidir.

İndeks anahtarlar sıralama, filtreleme, ekleme veya silme durumlarında yanlış örneklerin yeniden kullanılmasına yol açar ve şu hatalara sebep olabilir:

  • Yanlış satırın seçili kalması
  • Inputların odak veya değer kaybetmesi/yer değiştirmesi
  • Yerel satır durumunun yanlış öğeye bağlanması

Eğer refaktör anahtarları değiştiriyorsa bunu yüksek riskli kabul edin ve yeniden sıralama durumlarını test edin.

How do I untangle state and derived data without changing behavior?

Türev verileri useState içinde tutmayın; bunları prop, state ve çekilen veriden hesaplayın.

Güvenli yaklaşım:

  • Yalnızca kullanıcı tarafından düzenlenen veya dıştan kontrol edilen değerleri state'te tutun
  • Türev verileri (filteredRows gibi) mevcut girdilerden hesaplayın
  • Hesaplama pahalıysa useMemo kullanın

Bu, güncelleme tuhaflıklarını azaltır ve bileşeni daha kolay anlaşılır kılar.

What’s a good checkpoint loop to keep refactors from turning into rewrites?

Adım adım checkpoint döngüsü:

  • Bir küçük değişiklik yapın (bir ekstraksiyon veya bir efekt bölme)
  • İlgili karakterizasyon testlerini çalıştırın
  • Hızlı bir manuel “garip yol” kontrolü yapın (hata → tekrar dene → filtreleri temizle)
  • Bir geri alma noktası kaydedin (git commit veya platform snapshot)

Koder.ai kullanıyorsanız snapshot'lar normal commit'leri tamamlayıcı olarak işe yarar.

How do I know when to stop refactoring and ship?

Davranış kilitlenmiş ve kod daha kolay değiştirilebilir olduğunda durun. Durma sinyalleri:

  • Testler, kırılmaktan korktuğunuz yolları kapsıyor
  • Bir sonraki değişiklik bir özellik eklemek olurdu veya ürünsel kararları “düzeltmek” olurdu
  • Aynı PR içinde isimlendirme, tipler ve mimariyi mükemmelleştirme isteği hissediyorsunuz

Refaktörü gönderin; kalan erişilebilirlik, performans ve temizlik işlerini ayrı işler olarak kaydedin.

İçindekiler
Gerçek kodda React refaktörlerini riskli yapan nedirHedefi seçin ve net bir refaktör hedefi koyunKoda dokunmadan önce davranışı dondurunMevcut davranışı kilitleyen karakterizasyon testleri ekleyinClaude Code ile pratik adım adım yöntemBileşenleri hataları taşımadan çıkarınState ve effect'leri küçük, güvenli adımlarla çözünHızlı geri alma için checkpoint'ler kullanınRefaktör sırasında davranışı bozan yaygın tuzaklarBiten kabul etmeden önce hızlı kontrol listesiGerçekçi bir örnek: karışık bir tablo bileşenini bölmeSonraki adımlar: bu yöntemi tekrarlanabilir kılınSSS
Paylaş