Altbilgi içeriğine atla
Iron Academy Logo
C# Uygulaması
C# Uygulaması

Diğer Kategoriler

C# Arayüz: Ödül Formunun Bağlantısını Anlamak (Tim Corey, Ders 09)

[[academy-video-youtube({"vid": "5oHfcyrlHeE", "start_time": "0", "title": "C# Uygulaması Baştan Sona Ders 09 - Ödül Formunu Bağlamak", "creator": "Tim Corey", "length": "1h 27m 22s"})]]

Tim Corey'nin "C# Uygulaması Baştan Sona" serisinde, Ders 09 bir ödül formunu bağlamaya odaklanıyor. Yüzeyde bu form, sadece kullanıcı girişini toplamak, doğrulamak, bir model oluşturmak ve kaydetmek gibi görünüyor. Ancak Tim, asıl karmaşıklığın verilerin nereye kaydedileceğine karar vermekte yattığını açıklıyor: bir veritabanı, bir metin dosyası veya her ikisi. Tim'in videosu, C# programlamasında bir temel konsept olan arayüzleri tanıtarak çözümü izah ediyor.

Bu makalede, Tim'in açıklamaları üzerinden arayüzlere daha derin bir bakış atacağız, böylece ölçeklenebilir, sürdürülebilir uygulamaların nasıl oluşturulduğunu daha iyi anlayacaksınız.

Sorun: Verileri Nereye Kaydediyoruz?

Tim, ödül formunun amacını belirterek başlar: girişi alır, doğrular ve depolamaya kaydeder. Ancak, asıl zorluğun verilerin nereye kaydedileceğine karar vermek olduğunu uyarıyor. Öğreticilerin genellikle bunu atladığını çünkü kolay olmadığını vurguluyor, ancak öğrencilerin bu konuyu doğrudan ele almalarını istiyor.

Başlangıçta, basit bir çözüm denemeniz mümkün olduğunu anlatıyor: SQL veya bir metin dosyası kullanıp kullanmadığınızı kontrol eder, ardından doğru kaydetme işlemini gerçekleştirirsiniz. Fakat Tim, bunun ne kadar kötü ve sürdürülemez hale geldiğini hızla gösteriyor. Eğer her form hangi depolama türünü kullanacağını kontrol etmek zorunda kalırsa, kod yinelenir, dağınık hale gelir ve değişiklik yapmak zorlaşır.

Çirkin Yol: Sabit Koşullar

Tim, bir pseudo-kod örneği çiziyor. SQL kullanımı == true gibi bir Boolean değeri kontrol ederek, bir veritabanı bağlantısını açıp modeli kaydedip, bir ID ile birlikte geri döndürebileceğinizi açıklıyor. Sonra metin dosyaları için aynı şeyi yapabilir, manuel olarak bir ID oluşturabilirsiniz çünkü metin dosyaları bunu otomatik olarak yapmaz.

Bu işlemin hızla tekrarlı hale geldiğine işaret ediyor. Birden fazla formun bu mantığa ihtiyacı var ve her yeni bir veri kaynağı eklediğinizde, örneğin MySQL gibi, her formu güncellemeniz gerekiyor. Tim buna "ölçeklenemez" diyor ve "Kendini Tekrarlama" (DRY) ilkesini ihlal ettiğini vurguluyor. "Daha iyi bir yol olmalı" diye açıkça ifade ediyor.

İpi Çekmek: Daha İyi Yaklaşım

Tim, stratejisini tanıtıyor: ipi çekmek. Kodun hangi bilgiye ihtiyacı olduğunu ve bunun nereden geldiğini sorarak başlıyor. İki anahtar sorunu belirliyor:

Hangi veri kaynağını kullanacağımızı nasıl bileceğiz?

Aynı görevi yapmak için iki farklı veri kaynağına nasıl bağlanırız?

Tim, gerçek kaydetme işleminin farklı olan tek şey olduğunu açıklıyor. Form perspektifinden, sadece "İşte model." demesi gerekiyor. "Kaydet." Formun SQL veya metin dosyasına kaydedip kaydetmeyeceği konusunda endişelenmemesi gerekiyor.

Çözüm: Küresel Konfigürasyon + Arayüz

Tim, küresel bir konfigürasyon sistemini öneriyor. Hangi veri kaynağının kullanılacağını bilmek için, uygulamanın küresel olarak erişilebilir verilere ihtiyacı olduğunu ve bu bilgiyi saklamak için statik bir sınıf kullanmayı öneriyor. Genellikle küresel değişkenlerden kaçınıldığını kabul ediyor, ancak bu durumda, küresel verilerin tam olarak ihtiyaç duyulan şey olduğunu belirtiyor.

