Ö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
KolayUygun kapsüllemeyi gösteren bir Öğrenci Kayıtları sistemi oluşturalım. Hassas akademik verilerin korunurken, iyi tasarlanmış yöntemler aracılığıyla kontrollü erişim sağlandığı bir öğrenci yönetimi yapısı oluşturacaksınız.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
student.go: Hassas bilgileri korurken güvenli genel verileri dışa açan birStudentyapısı oluşturun. ÖğrencininNamealanı dışa aktarılmış (genel erişime açık) olmalı; ancakgrade(float64) vestudentID(string) alanları, bu hassas bilgileri korumak için dışa aktarılmamış olmalıdır.Aşağıdakileri uygulayın:
- Öğrenci oluşturan bir
NewStudent(name, id string, initialGrade float64) *Studentkurucusu. Başlangıç notu yalnızca 0 ile 100 (dahil) arasındaysa ayarlanmalı; aksi durumda varsayılan olarak 0 olmalıdır. - Geçerli notu döndüren bir
Grade() float64alıcısı - Öğrenci kimliğini döndüren bir
StudentID() stringalıcısı - Yeni değer yalnızca 0 ile 100 (dahil) arasındaysa notu güncelleyen bir
SetGrade(newGrade float64) boolayarlayıcısı. Not güncellendiysetrue, aksi durumdafalsedöndürün. - Şu biçimi döndüren bir
Summary() stringyöntemi:[Name] (ID: [studentID]) - Grade: [grade]
- Öğrenci oluşturan bir
main.go: Öğrenci bilgilerini girdiden okuyun, kurucuyu kullanarak bir öğrenci oluşturun ve ardından not işlemlerini gerçekleştirin. Öğrencinin özetini oluşturulduktan sonra ve her not güncelleme denemesinden sonra görüntüleyin.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Öğrenci adı
- 2. satır: Öğrenci kimliği
- 3. satır: Başlangıç notu
- 4. satır: Ayarlanacak ilk yeni not
- 5. satır: Ayarlanacak ikinci yeni not
Öğrenciyi oluşturduktan sonra özetini yazdırın. Ardından her 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 biçimlendirin.
Örneğin Emma Wilson, STU001, 85.5, 92.0 ve 150 verildiğinde çıktınız şu şekilde olmalıdır:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejectedSon güncelleme, 150 geçerli aralığın dışında olduğu için başarısız olur. Ayarlayıcı yönteminiz bu kuralı uygular ve öğrencinin verilerini geçerli tutar. studentID ve grade alanlarına hiçbir zaman doğrudan erişilemediğine dikkat edin: harici kod, bu korunan verilerle etkileşim kurmak için alıcı ve ayarlayıcı yöntemlerinizi 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 ID'sini oku
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// Başlangıç notunu oku
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// İlk 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ıcısını kullanarak yeni bir öğrenci oluştur
// TODO: Oluşturulduktan sonra öğrencinin özetini yazdır
// TODO: İlk not güncellemesini dene
// Başarılı olursa, güncellenmiş özeti yazdır
// If rejected, print "Invalid grade rejected"
// TODO: İkinci not güncellemesini dene
// Başarılı olursa, güncellenmiş özeti yazdır
// If rejected, print "Invalid grade rejected"
// İpucu: Summary() içinde notları biçimlendirmek için fmt.Sprintf ile %.2f kullan
_ = 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 PoolKendi başına pratik yap: Online Go derleyicisi