C# WinForms Yeniden Düzenleme — Tim Corey ile Derinlemesine Bir Bakış
[[academy-video-youtube({"vid": "UPKphrPJZxE", "start_time": "0", "title": "C# App Başlangıçtan Bitişe Ders 24 - Refactoring", "creator": "Tim Corey", "length": "1h 10m 16s"})]]
Refactoring, sadece çalışan kod ile sürdürülebilir, esnek ve geleceğe hazır kodu ayıran konulardan biridir. "C# App Başlangıçtan Bitişe" serisinin 24. dersinde, Tim Corey, WinForms uygulaması içinde gerçek, pratik bir refactoring oturumunu adım adım inceler. Teori olmaktan ziyade, Tim mevcut bir projeyi yeniden düzenler, değişikliklerin neden gerekli olduğunu ve bunlara nasıl güvenli bir şekilde yaklaşılacağını açıklar.
Bu makalede, C# WinForms yeniden düzenleme işlemini daha derinlemesine inceliyor ve Tim'in videodaki açıklamalarını sıkıca takip ediyor olacağız.
Bu Ders İçin Refactoring'in Anlamı
0:02'de Tim, Ders 24'ü tanıtır ve refactoring'in kodu aynı işi yaparken, daha iyi bir şekilde yeniden çalıştırmak anlamına geldiğini açıklar. Uygulamanın zaten çalıştığını ancak 'çöp' ve standartlara uymayan alanlar içerdiğini belirtir. Tim'e göre, projenin daha fazla büyümeden önce işleri temizlemek için doğru zaman budur.
Refactoring'in özellik eklemekle ilgili olmadığını vurgular—yapıyı, okunabilirliği ve uzun vadeli sürdürülebilirliği geliştirirken, davranışı aynı tutmakla ilgilidir.
Arayüzlerde Gereksiz Dönen Değerleri Temizleme
0:31'den itibaren Tim, arayüz yöntem imzalarını düzeltmek için ilk yeniden düzenlemeye dalıyor. Projenin başında, yöntemlerin gereksiz yere modeller döndüğünü açıklar. Nesnelerin referansla geçtiğini, aynı modeli tekrar döndürmenin gerçek bir amaç hizmet etmediğini belirtir.
Bu yöntemleri void'e çevirirken, uygulamaların hemen bozulduğunu gösterir. Bu durumun neden olduğunu açıklar: Bir arayüz değiştiğinde, tüm uygulama sınıflarının yeni imza ile tam olarak eşleşmesi gerekir. SQL bağlayıcı ve metin bağlayıcıyı güncellenmiş arayüze uygun hale getirmek için nasıl düzelteceğinizi gösterir.
2:33'te Tim, Visual Studio'nun arayüzü otomatik olarak uygulamasına izin verirseniz ne olacağını göstermeye ara verir. Çift yöntem adlarının neden olduğunu açıklar ve yalnızca dönüş türlerinin imzaları ayırt etmek için yeterli olmadığını netleştirir.
Refactoring'den Kaynaklanan Derleme Hatalarını Düzeltme
4:00'da Tim çözümü belirli bir şekilde derler ve görünen hataları kasıtlı olarak gösterir. Bu hataların beklenen ve yararlı olduğunu açıklar. Örneğin, önceden döndürülen bir modeli bekleyen kod, şimdi yöntemin void döndürmesi nedeniyle başarısız olur.
Tim, gereksiz atamaları kaldırarak ve çözümü yeniden derleyerek bunu düzeltir. Refactoring'in genellikle kısa vadede kesintilere neden olduğunu, ancak her hatanın doğrudan iyileştirilmesi gereken kodu gösterdiğini vurgular.
Dosya Adı Sabitlerini GlobalConfig'e Taşıma
5:25'ten başlayarak, Tim metin bağlayıcıda dosya adlarının nasıl işlendiğini yeniden düzenler. Önceden, dosya yolları sınıf içinde özel string sabitleri olarak tutuluyordu. Artık bunlara gerek olmadığını çünkü dosya adlarının zaten GlobalConfig'de bulunduğunu açıklar.
Yerel sabitleri, GlobalConfig.PeopleFile, GlobalConfig.PrizesFile ve benzer özelliklerle değiştirir. Bu değişikliğin yapılandırmayı merkezileştirdiğini ve tüm uygulamanın tutarlı dosya yolları kullandığından emin olduğunu açıklar.
Ayrıca önemli bir noktaya değinir: aynı anda fazla şeyi yeniden düzenlemekten kaçının. Ek iyileştirmeler yapılabileceğini fark ettiği zaman, onlara daha sonra döneceğini açıkça belirtir.
Metin Bağlayıcı İşlemcisini Yeniden Düzenleme
7:44'te Tim, metin bağlayıcı işlemcisinde dosya adı parametrelerini birden fazla yöntemden kaldırarak yeniden düzenlemeye devam eder. Şimdi dosya adları GlobalConfig'de olduğu için, onları etrafa taşımak gereksizdir.
Tim, method imzalarını dikkatlice günceller, parametreleri GlobalConfig referansları ile değiştirir ve Visual Studio'nun hata listesinden yararlanır. Yeniden düzenleme sırasında bir anda birçok hata görmek normno bir şey olmadığını ve panik yapmamak gerektiğini açıklar.
13:16'da, gerçek zamanlı hata izlemenin projenin her yerinde metod çağrılarını sistematik olarak temizlerken ne kadar yardımcı olduğunu belirtir.
Çok Fazla İş Yapan UI Mantığını Tanımlama
15:24'te Tim, büyük bir tasarım sorununa dikkat çeker: bir UI olay işleyicisinde fazla mantık. Bir düğme tıklama olayını kaydırır ve bir olayın içermesi gerekenden daha fazla kod içerdiğini açıklar. Windows Forms'da, düğme tıklama gibi kullanıcı eylemleri, olay işleyici tarafından işler, bu olay gerçekleştiğinde icra edilecek belirli eylemi tanımlar.
UI kodunun yalnızca kullanıcı etkileşimine odaklanması gerektiğini açıklar. Windows Forms, kullanıcı eylemlerinin uygulama kodu tarafından işlenen olayları tetiklediği olay odaklı bir programlama modeli kullanır. İş mantığının - turnuvaları puanlama ve kazananları ilerletme gibi - bir sınıf kitaplığında yer alması gerektiğini açıklar. Bu ayrım, aynı mantığın daha sonra bir web uygulaması veya WPF uygulamasında tekrar kullanılabilmesine olanak sağlar.
Turnuva Mantığını Sınıf Kitaplığına Çıkartma
17:55'ten başlayarak, Tim turnuva puanlama mantığını turnuva mantığı sınıfı içerisine yeni bir halka açık metoda taşır. Adını UpdateTournamentResults koyar ve neden tüm turnuva modelini kabul ettiğini, yalnızca tek bir eşleşmeyi değil, açıklar.
Mantığı formdan çıkartır, sınıf kütüphanesine yapıştırır ve UI öğelerinden bağımsız çalışacak şekilde düzenler. Bu yeniden düzenleme, turnuva kurallarının tek bir yerde yer almasını ve her yerde yeniden kullanılabilir olmasını sağlar.
Eşleşmeleri Puanlama ve Doğru Bir Şekilde Baylar Yürütme
21:37'de Tim, eşleşmelerin nasıl puanlandığını yeniden düzenler. Tek bir eşleşme ile çalışmak yerine, tüm turlar ve tüm eşleşmeler üzerinde döner, puanlanması gereken eşleşmelerin bir listesini oluşturur.
Tamamlanan oyunları ve bay haftalarını algılama mantığını açıklar. Tim, geçmişte bay haftaların sahte skorlar atayarak 'hacky' bir şekilde ele alındığını belirtir. Yeniden düzenleme, bayları açıkça ve saf bir şekilde ele almasını sağlar.
Özel Metodlara Puanlama Çıkartma
28:17'de Tim, puanlama mantığını özel bir metoda çıkartır. Daha küçük, odaklanmış metodların kodun anlamasını ve bakımını daha kolay hale getirdiğini açıklar.
Ayrıca, metodları daha iyi yansıtacak şekilde isimlendirerek, puanlama mantığını, eşleşmelerde kazananları 'işaretleyen' bir şeye dönüştürmek gibi açıklık getirir.
Yapılandırılabilir Kazanan Belirleme
29:58'den başlayarak, Tim kazanan belirleme mantığını yüksek skorlu kazanımlar ve düşük skorlu kazanımlar senaryolarını ele alacak şekilde yeniden düzenler. Yeni bir uygulama ayarı tanıtır ve yapılandırmanın neden sert kodlama kurallarından daha iyi olduğunu açıklar.
Tim, bu değeri turnuva modelinde saklamak gibi alternatif tasarımları tartışır, ancak bu değişikliğin bu dersin kapsamı dışında olduğunu açıklar.
Kazananları İlerletme ve Sonuçları Kaydetme
45:40'ta Tim, kazananları bir sonraki tura ilerletmeye başlar. Kazananların ebeveyn eşleşmelerle nasıl eşleştiğini ve verileri doğru zamanda kaydetmenin neden kritik olduğunu açıklar.
Daha sonra, 52:10 civarında, eşleşmeleri güncellerken geleneksel bir döngüye fonksiyonel olarak eşdeğer ancak daha kompakt olan kısa bir ForEach yaklaşımını gösterir.
Yeniden Düzenleme ile Tanıtılan Hataları Düzeltme
58:33'te Tim, veritabanında yanlış veri keşfeder ve sorunu turnuva kaydedilmeden önce çağrı mantığına kadar izler. Yeniden düzenlemenin yeni hatalar yaratmaktan ziyade gizli hataları ortaya çıkardığını açıklar.
Güncelleme mantığını doğru yere kaydırarak- kalıcılıktan sonra- Tim sorunu çözümler ve uygulamayı tekrar test eder.
Yeniden Düzenleme Üzerine Son Düşünceler
1:09:00'da Tim, bu derste yeniden düzenlemenin ne kazandığını özetleyerek bitirir. Yeniden düzenlemenin sadece daha temiz kod hakkında değil, aynı zamanda kenar durumları ele almak, tasarım kusurlarını düzeltmek ve gelecekteki değişikliklere hazırlıklı olmakla ilgili olduğunu açıklar.
Yeniden düzenlemenin sürekli bir süreç olduğunu ve sonraki dersin hata yönetimine odaklanacağını belirtir.
Kapanış Notu
Bu ders, yeniden düzenlemenin gerçek projelerde tam olarak nasıl gerçekleştiğini gösterir: aşamalı, bazen dağınık, ama nihayetinde ödüllendirici. Tim Corey'nin adım adım yaklaşımını izleyerek, WinForms uygulamalarını işlevsellik bozulmadan ve ne yapılacağını tahmine gerek bırakmadan nasıl geliştireceğiniz konusunda pratik bir plan elde edersiniz.