Sonraki adımda, Tim anahtar kavramı açıklıyor: arayüzler. Bir arayüzü, onu uygulayan her sınıfın belirli yöntemler veya özellikler içereceği bir sözleşme olarak tanımlıyor. Tim, bunun uygulamanın veri kaynağından bağımsız olarak aynı yöntemi çağırmasını sağladığını vurguluyor. Formun SQL veya metin dosyası olup olmadığı umurunda değil; yalnızca yöntemi çağırmakla ilgileniyor.

"Eğer aynı görevi yapmanız gerekiyor fakat arka planda iki farklı şekilde yapılacaksa, bir arayüze ihtiyacınız var." diyor.

Arayüz Oluşturma

Tim, İzleyici Kütüphanesi içinde bir arayüz oluşturarak pratik uygulamaya geçiyor. İsmini IDataConnection koyuyor ve arayüzlere "I" ekinin eklenmesi geleneğini açıklıyor. Bunun, onun bir arayüz olarak açıkça tanımlanması için önemli olduğunu vurguluyor.

Tim, arayüze tek bir yöntem ekliyor:

PrizeModel CreatePrize(PrizeModel model);

Bu yöntemin bir sözleşme olduğunu, IDataConnection'ı uygulayan herhangi bir sınıfta bulunması gerektiğini açıklıyor. Form, bu yöntemi çağıracak ve ID ile birlikte bir PrizeModel dönmeyi bekleyecek. Bu şekilde, formun depolama türüne kayıtsız kalmasını nasıl sağladığını açıklıyor.

Küresel Konfigürasyon Statik Sınıfını Oluşturma

Sonraki adımda, Tim GlobalConfig isminde bir statik sınıf oluşturuyor. Statik bir sınıfın örneklenemeyeceğini ve küresel olarak erişilebilir olduğunu açıklıyor. Bu, uygulamanın mevcut veri bağlantılarını depolayacağı yerdir.

Bir özellik tanımlıyor:

public static List<IDataConnection> Bağlantılar { get; private set; }

Listeyi yalnızca sınıfın kendisinin değiştirebilmesi, diğer kısımların ise sadece okuyabilmesi için private set kullanılmasını açıklıyor.

Sonra yöntemi oluşturuyor:

public static void InitializeConnections(bool veritabanı, bool metinDosyaları)

Bu yöntem mevcut veri bağlantılarını kurar. Tim, listenin birden fazla bağlantıya izin verdiğini vurguluyor, böylece uygulama SQL, metin dosyaları veya her iki kaynağa kaydedebilir.

Arayüzleri Anlamak: Gerçek Dünya Örneği

Tim öğrencilere bunun karışık ama ulaşılabilir bir materyal olduğunu hatırlatmak için duraksıyor. Bir kez videoyu izlemeyi, sonra kodlamayı yeniden izlemeyi öneriyor.

Arayüzün bir sözleşme olduğunu, ve onu uygulayan herhangi bir sınıfın sözleşmeye uymak zorunda olduğunu açıklıyor. SQLConnector sınıfını oluşturarak IDataConnection'ı uyguladığını gösteriyor.

Sınıf oluşturulduğunda, Visual Studio sözleşmenin henüz yerine getirilmediği konusunda uyarıyor. "Implement Interface" seçeneğinin kullanılmasını ve "CreatePrize" yöntemini otomatik olarak oluşturmayı gösteriyor. Ayrıca, NotImplementedException scaffold'un neden var olduğunu açıklıyor—yöntemin çalıştığını iddia etmeden kodun derlenmesine izin veriyor.

SQL ve Metin Bağlayıcıları Oluşturma

Tim, IDataConnection'ı uygulayan SQLConnector ve TextConnector sınıflarını ekliyor. Bir SQL veritabanına kaydetmek ve bir metin dosyasına kaydetmek arasındaki süreçlerin çok farklı olmasına rağmen, her iki sürecin de aynı arayüz sözleşmesini yerine getirdiğini açıklıyor.

Şimdilik basit bir örnek geri dönüş değeri ekliyor ve gerçek kaydetme mantığını daha sonra uygulamak için kendine hatırlatıcı olarak TODO yorumlarını yerleştiriyor. Bu, uygulamanın işlevsel kalmasını sağlarken ders boyunca ilerlemesini sağlıyor.

Son Kurulum: Küresel Konfigürasyonu Bağlamak

Tim, GlobalConfig sınıfına dönüyor ve gerçek bağlantıları bağlıyor. Bağıntı listesini nasıl başlatacağını ve ona SQLConnector ve TextConnector örneklerini ekleyeceğini gösteriyor.

Neden ayrı ayrı iki if ifadesi gerektiğini, if-else yerine neden bunun tercih edildiğini açıklıyor—çünkü kullanıcı aynı anda her iki veri kaynağına da kaydetmek isteyebilir.

InitializeConnections Nereye Çağırılır?

