Özet - Öğrenci Kayıtları
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 51 / 107.
Görev
KolayDoğru kapsüllemeyi (encapsulation) gösteren bir Öğrenci Kayıt sistemi oluşturalım. Hassas akademik verilerin korunduğu, ancak iyi tasarlanmış metotlar aracılığıyla kontrollü erişim sağlandığı bir öğrenci yönetim yapısı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
student.go: Güvenli genel verileri dışa açarken hassas bilgileri koruyan birStudentstruct'ı oluşturun. ÖğrencininNamealanı dışa aktarılmalı (herkese açık olmalı), ancakgrade(float64) vestudentID(string) alanları bu hassas bilgileri korumak için dışa aktarılmamalıdır (unexported).Aşağıdakileri uygulayın:
- Bir öğrenci oluşturan
NewStudent(name, id string, initialGrade float64) *Studentyapıcı metodu (constructor). Başlangıç notu yalnızca 0 ile 100 (dahil) arasındaysa ayarlanmalıdır; aksi takdirde varsayılan olarak 0 olmalıdır. - Mevcut notu döndüren bir
Grade() float64alıcı metodu (getter). - Öğrenci kimliğini döndüren bir
StudentID() stringalıcı metodu (getter). - Notu yalnızca yeni değer 0 ile 100 (dahil) arasındaysa güncelleyen bir
SetGrade(newGrade float64) boolayarlayıcı metodu (setter). Not güncellendiysetrue, aksi takdirdefalsedöndürün. - Şu formatı döndüren bir
Summary() stringmetodu:[Name] (ID: [studentID]) - Grade: [grade]
- Bir öğrenci oluşturan
main.go: Girdiden öğrenci bilgilerini okuyun, yapıcı metodu kullanarak bir öğrenci oluşturun ve ardından not işlemlerini gerçekleştirin. Oluşturulduktan sonra ve her not güncelleme denemesinden sonra öğrencinin özetini görüntüleyin.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Öğrenci adı
- Satır 2: Öğrenci ID
- Satır 3: Başlangıç notu
- Satır 4: Ayarlanacak ilk yeni not
- Satır 5: Ayarlanacak ikinci yeni not
Öğrenciyi oluşturduktan sonra özetini yazdırın. Ardından her bir not güncellemesini deneyin; başarılı olursa güncellenmiş özeti yazdırın; reddedilirse Invalid grade rejected yazdırın. Tüm not değerlerini iki ondalık basamakla formatlayın.
Örneğin, Emma Wilson, STU001, 85.5, 92.0 ve 150 verildiğinde çıktınız şöyle olmalıdır:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejectedSon güncelleme başarısız olur çünkü 150 geçerli aralığın dışındadır. Ayarlayıcı (setter) metodunuz bu kuralı uygulayarak öğrencinin verilerini geçerli tutar. studentID ve grade alanlarına hiçbir zaman doğrudan erişilemediğine dikkat edin; harici kod, bu korumalı verilerle etkileşim kurmak için alıcı (getter) ve ayarlayıcı (setter) metotlarınızı kullanmalıdır.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Öğrenci adını oku
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Öğrenci numarasını oku
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// Başlangıç notunu oku
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// Birinci yeni notu oku
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// İkinci yeni notu oku
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: NewStudent yapısını kullanarak yeni bir öğrenci oluşturun
// TODO: Oluşturulduktan sonra öğrenci özetini yazdırın
// TODO: İlk not güncellemesini deneyin
// Başarılı olursa, güncellenmiş özeti yazdırın
// Reddedilirse, "Invalid grade rejected" yazdırın
// TODO: İkinci not güncellemesini deneyin
// Başarılı olursa, güncellenmiş özeti yazdırın
// Reddedilirse, "Invalid grade rejected" yazdırın
// İpucu: Summary() içindeki notları formatlamak için %.2f ile fmt.Sprintf kullanın
_ = newGrade1 // Değişkeni kullandığınızda bu satırı kaldırın
_ = newGrade2 // Değişkeni kullandığınızda bu satırı kaldırın
}
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