Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Dış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 bir BankAccount yapısı oluştur. Bu yapı main paketinde yer almalıdır:
    • HolderName (dışa aktarılan) - hesap sahibinin adı; herkese açık şekilde görüntülenmesi güvenlidir
    • AccountType (dışa aktarılan) - hesap türü (ör. "Savings", "Checking")
    • balance (dışa aktarılmayan) - korunması gereken gerçek bakiye
    • pin (dışa aktarılmayan) - son derece hassas hesap PIN'i
    Hesap sahibinin adını, hesap türünü, başlangıç bakiyesini ve PIN'i alan ve yeni bir NewBankAccount işaretçisi döndüren BankAccount oluşturucu işlevini ekle. Ayrıca şu biçimi döndüren bir GetPublicInfo() string yöntemi ekle: Account: [HolderName] ([AccountType])
  • main.go: Hesap bilgilerini girdiden oku, oluşturucuyu kullanarak bir BankAccount oluş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 (balance ve pin) 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: Savings

Bakiye 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
}
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

Kendi başına pratik yap: Online Go derleyicisi