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.
Görev
KolaySetter'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 birTemperaturetü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ürfree_temperature: ayrılmış 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ünü kullanarak include guard'lar ekleyin.temperature.c: Gizli birint degreesüyesiyle gerçekstruct Temperatureyapı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
FreedBu, 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;
}
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