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.
Görev
KolayVerilerini 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 birTemperaturetü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ürfree_temperature: ayrılan belleği serbest bırakırtemp_get_degrees: geçerli sıcaklık değerini döndüren gettertemp_set_degrees: birintdöndüren setter (başarı için 1, başarısızlık için 0)
TEMPERATURE_Hsembolüyle include guard'ları kullan.temperature.c: Gizli birstruct Temperatureüyesiyle gerçekint degreesyapı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
FreedBu, 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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi