Menu
CoddyTech

Setter Metotlarında Doğrulama

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 20 / 61.

Önceki derste, yalnızca değer atayan temel ayarlayıcılar oluşturduk. Ancak bu, kapsüllemenin önemli bir faydasını gözden kaçırıyor: doğrulama mantığı ekleyerek verilerinizi koruma olanağını.

Asla negatif olmaması gereken bir Counter düşünün. Kapsülleme olmadan herkes c->value = -50 yazıp durumu bozabilir. Bir setter ile hangi değerlere izin verileceğini kontrol edersiniz:

// counter.c
void counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return;  // Geçersiz girdiyi sessizce reddet
    }
    c->value = new_value;
}

Artık negatif değerler basitçe yok sayılıyor.

Başarıyı veya başarısızlığı belirtmek için bir durum kodu döndürmeyi de seçebilirsiniz:

int counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return 0;  // Başarısızlık
    }
    c->value = new_value;
    return 1;  // Başarı
}

Bu kalıp, çağıranın işlemin başarılı olup olmadığını anlamasını sağlar. Önemli nokta, setter'ların yalnızca atamayla ilgili olmadığıdır: Bunlar, nesnenizin durumunun ne olabileceğine ilişkin kuralları uygulayan bekçilerdir. Kapsüllemenin gerçek gücü budur: Harici kod ne yapmaya çalışırsa çalışsın, nesneniz kendi bütünlüğünü korur.

challenge icon

Görev

Kolay

Setter'da doğrulama kullanarak verilerini koruyan bir Temperature modülü oluşturalım. Yalnızca geçerli bir aralıktaki değerleri kabul eden bir sıcaklık izleyici oluşturacaksınız: setter'ların nesnenizin durumu için nasıl bekçi görevi gördüğünü göstereceksiniz.

Üç dosya oluşturacaksınız:

  • temperature.h: Opak işaretçi desenini kullanan genel arayüzünüz. Yalnızca ileri bildirimle bir Temperature türü bildirin. Şu işlevleri bildirin:
    • create_temperature: başlangıç derecesi için bir tamsayı alır ve bir Temperature işaretçisi döndürür
    • free_temperature: ayrılmış belleği serbest bırakır
    • temp_get_degrees: geçerli sıcaklık değerini döndüren getter
    • temp_set_degrees: bir int döndüren setter (başarı için 1, başarısızlık için 0)
    TEMPERATURE_H sembolünü kullanarak include guard'lar ekleyin.
  • temperature.c: Gizli bir int degrees üyesiyle gerçek struct Temperature yapısını tanımlayın. Tüm işlevleri uygulayın. Önemli olan setter'dır. Yalnızca -50 ile 150 arasındaki değerleri (dahil) kabul etmelidir. Değer bu aralığın dışındaysa 0 döndürün ve sıcaklığı değiştirmeyin. Değer geçerliyse güncelleyin ve 1 döndürün.
  • main.c: Hem geçerli hem de geçersiz sıcaklıkları ayarlamayı deneyerek doğrulamayı gösterin; geçersiz değerlerin reddedildiğini, geçerli değerlerin ise kabul edildiğini gösterin.

Üç girdi alacaksınız: başlangıç sıcaklığı, ayarlanacak bir geçerli sıcaklık (aralık içinde) ve denenmesi için bir geçersiz sıcaklık (aralık dışında).

Ana dosyanızda başlangıç değerine sahip bir Temperature oluşturun ve yazdırın. Ardından, reddedilmesi gerektiğinden geçersiz sıcaklığı ayarlamayı deneyin; sonucu yazdırın ve değerin değişmeden kaldığını gösterin. Son olarak geçerli sıcaklığı ayarlayın, başarı sonucunu yazdırın ve güncellenen değeri gösterin. Belleği serbest bırakın ve temizliğin yapıldığını doğrulayın.

Çıktıyı şu biçimde yazdırın:

Initial: {degrees}
Set {invalid}: {0 or 1}
After invalid: {degrees}
Set {valid}: {0 or 1}
After valid: {degrees}
Freed

Örneğin, girdiler 25, 100 ve 200 olduğunda çıktı şöyle olur:

Initial: 25
Set 200: 0
After invalid: 25
Set 100: 1
After valid: 100
Freed

Bu, kapsüllemenin gerçek gücünü gösterir. Setter'ınız, geçerli bir sıcaklığın ne olduğunu belirleyen kuralları uygular ve harici kodun atamaya çalıştığı değerlerden bağımsız olarak nesnenin bütünlüğünü korur.

Kendin dene

#include <stdio.h>
#include "temperature.h"

int main() {
    // Girdileri oku
    int initial, valid_temp, invalid_temp;
    scanf("%d", &initial);
    scanf("%d", &valid_temp);
    scanf("%d", &invalid_temp);
    
    // TODO: Başlangıç değeriyle bir Temperature oluştur
    
    // TODO: Başlangıç sıcaklığını yazdır
    // Biçim: "Initial: {degrees}"
    
    // TODO: Geçersiz sıcaklığı ayarlamayı dene
    // Sonucu yazdır ve değerin değişmediğini göster
    // Biçim: "Set {invalid}: {0 or 1}"
    // Biçim: "After invalid: {degrees}"
    
    // TODO: Geçerli sıcaklığı ayarla
    // Başarı sonucunu yazdır ve güncellenen değeri göster
    // Biçim: "Set {valid}: {0 or 1}"
    // Biçim: "After valid: {degrees}"
    
    // TODO: Belleği serbest bırak ve "Freed" yazdır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi