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.
Görev
KolayBir 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 ileTemperaturetü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ürfree_temperature: allocated memory'yi serbest bırakırtemp_get_degrees: current temperature value'yu döndüren gettertemp_set_degrees: birintdöndüren setter (başarı için 1, failure için 0)
TEMPERATURE_Hsembolüyle include guards kullan.temperature.c: hiddenint degreesmember içeren gerçekstruct 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
FreedBu, 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;
}
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
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