Tim, InitializeConnections'ın uygulamanın başlangıcında çağrılması gerektiğini açıklıyor. Program.cs'i değiştiriyor ve çağırıyor:

GlobalConfig.InitializeConnections(true, true);

form başlatılmadan önce. Bu, bağlantı listesinin hazır ve uygulama boyunca erişilebilir olmasını sağlar.

Ardından başlatma formunu CreatePrizeForm olarak değiştiriyor, böylece işlevselliği hemen test edebilir.

Ödül Formunu Doğrulama

Tim formu açıyor ve ilk görevi açıklıyor: dört alanı doğrulamak. Olay işleyicilerini temiz tutmayı tercih ettiğinden, ValidateForm() adında özel bir yöntem oluşturuyor.

Bu yöntemin sadece düğme tıklamasıyla değil, her yerden çağrılabileceğini söylüyor. Formun geçerli olup olmadığını belirten bir Boolean değer döndürüyor. Çıkış değişkeni kullanımını gösteriyor:

bool çıktı = true; return çıktı;

Tim, doğru başlangıç noktasını tercih ettiğini çünkü bir şey yanlışsa değeri false'a değiştirmesinin daha kolay olduğunu ifade ediyor.

Sıra Numaranı Kontrol Etme

Tim, ilk doğrulamayı açıklıyor: sıra numarası sıfırdan büyük bir tam sayı olmalıdır.

PlaceNumberValue.Text'i (bir dize) bir tam sayıya dönüştürmek için int.TryParse kullanıyor. TryParse'ın nasıl çalıştığını açıklıyor:

  • Bir dize alıp bir sayıya dönüştürmeye çalışır.

  • Başarı veya başarısızlığı belirten bir Boolean döndürür.

  • Çıktı parametresi kullanarak dönüştürülen değeri çıkışa aktarır.

Tim, TryParse'ın Parse'dan daha güvenli olduğunu çünkü yanlış girdiyle çökmediğini, false döndüğünü ve çıktıyı sıfıra ayarladığını vurguluyor.

Ardından mantığa açıklık getiriyor:

  • Eğer placeNumberValidNumber false ise, output = false ayarla.

  • Eğer placeNumber < 1 ise, output = false ayarla.

Tim, burada else ifadelerinden kaçınılmasını çünkü bu yöntemin birden fazla kontrol içerdiğini uyarıyor. Bir kontrol başarısız olursa, yöntem diğerlerini değerlendirmeye devam etmeli ve tüm hataları toplamalıdır.

Yer Adını Doğrulama

Tim, bir sonraki doğrulama olan yer adının boş olamaması gerektiğine geçiyor.

Şöyle kontrol ediyor:

if (placeNameValue.Text.Length == 0) { output = false; }

Gerçek bir uygulamada, her başarısız doğrulama için hata mesajları göstereceğinizi açıklıyor. Ama şimdilik basit tutuyor ve sadece true/false dönüyor.

Ödül Miktarı ve Yüzdesini Doğrulama

Formun ya bir ödül miktarı ya da ödül yüzdesi içermesi gerektiğini, bunlardan birinin sıfırdan büyük olması gerektğini açıklıyor. Önemli farkı not ediyor:

  • Ödül yüzdesi bir tam sayı (int)

  • Ödül miktarı ondalık (decimal) çünkü para birimleri kuruş içerebilir.

Değişkenler oluşturuyor:

decimal ödülMiktarı = 0; int ödülYüzdesi = 0;

Her ikisi için de TryParse kullanıyor:

bool ödülMiktarıGeçerli = decimal.TryParse(ödülMiktarıDeğeri.Text, out ödülMiktarı); bool ödülYüzdesiGeçerli = int.TryParse(ödülYüzdesiDeğeri.Text, out ödülYüzdesi);

Her ikisinin de geçerli sayılar olması gerektiğini açıklıyor. Eğer biri geçersizse, form geçersiz olur.

Ardından, en az birinin sıfırdan büyük olduğundan emin olun:

if (ödülMiktarı <= 0 && ödülYüzdesi <= 0) { çıktı = false; }

Tim, yüzdelik değerin 0 ile 100 arasında olduğunu kontrol eden bir kontrol ekliyor:

if (ödülYüzdesi < 0|| ödülYüzdesi > 100) { çıktı = false; }

Nedeni açıklıyor: %150 vereceğiniz anlamına gelir ki bu ödül havuzundan daha fazla vermek olur, bu da imkansızdır.

Doğrulama Sonucunu Kullanmak

Tüm kontroller tamamlandığında, Tim sonucu nasıl kullanacağınızı açıklıyor:

