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.
Görev
KolayGetter 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) bircelsiusalanına (float64) sahip birTemperaturestruct'ı oluşturun. Aşağıdaki metotları uygulayın:Celsius()- Celsius cinsinden mevcut sıcaklığı döndüren bir getterSetCelsius(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) + 32SetFahrenheit(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
NewTemperature(celsius float64) *Temperatureyapı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:
- Oluşturulduktan sonra:
C: [celsius] F: [fahrenheit] - Celsius atandıktan sonra:
C: [celsius] F: [fahrenheit] - 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
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool