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ılmamış alanlara bir paketin dışından doğrudan erişilemediğinden, kontrollü erişime izin veren yöntemler sağlamanız gerekir. Bunlara genellikle getter ve setter adı verilir.
Go'da getter'lar için kural basittir: alan adını ilk harfi büyük olacak şekilde kullanın. "Get" ile önek eklemeyin; GetBalance() yerine yalnızca 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. Harici kodun herhangi bir değeri doğrudan ayarlamasına izin vermek yerine, neye izin verileceğini sen kontrol edersin:
func (b *BankAccount) Deposit(amount int) bool {
if amount <= 0 {
return false
}
b.balance += amount
return true
}
Bu Deposit yöntemi, kuralları uygulayan özel bir ayarlayıcı görevi görür: negatif para yatırma işlemine izin verilmez. Harici kod, yöntemleriniz üzerinden ilerlemelidir; böylece yapı her zaman geçerli bir durumda kalır. Bu, kapsüllemenin iş başındaki hâlidir: verileri gizlerken kontrollü davranış sunmak.
Görev
Kolaygetter ve setter yöntemlerini kullanarak uygun kapsüllemeyi gösteren bir sıcaklık dönüştürücü oluşturalım. Sıcaklığı dahili olarak Celsius cinsinden depolayan, ancak doğrulama içeren yöntemler aracılığıyla kontrollü erişim sağlayan bir struct oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
temperature.go: Dışa aktarılmamış birTemperaturealanına (float64) sahip bircelsiusstruct'ı oluştur. Aşağıdaki yöntemleri uygula:Celsius()- mevcut sıcaklığı Celsius cinsinden döndüren bir getterSetCelsius(value float64)- yalnızca mutlak sıfıra (-273.15) eşit veya bundan büyük değerleri kabul eden bir setter. Değer bu eşikten düşükse sıcaklık değişmeden kalmalıdır.Fahrenheit()- şu formülü kullanarak sıcaklığı Fahrenheit'a dönüştürür:(celsius * 9/5) + 32SetFahrenheit(value float64)- girdiyi Fahrenheit'tan Celsius'a dönüştürür ve sonucu saklar; ancak yalnızca elde edilen Celsius değeri -273.15'e eşit veya bundan büyükse
NewTemperature(celsius float64) *Temperaturekurucusunu da ekle (kurucu için girdinin geçerli olduğunu varsay).main.go: Girdiden sıcaklık değerlerini oku ve getter/setter yöntemlerini göster. Bir sıcaklık oluştur, değerlerini her iki birimde göster, ardından yeni değerler atamayı dene ve sonuçları göster.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Başlangıç Celsius değeri
- 2. satır: Atanacak yeni Celsius değeri
- 3. satır: Atanacak yeni Fahrenheit değeri
Tüm sıcaklık çıktılarını iki ondalık basamakla biçimlendir. Aşağıdaki sırayı yazdır:
- Oluşturma sonrasında:
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 şö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şmemiş değerleri gösterdiğine dikkat et; bunun nedeni -300'ün mutlak sıfırın altında olması ve setter'ın bu değeri reddetmesidir. Üçüncü satır, 212°F başarıyla atandıktan sonraki sıcaklığı gösterir (bu değer 100°C'ye dönüştürülür). Setter'ların gücü budur. Verilerini geçerli tutan kuralları uygularlar.
Kendin dene
package main
import (
"fmt"
)
func main() {
// Girdi değerlerini oku
var initialCelsius float64
var newCelsius float64
var newFahrenheit float64
fmt.Scanln(&initialCelsius)
fmt.Scanln(&newCelsius)
fmt.Scanln(&newFahrenheit)
// TODO: Yapıcı kullanarak yeni bir Temperature oluştur
// TODO: Başlangıç değerlerini "C: [celsius] F: [fahrenheit]" formatında 2 ondalık basamakla yazdır
// TODO: Yeni Celsius değerini ayarlamayı dene ve sonucu yazdır
// TODO: Yeni Fahrenheit değerini ayarlamayı dene ve sonucu yazdır
}
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 PoolKendi başına pratik yap: Online Go derleyicisi