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ı ve öğrencileri yöneten, öğrenme ilerlemesini takip eden bir E-Öğrenme Platformu oluşturalım! Öğrencilerin kurslara kaydolup dersleri tamamlayabildiği, yapıları, arayüzleri, bileşimi ve çok biçimliliği bir araya getiren uyumlu bir sistem oluşturacaksın.
Kodunu beş dosyaya ayıracaksın:
lesson.go: Bireysel öğrenme birimlerini temsil eden birLessonyapısı tanımla. Her dersin birID,TitleveDuration(dakika cinsinden) alanı vardır. Bir Lesson işaretçisi döndüren birNewLessonoluşturucusu ekle.course.go: BirCourse,ID,TitleveInstructorişaretçilerinden oluşan bir dilim içeren bir*Lessonyapısı oluştur. BirNewCourseoluşturucusu ve birAddLessonmetodu ekle. Ayrıca kurstaki tüm derslerin sürelerinin toplamını döndüren birTotalDuration() intmetodu uygula.student.go:Student,IDveNamealanlarına sahip birEmailyapısı tanımla. BirNewStudentoluşturucusu ekle.enrollment.go: İlerleme takibinin gerçekleştiği yer burasıdır. Bir öğrenciyi bir kursa bağlayan ve hangi dersleri tamamladığını takip eden birEnrollmentyapısı oluştur. Şunlara sahip olmalıdır:StudentişaretçisiCourseişaretçisi- Ders ID'sinden boolean değerine eşleyen bir
CompletedLessonsmap'i
Yüzdeyi (0.0 ile 100.0 arası) döndüren bir
Progressablemetoduna sahip birProgress() float64arayüzü tanımla.Bu metotları Enrollment üzerinde uygula:
NewEnrollment(student *Student, course *Course) *Enrollment: tamamlanan dersler için boş bir map başlatan oluşturucuCompleteLesson(lessonID string) string: Bir dersi tamamlandı olarak işaretler. Ders kursta mevcut değilselesson not found, zaten tamamlandıysaalready completed, başarılı olursacompleteddöndürürProgress() float64: Tamamlanan derslerin yüzdesini (tamamlanan/toplam * 100) döndürür veya kursta hiç ders yoksa 0.0 döndürür
main.go: Platformunu oluştur ve kayıt işlemlerini gerçekleştir.Bir kursun ID'sini, başlığını ve eğitmenini oku. Ardından ders sayısını ve her dersin ID'sini, başlığını ve süresini oku. Bir öğrencinin ID'sini, adını ve e-posta adresini oku. Öğrenciyi kursa bağlayan bir kayıt oluştur.
Ardından işlem sayısını oku. Her işlem ya
complete [lessonID]ya daprogressşeklindedir. Tamamlama işlemleri için sonuç mesajını yazdır. İlerleme işlemleri için ilerlemeyi bir ondalık basamakla biçimlendirip ardından yüzde işareti ekleyerek yazdır.
Aşağıdaki girdiler sağlanacaktır:
- Kurs ID'si, Başlık, Eğitmen (3 satır)
- Ders sayısı, ardından her dersin ID'si, Başlığı, Süresi (her biri 3 satır)
- Öğrenci ID'si, Adı, E-posta adresi (3 satır)
- İşlem sayısı, ardından her işlem (her biri 1 satır)
Örneğin, aşağıdaki 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 şöyle olmalıdır:
0.0%
completed
33.3%
already completed
completedVe aşağıdaki girdi 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 şöyle olmalıdır:
lesson not found
completed
completed
100.0%Enrollment yapısının öğrencileri ve kursları birbirine bağlamak için bileşimi nasıl kullandığına, Progressable arayüzünün ise herhangi bir türün tamamlama durumunu bildirmesine dikkat et. Bu tasarım genişletmeyi kolaylaştırır. Aynı arayüzü kullanarak bireysel derslere veya tüm öğrenme yollarına ilerleme takibi ekleyebilirsin!
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 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ı oluştur
// İşlem sayısını oku
numOps, _ := strconv.Atoi(readLine())
// Her işlemi işle
for i := 0; i < numOps; i++ {
operation := readLine()
if operation == "progress" {
// TODO: Progress() çağır ve "%.1f%%" formatıyla yazdır
fmt.Println("0.0%") // Gerçek ilerlemeyle değiştir
} else if strings.HasPrefix(operation, "complete ") {
lessonID := strings.TrimPrefix(operation, "complete ")
// TODO: CompleteLesson'ı çağır ve sonucu yazdır
_ = lessonID
fmt.Println("") // Gerçek sonuçla değiştir
}
}
}
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