Dışa Aktarılan ve Aktarılmayan Alanlar
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 107.
Go'da, yapı düzeyindeki kapsülleme, alan adlarının büyük veya küçük harfle yazılmasına göre kontrol edilir. Bu basit kural, alanlara yapının tanımlandığı paketin dışından erişilip erişilemeyeceğini belirler.
Büyük harfle başlayan alanlar dışa aktarılmıştır: herhangi bir paketten erişilebilir. Küçük harfle başlayan alanlar dışa aktarılmamıştır: yalnızca aynı paket içinde erişilebilir:
// "user" paketinde
type User struct {
Name string // Dışa aktarılmış - her yerden erişilebilir
Email string // Dışa aktarılmış - her yerden erişilebilir
password string // Dışa aktarılmamış - yalnızca "user" paketinde erişilebilir
age int // Dışa aktarılmamış - yalnızca "user" paketinde erişilebilir
}
Başka bir paket bu yapıyı içe aktarıp kullandığında yalnızca dışa aktarılan alanlarla etkileşime girebilir:
// "main" paketinde
import "user"
func main() {
u := user.User{
Name: "Alice", // çalışır
Email: "a@mail.com", // çalışır
// password: "secret", // derleme hatası: bilinmeyen alan
}
fmt.Println(u.Name) // çalışır
// fmt.Println(u.password) // derleme hatası: dışa aktarılmamış alana başvurulamaz
}
Bu mekanizma hassas verileri ve dahili uygulama ayrıntılarını korur. password alanı paketin dışından doğrudan okunamaz veya değiştirilemez; bu da diğer kodları sağladığınız yöntemleri kullanmaya zorlar. Bu, Go'nun nesne yönelimli programlamada kapsüllemenin temel bir ilkesi olan veri gizlemeyi gerçekleştirme yaklaşımıdır.
Görev
KolayDışa aktarılan ve dışa aktarılmayan alanlar aracılığıyla kapsüllemeyi gösteren bir banka hesabı sistemi oluşturalım. Hassas finansal verileri korurken güvenli genel bilgileri açığa çıkaran bir paket oluşturacaksın.
Kodunu iki dosya arasında düzenleyeceksin:
account.go: Gerçek bir banka hesabını uygun veri korumasıyla modelleyen birBankAccountyapısı oluştur. Bu yapımainpaketinde yer almalıdır:HolderName(dışa aktarılan) - hesap sahibinin adı; herkese açık şekilde görüntülenmesi güvenlidirAccountType(dışa aktarılan) - hesap türü (ör. "Savings", "Checking")balance(dışa aktarılmayan) - korunması gereken gerçek bakiyepin(dışa aktarılmayan) - son derece hassas hesap PIN'i
NewBankAccountişaretçisi döndürenBankAccountoluşturucu işlevini ekle. Ayrıca şu biçimi döndüren birGetPublicInfo() stringyöntemi ekle:Account: [HolderName] ([AccountType])main.go: Hesap bilgilerini girdiden oku, oluşturucuyu kullanarak birBankAccountoluştur ve kapsüllemeyi göster. Yöntemi kullanarak genel bilgileri yazdır, ardından dışa aktarılan her alanı ayrı satırlarda doğrudan erişip yazdır. Dışa aktarılmayan alanlar (balancevepin) korunur. Bu alanları yalnızca oluşturucu aracılığıyla ayarlayabilirsin.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Hesap sahibinin adı
- 2. satır: Hesap türü
- 3. satır: Başlangıç bakiyesi (float olarak)
- 4. satır: PIN kodu
Örneğin Alice Johnson, Savings, 5000.50 ve 1234 verildiğinde çıktın şöyle olmalıdır:
Account: Alice Johnson (Savings)
Holder: Alice Johnson
Type: SavingsBakiye ve PIN'in çıktıda hiçbir zaman görünmediğine dikkat et: Bunlar yapının içinde güvenli bir şekilde gizlenir ve yalnızca paket içinde erişilebilir. Bu, kapsüllemenin işleyiş hâlidir: Hassas veriler korunurken genel bilgiler erişilebilir kalır.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Hesap sahibi adını oku
holderName, _ := reader.ReadString('\n')
holderName = strings.TrimSpace(holderName)
// Hesap türünü oku
accountType, _ := reader.ReadString('\n')
accountType = strings.TrimSpace(accountType)
// Başlangıç bakiyesini oku
balanceStr, _ := reader.ReadString('\n')
balanceStr = strings.TrimSpace(balanceStr)
balance, _ := strconv.ParseFloat(balanceStr, 64)
// PIN'i oku
pinStr, _ := reader.ReadString('\n')
pin := strings.TrimSpace(pinStr)
// TODO: Kurucuyu kullanarak yeni bir BankAccount oluştur
// account := NewBankAccount(...)
// TODO: GetPublicInfo() metodunu kullanarak genel bilgileri yazdır
// TODO: Dışa aktarılmış alana doğrudan erişerek hesap sahibi adını yazdır
// fmt.Println("Holder:", ...)
// TODO: Dışa aktarılmış alana doğrudan erişerek hesap türünü yazdır
// fmt.Println("Type:", ...)
// Note: balance ve pin unexported - bunlara buradan doğrudan erişilemez
// Bunlar struct içinde güvenli bir şekilde kapsüllenmiştir
_ = balance // balance'ı kullandığınızda bu satırı kaldırın
_ = pin // pin'i kullandığınızda bu satırı kaldı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 PoolKendi başına pratik yap: Online Go derleyicisi