Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Getter 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 bir Score tü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ür
    • free_score — bir Score işaretçisi alır ve belleği serbest bırakır
    • score_get_points — bir const Score * alan ve mevcut puanları döndüren bir getter
    • score_set_points — bir Score * ve bir tam sayı alan, puan değerini güncelleyen bir setter
    SCORE_H sembolü ile include guard kullanın.
  • score.c: Tek bir gizli üyeye sahip gerçek struct Score yapı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çin const iş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
Freed

main.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;
}
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