if (ValidateForm()) { // model oluştur ve kaydet } else { MessageBox.Show("Bu formda geçersiz bilgiler var. Lütfen kontrol edin ve tekrar deneyin."); }

Tim, ilk hata durumunda erken dönüş yapabileceğinizi ancak tüm doğrulamaları çalıştırmayı tercih ettiğini belirtiyor, böylece kullanıcılar tüm doğrulama hatalarını bir kerede görebilir. Bu, sinir bozucu durumları azaltır çünkü her şeyi tek seferde tamir edebilirsiniz.

PrizeModel Oluşturma

Form geçerli olduktan sonra, Tim bir PrizeModel oluşturmanın sonraki adım olduğunu açıklıyor.

Bir modeli nasıl oluşturulacağını gösteriyor:

ÖdülModeli model = new ÖdülModeli(); model.KonumAdı = konumAdıDeğeri.Text; model.KonumNumarası = konumNumarasıDeğeri.Text; // sorun: bu bir dizedir

Tim, sorunu vurguluyor: PlaceNumber bir tam sayı, ama form değeri bir dizedir. Bunu çözmek için iki seçenek sunduğunu anlatıyor:

  • Her değeri formda tekrar çözümlemek (tekrarlayıcı).

  • PrizeModel'a bir constructor overload ekleyin.

Tim, ikinci şıkkı seçiyor.

PrizeModel'da Aşırı Yüklenmiş Constructor

Tim, dört dize kabul eden aşırı yüklenmiş bir constructor ekliyor:

public ÖdülModeli(string konumAdı, string konumNumarası, string ödülMiktarı, string ödülYüzdesi)
{
    KonumAdı = konumAdı;
    KonumNumarası = int.TryParse(konumNumarası, out int konumNumarasıDeğeri) ? konumNumarasıDeğeri : 0;
    ÖdülMiktarı = decimal.TryParse(ödülMiktarı, out decimal ödülMiktarıDeğeri) ? ödülMiktarıDeğeri : 0;
    ÖdülYüzdesi = double.TryParse(ödülYüzdesi, out double ödülYüzdesiDeğeri) ? ödülYüzdesiDeğeri : 0;
}

Tim, çözümlemenin başarısız olmasını umursamadığını çünkü varsayılan olarak sıfıra ayarlanacağını, bunun da zaten sayılar için varsayılan değer olduğunu açıklıyor.

Bu constructor formun PrizeModel türünde string girdilerle doğrudan oluşturmasına ve modelin çözümleme işini üstlenmesine olanak tanıyor.

Modeli Kaydetmek İçin IDataConnection Kullanma

Şimdi model var olduğuna göre, Tim onun küresel bağlantılar listesi kullanılarak nasıl kaydedileceğini açıklıyor.

Bir foreach döngüsü kullanıyor:

foreach (IDataConnection db in GlobalConfig.Connections) { db.CreatePrize(model); }

Bu döngünün her bağlantı için (SQL ve metin dosyası) CreatePrize() işlevini çağırdığını açıklıyor. Yöntemler henüz uygulanmamış olmasına rağmen, form çalışıyor ve bilgilerin kaydedildiğini iddia ediyor. Bu, arayüz ve küresel konfigürasyon deseninin çalıştığını kanıtlar.

Formu Test Etme

Tim, erken test etmenin önemini vurguluyor. Kırılma noktaları ekleyip uygulamayı çalıştırıyor.

  • Önce boş bir formu test ediyor.

  • ValidateForm() üzerinden geçiyor.

  • Çıktının false olduğunu görüyor ve doğrulamanın beklediği gibi başarısız olduğunu öngörüyor.

  • Sonra geçerli verileri doldurup yapıcı modelin doğru bir şekilde doldurulduğunu onaylıyor.

  • Döngünün her iki bağlantıdan geçtiğini de teyit ediyor.

Tim, formun işlevsel olduğunu ve desenin doğrulandığını gösteriyor.

Son Temizlik: Formu Temizleme

Tim birkaç son düzenleme yapıyor:

  • Başarılı bir ödül oluşturduktan sonra form alanlarını temizleyin.

  • Ödül miktarı ve yüzdesi için varsayılan değerleri 0 olarak belirleyin, böylece kullanıcılar her seferinde sıfır girmek zorunda kalmasın.

Ardından geçerli bir gönderimden sonra formun doğru bir şekilde temizlendiğini onaylıyor.

Sonraki Adımlar Nelerdir?

Tim, bir video ile bitirirken, bir sonraki adımın SQL ve metin bağlantı sınıflarını verileri gerçekten kaydedecek şekilde bağlamak olduğunu belirtiyor.

Bir sonraki derste, SQL bağlayıcısını uygulayacağı ve gerçekten veritabanına bağlanacağı zaman devam etmesini hatırlatıyor.

Hero Worlddot related to C# Arayüz: Ödül Formunun Bağlantısını Anlamak (Tim Corey, Ders 09)
Hero Affiliate related to C# Arayüz: Ödül Formunun Bağlantısını Anlamak (Tim Corey, Ders 09)

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js ile çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara