Menu
Coddy logo textTech

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 setter'lar oluşturduk. Ancak bu, kapsüllemenin önemli bir faydasını gözden kaçırır: doğrulama mantığı ekleyerek verilerinizi koruyabilme.

Asla negatif olmaması gereken bir Counter düşünün. Kapsülleme olmadan herkes c->value = -50 yazabilir ve 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;
}

Şimdi 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 desen, çağıranın işlemin başarılı olup olmadığını bilmesini sağlar. Temel fikir, setter'ların yalnızca atama işlemiyle ilgili olmadığıdır: Bunlar, nesnenizin durumunun hangi kurallara uyması gerektiğini zorunlu kılan bekçilerdir. Kapsüllemenin asıl gücü budur: Nesneniz, harici kod ne yapmaya çalışırsa çalışsın, kendi bütünlüğünü korur.

challenge icon

Görev

Kolay

Verilerini setter içindeki doğrulama ile koruyan bir Temperature modülü oluşturalım. Yalnızca geçerli bir aralıktaki değerleri kabul eden bir sıcaklık takipçisi oluşturacaksın: setter'ların nesnenin durumu için nasıl bekçi görevi gördüğünü göstereceksin.

Üç dosya oluşturacaksın:

  • temperature.h: Opak işaretçi desenini kullanan genel arayüzün. Yalnızca ileri bildirim kullanarak bir Temperature türü bildir. Şu işlevleri bildir:
    • create_temperature: başlangıç dereceleri için bir tamsayı alır ve bir Temperature işaretçisi döndürür
    • free_temperature: ayrılan 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üyle include guard'ları kullan.
  • temperature.c: Gizli bir struct Temperature üyesiyle gerçek int degrees yapısını tanımla. Tüm işlevleri uygula. Önemli nokta setter'dır. Yalnızca -50 ile 150 arasındaki (bu değerler dahil) değerleri kabul etmelidir. Değer bu aralığın dışındaysa 0 döndürmeli ve sıcaklığı değiştirmemelidir. Değer geçerliyse değeri güncellemeli ve 1 döndürmelidir.
  • main.c: Hem geçerli hem de geçersiz sıcaklıkları ayarlamayı deneyerek doğrulamayı göster; geçersiz değerlerin reddedildiğini, geçerli değerlerin ise kabul edildiğini göster.

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

main dosyanda başlangıç değeriyle bir Temperature oluştur ve yazdır. Ardından, reddedilmesi gerektiği için geçersiz sıcaklığı ayarlamayı dene; sonucu yazdır ve değerin değişmeden kaldığını göster. Son olarak geçerli sıcaklığı ayarla, başarı sonucunu yazdır ve güncellenmiş değeri göster. Belleği serbest bırak ve temizleme işlemini doğrula.

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

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

Örneğin 25, 100 ve 200 girdileriyle çı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, geçerli bir sıcaklığın ne olduğunu belirleyen kuralları uygulayarak dış kod hangi değerleri atamaya çalışırsa çalışsın 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}"
    // Format: "After invalid: {degrees}"
    
    // TODO: Geçerli sıcaklığı ayarla
    // Başarı sonucunu yazdır ve güncellenmiş 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