Getter ve Setter Metotları
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 19 / 61.
Opak işaretçiler (opaque pointers) ile struct üyeleri dış koddan gizlenir. Ancak harici kod verilere doğrudan erişemiyorsa, veriyi nasıl okuruz veya değiştiririz? Cevap, getter ve setter fonksiyonlarıdır; yani gizli verilere kontrollü erişim sağlayan genel arayüzlerdir.
Bir getter, gizli bir üyenin değerini döndürür:
// counter.h
int counter_get_value(const Counter *c);
// counter.c
int counter_get_value(const Counter *c) {
return c->value;
}
Bir setter gizli bir üyeyi değiştirir:
// counter.h
void counter_set_value(Counter *c, int new_value);
// counter.c
void counter_set_value(Counter *c, int new_value) {
c->value = new_value;
}
İsimlendirme kuralına dikkat edin: çakışmaları önlemek ve API'yi netleştirmek için fonksiyonlara tür adını (counter_) önek olarak ekleyin. Getter'lar, nesneyi değiştirmedikleri için const işaretçileri kullanır.
Artık harici kod, gizli verilerle güvenli bir şekilde etkileşime girebilir:
// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c)); // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c)); // 25
Bu desen, veriye nasıl erişildiği üzerinde size tam kontrol sağlar; bu, bir sonraki derste setter'lara doğrulama mantığı eklediğimizde üzerine inşa edeceğimiz bir temeldir.
Görev
KolayGetter ve setter fonksiyonları ile opak işaretçi (opaque pointer) desenini kullanan bir Score modülü oluşturalım. Harici kodun verilerle yalnızca sağladığınız genel arayüz üzerinden etkileşime girebileceği gizli bir puan takipçisi oluşturacaksınız.
Üç dosya oluşturacaksınız:
score.h: Genel arayüzünüz. Bir ileri bildirim (forward declaration) kullanarak (struct gövdesi olmadan!) opak birScoretürü bildirin. Şu fonksiyonları bildirin:create_score— başlangıç puanları için bir tam sayı alır ve bir Score işaretçisi döndürürfree_score— bir Score işaretçisi alır ve belleği serbest bırakırscore_get_points— birconst Score *alan ve mevcut puanları döndüren bir getterscore_set_points— birScore *ve bir tam sayı alan, puan değerini güncelleyen bir setter
SCORE_Hsembolü ile include guard kullanın.score.c: Tek bir gizli üyeye sahip gerçekstruct Scoreyapısını tanımlayın:int points. Dört fonksiyonun hepsini uygulayın. Getter'ınız gizli değeri döndürmeli ve setter'ınız bu değeri güncellemelidir. Getter'ların nesneyi değiştirmedikleri içinconstişaretçiler kullandığını unutmayın.main.c: Bir puan oluşturarak, değerini okuyarak, setter aracılığıyla değiştirerek ve tekrar okuyarak modülünüzü gösterin.
İki girdi alacaksınız: başlangıç puanları (bir tam sayı) ve ayarlanacak yeni puan değeri (bir tam sayı).
Ana dosyanızda, başlangıç puanlarıyla bir Score oluşturun, getter kullanarak mevcut değeri yazdırın, yeni değerle setter kullanarak güncelleyin, güncellenmiş değeri yazdırın, ardından puanı serbest bırakın ve bir onay mesajı yazdırın.
Çıktıyı şu formatta yazdırın:
Initial: {points}
Updated: {points}
FreedÖrneğin, 100 ve 250 girdileriyle çıktı şöyle olacaktır:
Initial: 100
Updated: 250
Freedmain.c dosyasının points değerine doğrudan nasıl erişemediğine dikkat edin; getter ve setter fonksiyonlarınızdan geçmek zorundadır. Bu, eylem halindeki kapsülleme (encapsulation) işlemidir: gizli verilerin tam olarak nasıl okunabileceğini ve değiştirilebileceğini siz kontrol edersiniz.
Kopya kağıdı
Opak işaretçilerle (opaque pointers), struct üyeleri dış koddan gizlenir. Bu özel verilere erişmek veya bunları değiştirmek için getter ve setter fonksiyonlarını kullanın.
Bir getter, gizli bir üyenin değerini döndürür ve nesneyi değiştirmediği için bir const işaretçi kullanır:
// counter.h
int counter_get_value(const Counter *c);
// counter.c
int counter_get_value(const Counter *c) {
return c->value;
}
Bir setter, gizli bir üyeyi değiştirir:
// counter.h
void counter_set_value(Counter *c, int new_value);
// counter.c
void counter_set_value(Counter *c, int new_value) {
c->value = new_value;
}
Çakışmaları önlemek ve API'yi netleştirmek için tür adını önek (counter_) olarak kullanan bir adlandırma kuralı kullanın.
Dış kod, gizli verilerle bu fonksiyonlar aracılığıyla etkileşime girer:
// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c)); // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c)); // 25
Kendin dene
#include <stdio.h>
#include "score.h"
int main() {
int initial_points, new_points;
scanf("%d", &initial_points);
scanf("%d", &new_points);
// TODO: initial_points ile bir Score oluştur
// TODO: Getter kullanarak başlangıç değerini yazdır
// Format: "Initial: {points}"
// TODO: new_points ile setter kullanarak skoru güncelle
// TODO: Getter kullanarak güncellenmiş değeri yazdır
// Format: "Updated: {points}"
// TODO: Skoru 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şisi