E-Öğrenme Platformu
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 105 / 107.
Görev
KolayKursları, öğrencileri yöneten ve öğrenme ilerlemesini takip eden bir E-Öğrenme Platformu inşa edelim! Öğrencilerin kurslara kaydolabileceği ve dersleri tamamlayabileceği uyumlu bir sistem oluşturmak için struct'ları, arayüzleri (interfaces), kompozisyonu ve polimorfizmi birleştireceksiniz.
Kodunuzu beş dosya halinde düzenleyeceksiniz:
lesson.go: Bireysel öğrenme birimlerini temsil eden birLessonstruct'ı tanımlayın. Her dersin birID,TitleveDuration(dakika cinsinden) bilgisi vardır. Bir Lesson'a işaretçi (pointer) döndüren birNewLessonyapıcı metodu (constructor) ekleyin.course.go: BirID,Title,Instructorve*Lessonişaretçilerinden oluşan bir dilim (slice) içeren birCoursestruct'ı oluşturun. BirNewCourseyapıcı metodu ve birAddLessonmetodu ekleyin. Ayrıca, kurstaki tüm ders sürelerinin toplamını döndüren birTotalDuration() intmetodu uygulayın.student.go:ID,NameveEmailalanlarına sahip birStudentstruct'ı tanımlayın. BirNewStudentyapıcı metodu ekleyin.enrollment.go: İlerleme takibi sihrinin gerçekleştiği yer burasıdır. Bir öğrenciyi bir kursa bağlayan ve hangi dersleri tamamladıklarını takip eden birEnrollmentstruct'ı oluşturun. Şunlara sahip olmalıdır:Studentiçin bir işaretçiCourseiçin bir işaretçi- Bir
CompletedLessonsmap'i (ders ID'sinden boolean'a)
Yüzde (0.0 ile 100.0 arası) döndüren
Progress() float64metoduna sahip birProgressablearayüzü tanımlayın.Enrollment üzerinde şu metotları uygulayın:
NewEnrollment(student *Student, course *Course) *Enrollment— boş bir tamamlanmış dersler map'i başlatan yapıcı metotCompleteLesson(lessonID string) string— bir dersi tamamlandı olarak işaretler. Ders kursta mevcut değilselesson not found, zaten tamamlanmışsaalready completedveya başarı durumundacompleteddöndürürProgress() float64— tamamlanan derslerin yüzdesini döndürür (tamamlanan/toplam * 100) veya kursta ders yoksa 0.0 döndürür
main.go: Platformunuzu oluşturun ve kayıt işlemlerini işleyin.Bir kursun ID'sini, başlığını ve eğitmenini okuyun. Ardından ders sayısını ve her dersin ID'sini, başlığını ve süresini okuyun. Bir öğrencinin ID'sini, adını ve e-postasını okuyun. Öğrenciyi kursa bağlayan bir kayıt (enrollment) oluşturun.
Ardından işlem sayısını okuyun. Her işlem ya
complete [lessonID]ya daprogressşeklindedir. complete işlemleri için sonuç mesajını yazdırın. progress işlemleri için, bir ondalık basamak ve ardından bir yüzde işareti ile formatlanmış ilerlemeyi yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Kurs ID, Başlık, Eğitmen (3 satır)
- Ders sayısı, ardından her dersin ID, Başlık, Süre bilgisi (her biri için 3 satır)
- Öğrenci ID, Ad, E-posta (3 satır)
- İşlem sayısı, ardından her işlem (her biri için 1 satır)
Örneğin, şu girdi verildiğinde:
C001
Go Fundamentals
Jane Smith
3
L001
Variables
30
L002
Functions
45
L003
Structs
60
S001
Alice
alice@learn.com
5
progress
complete L001
progress
complete L001
complete L002Çıktınız şu olmalıdır:
0.0%
completed
33.3%
already completed
completedVe şu verildiğinde:
C100
Python Basics
Bob Teacher
2
L100
Intro
20
L101
Loops
40
S100
Charlie
charlie@edu.com
4
complete L999
complete L100
complete L101
progressÇıktınız şu olmalıdır:
lesson not found
completed
completed
100.0%Enrollment struct'ının öğrencileri ve kursları birbirine bağlamak için kompozisyonu nasıl kullandığına, Progressable arayüzünün ise herhangi bir türün tamamlanma durumunu bildirmesine nasıl izin verdiğine dikkat edin. Bu tasarım genişletmeyi kolaylaştırır; aynı arayüzü kullanarak bireysel derslere veya tüm öğrenme yollarına ilerleme takibi ekleyebilirsiniz!
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Bir satır okumak için yardımcı fonksiyon
readLine := func() string {
scanner.Scan()
return strings.TrimSpace(scanner.Text())
}
// Kurs bilgilerini oku
courseID := readLine()
courseTitle := readLine()
courseInstructor := readLine()
// TODO: NewCourse kullanarak kursu oluştur
_ = courseID
_ = courseTitle
_ = courseInstructor
// Ders sayısını oku
numLessons, _ := strconv.Atoi(readLine())
// TODO: Her bir dersi oku ve kursa ekle
for i := 0; i < numLessons; i++ {
lessonID := readLine()
lessonTitle := readLine()
lessonDuration, _ := strconv.Atoi(readLine())
// TODO: Dersi oluştur ve kursa ekle
_ = lessonID
_ = lessonTitle
_ = lessonDuration
}
// Öğrenci bilgilerini oku
studentID := readLine()
studentName := readLine()
studentEmail := readLine()
// TODO: NewStudent kullanarak öğrenciyi oluştur
_ = studentID
_ = studentName
_ = studentEmail
// TODO: Öğrenciyi kursa bağlayan kaydı (enrollment) oluştur
// İşlem sayısını oku
numOps, _ := strconv.Atoi(readLine())
// Her bir işlemi işle
for i := 0; i < numOps; i++ {
operation := readLine()
if operation == "progress" {
// TODO: Progress() fonksiyonunu çağır ve "%.1f%%" formatıyla yazdır
fmt.Println("0.0%") // Gerçek ilerleme durumu ile değiştirin
} else if strings.HasPrefix(operation, "complete ") {
lessonID := strings.TrimPrefix(operation, "complete ")
// TODO: CompleteLesson fonksiyonunu çağır ve sonucu yazdır
_ = lessonID
fmt.Println("") // Gerçek sonuç ile değiştirin
}
}
}
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