Menu
Coddy logo textTech

Getter ve Setter Metotları

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 49 / 107.

Dışa aktarılmayan alanlara bir paketin dışından doğrudan erişilemediği için, kontrollü erişim sağlayan metotlar sunmanız gerekir. Bunlar yaygın olarak getters ve setters olarak adlandırılır.

Go'da, getter'lar için kural basittir: alan adını büyük harfle başlayacak şekilde kullanın. Başına "Get" eklemeyin; GetBalance() yerine sadece Balance() kullanın:

type BankAccount struct {
    balance int  // dışa aktarılmamış
}

// Getter - değeri döndürür
func (b *BankAccount) Balance() int {
    return b.balance
}

// Setter - değeri doğrulama ile değiştirir
func (b *BankAccount) SetBalance(amount int) {
    if amount >= 0 {
        b.balance = amount
    }
}

Setter'ların gerçek gücü, doğrulama veya iş mantığı eklemektir. Dış kodun herhangi bir değeri doğrudan ayarlamasına izin vermek yerine, neye izin verileceğini siz kontrol edersiniz:

func (b *BankAccount) Deposit(amount int) bool {
    if amount <= 0 {
        return false
    }
    b.balance += amount
    return true
}

Bu Deposit metodu, kuralları uygulayan özel bir ayarlayıcı (setter) görevi görür; negatif depozitolara izin verilmez. Dış kodun metotlarınızdan geçmesi gerekir, bu da struct'ın her zaman geçerli bir durumda kalmasını sağlar. Bu, iş başındaki kapsüllemedir: kontrollü davranışı dışa açarken veriyi gizlemek.

challenge icon

Görev

Kolay

Getter ve setter metotlarını kullanarak doğru kapsüllemeyi (encapsulation) gösteren bir sıcaklık dönüştürücü oluşturalım. Sıcaklığı dahili olarak Celsius cinsinden saklayan ancak doğrulama içeren metotlar aracılığıyla kontrollü erişim sağlayan bir struct oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • temperature.go: Dışa aktarılmayan (unexported) bir celsius alanına (float64) sahip bir Temperature struct'ı oluşturun. Aşağıdaki metotları uygulayın:
    • Celsius() - Celsius cinsinden mevcut sıcaklığı döndüren bir getter
    • SetCelsius(value float64) - yalnızca mutlak sıfır (-273.15) veya üzerindeki değerleri kabul eden bir setter. Değer bu eşiğin altındaysa, sıcaklık değişmeden kalmalıdır.
    • Fahrenheit() - sıcaklığı şu formülü kullanarak Fahrenheit'a dönüştürülmüş olarak döndürür: (celsius * 9/5) + 32
    • SetFahrenheit(value float64) - girişi Fahrenheit'tan Celsius'a dönüştürür ve saklar, ancak yalnızca sonuçtaki Celsius değeri -273.15 veya üzerindeyse
    Ayrıca, verilen değere göre başlatılmış bir sıcaklık oluşturan bir NewTemperature(celsius float64) *Temperature yapıcı metodu (constructor) ekleyin (yapıcı metot için geçerli girdi girileceğini varsayın).
  • main.go: Girdiden sıcaklık değerlerini okuyun ve getter/setter metotlarını gösterin. Bir sıcaklık oluşturun, değerlerini her iki birimde de görüntüleyin, ardından yeni değerler atamaya çalışın ve sonuçları gösterin.

Aşağıdaki girdiler sağlanacaktır:

  • Satır 1: Başlangıç Celsius değeri
  • Satır 2: Atanacak yeni Celsius değeri
  • Satır 3: Atanacak yeni Fahrenheit değeri

Tüm sıcaklık çıktılarını iki ondalık basamakla formatlayın. Aşağıdaki sırayı yazdırın:

  1. Oluşturulduktan sonra: C: [celsius] F: [fahrenheit]
  2. Celsius atandıktan sonra: C: [celsius] F: [fahrenheit]
  3. Fahrenheit atandıktan sonra: C: [celsius] F: [fahrenheit]

Örneğin, 25, -300 ve 212 verildiğinde çıktınız şöyle olmalıdır:

C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00

İkinci satırın değişmeyen değerleri gösterdiğine dikkat edin; çünkü -300 mutlak sıfırın altındadır, bu nedenle setter bunu reddetmiştir. Üçüncü satır, 212°F (100°C'ye dönüşür) başarıyla atandıktan sonraki sıcaklığı gösterir. Setter'ların gücü budur; verilerinizin geçerli kalmasını sağlayan kuralları uygularlar.

Kopya kağıdı

Dışa aktarılmayan (unexported) alanlar, paket dışından kontrollü erişim için getter ve setter metotlarına ihtiyaç duyar.

Getter Geleneği

Go'da getter'lar, alan adının ilk harfi büyük yazılarak isimlendirilir. Başına "Get" ön eki getirmeyin:

type BankAccount struct {
    balance int  // unexported
}

// Getter - değeri döndürür
func (b *BankAccount) Balance() int {
    return b.balance
}

Doğrulama İçeren Setter

Setter'lar değerleri değiştirir ve doğrulama veya iş mantığı içerebilir:

// Setter - değeri doğrulama ile değiştirir
func (b *BankAccount) SetBalance(amount int) {
    if amount >= 0 {
        b.balance = amount
    }
}

Özelleşmiş Setter'lar

Doğrudan değer atamasına izin vermek yerine belirli kuralları uygulayan metotlar oluşturun:

func (b *BankAccount) Deposit(amount int) bool {
    if amount <= 0 {
        return false
    }
    b.balance += amount
    return true
}

Bu yaklaşım kapsüllemeyi (encapsulation) sağlar: verileri gizlerken kontrollü davranışları dışa açar ve struct'ların geçerli bir durumda kalmasını sağlar.

Kendin dene

package main

import (
	"fmt"
)

func main() {
	// Giriş değerlerini oku
	var initialCelsius float64
	var newCelsius float64
	var newFahrenheit float64
	fmt.Scanln(&initialCelsius)
	fmt.Scanln(&newCelsius)
	fmt.Scanln(&newFahrenheit)

	// TODO: Yapıcıyı (constructor) kullanarak yeni bir Temperature oluşturun

	// TODO: Başlangıç değerlerini 2 ondalık basamakla "C: [celsius] F: [fahrenheit]" formatında yazdırın

	// TODO: Yeni Celsius değerini atamayı deneyin ve sonucu yazdırın

	// TODO: Yeni Fahrenheit değerini atamayı deneyin ve sonucu yazdırın
}
quiz iconKendini test et

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