Menu
Coddy logo textTech

Setter Metotlarında Doğrulama

Coddy'nin C Journey'sinin Object Oriented Programming 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 failure durumunu belirtmek için bir durum kodu döndürmeyi de seçebilirsin:

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

Bir setter içindeki doğrulamayı kullanarak verilerini koruyan bir Temperature modülü oluşturalım. Yalnızca geçerli bir aralıktaki değerleri accept eden bir sıcaklık takipçisi oluşturacaksın: setter'ların nesnenizin durumunu nasıl koruduğunu göstereceksin.

Üç dosya oluşturacaksın:

  • temperature.h: opaque pointer pattern kullanan public interface'in. Yalnızca bir forward declaration ile Temperature türünü Declare et. Şu işlevleri Declare et:
    • create_temperature: initial degrees için bir integer alır ve bir Temperature pointer döndürür
    • free_temperature: allocated memory'yi serbest bırakır
    • temp_get_degrees: current temperature value'yu döndüren getter
    • temp_set_degrees: bir int döndüren setter (başarı için 1, failure için 0)
    TEMPERATURE_H sembolüyle include guards kullan.
  • temperature.c: hidden int degrees member içeren gerçek struct Temperature'ı Define et. Tüm işlevleri Implement et. Önemli nokta setter'ındır. Yalnızca -50 ile 150 (inclusive) arasındaki değerleri accept etmelidir. Değer bu aralığın dışındaysa 0 döndür ve temperature'ı değiştirmeden leave et. Değer geçerliyse değeri güncelle ve 1 döndür.
  • main.c: hem geçerli hem de invalid sıcaklıkları ayarlamayı deneyerek validation'ı göster; invalid değerlerin reddedildiğini, geçerli olanların ise accept edildiğini göster.

Üç input alacaksın: initial temperature, ayarlanacak bir geçerli sıcaklık (aralık içinde) ve denenmek üzere bir invalid temperature (aralık dışında).

main dosyanda initial value ile bir Temperature oluştur ve yazdır. Ardından invalid temperature'ı ayarlamayı dene; reddedilmesi gerektiği için sonucu yazdır ve value'nun unchanged kaldığını göster. Son olarak geçerli sıcaklığı ayarla, başarı sonucunu yazdır ve güncellenen value'yu göster. Memory'yi free et ve cleanup işlemini onayla.

Çıktıyı şu formatta yazdır:

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

Örneğin input olarak 25, 100 ve 200 verildiğinde çıktı şöyle olur:

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

Bu, encapsulation'ın gerçek gücünü gösterir. Setter'ın, geçerli bir sıcaklığı neyin oluşturduğuna ilişkin kuralları enforce eder ve external code hangi değerleri assign etmeye çalışırsa çalışsın object's integrity'sini 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.

Object Oriented Programming bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi