Platform E-Learning
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 105 dari 107.
Tantangan
MudahMari bangun Platform E-Learning yang mengelola kursus, siswa, dan melacak progres belajar! Kamu akan menggabungkan struct, interface, composition, dan polymorphism untuk membuat sistem terpadu tempat siswa dapat mendaftar ke kursus dan menyelesaikan pelajaran.
Kamu akan mengatur kodemu dalam lima file:
lesson.go: Definisikan structLessonyang merepresentasikan unit pembelajaran individual. Setiap pelajaran memilikiID,Title, danDuration(dalam menit). Sertakan konstruktorNewLessonyang mengembalikan pointer ke Lesson.course.go: Buat structCourseyang memilikiID,Title,Instructor, dan slice berisi pointer*Lesson. Sertakan konstruktorNewCoursedan methodAddLesson. Implementasikan juga methodTotalDuration() intyang mengembalikan jumlah durasi semua pelajaran dalam kursus.student.go: Definisikan structStudentdengan fieldID,Name, danEmail. Sertakan konstruktorNewStudent.enrollment.go: Di sinilah keajaiban pelacakan progres terjadi. Buat structEnrollmentyang menghubungkan siswa dengan kursus dan melacak pelajaran yang telah diselesaikan. Struct ini harus memiliki:- Pointer ke
Student - Pointer ke
Course - Map
CompletedLessons(ID pelajaran ke boolean)
Definisikan interface
Progressabledengan methodProgress() float64yang mengembalikan persentase (0.0 hingga 100.0).Implementasikan method berikut pada Enrollment:
NewEnrollment(student *Student, course *Course) *Enrollment: konstruktor yang menginisialisasi map pelajaran selesai yang kosongCompleteLesson(lessonID string) string: menandai pelajaran sebagai selesai. Mengembalikanlesson not foundjika pelajaran tidak ada dalam kursus,already completedjika sudah selesai, ataucompletedjika berhasilProgress() float64: mengembalikan persentase pelajaran yang selesai (selesai/total * 100), atau 0.0 jika kursus tidak memiliki pelajaran
- Pointer ke
main.go: Bangun platformmu dan proses operasi pendaftaran.Baca ID, judul, dan instruktur kursus. Lalu baca jumlah pelajaran serta ID, judul, dan durasi setiap pelajaran. Baca ID, nama, dan email siswa. Buat pendaftaran yang menghubungkan siswa dengan kursus.
Lalu baca jumlah operasi. Setiap operasi berupa
complete [lessonID]atauprogress. Untuk operasi complete, cetak pesan hasilnya. Untuk operasi progress, cetak progres dengan format satu angka di belakang koma, diikuti tanda persen.
Input berikut akan diberikan:
- ID Kursus, Judul, Instruktur (3 baris)
- Jumlah pelajaran, lalu ID, Judul, Durasi setiap pelajaran (masing-masing 3 baris)
- ID Siswa, Nama, Email (3 baris)
- Jumlah operasi, lalu setiap operasi (masing-masing 1 baris)
Contohnya, jika diberikan:
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 L002Outputmu seharusnya:
0.0%
completed
33.3%
already completed
completedDan jika diberikan:
C100
Python Basics
Bob Teacher
2
L100
Intro
20
L101
Loops
40
S100
Charlie
charlie@edu.com
4
complete L999
complete L100
complete L101
progressOutputmu seharusnya:
lesson not found
completed
completed
100.0%Perhatikan bagaimana struct Enrollment menggunakan composition untuk menghubungkan siswa dan kursus, sementara interface Progressable memungkinkan tipe apa pun melaporkan status penyelesaiannya. Desain ini mudah dikembangkan. Kamu dapat menambahkan pelacakan progres pada pelajaran individual atau jalur pembelajaran secara keseluruhan menggunakan interface yang sama!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Fungsi pembantu untuk membaca satu baris
readLine := func() string {
scanner.Scan()
return strings.TrimSpace(scanner.Text())
}
// Baca informasi kursus
courseID := readLine()
courseTitle := readLine()
courseInstructor := readLine()
// TODO: Buat kursus menggunakan NewCourse
_ = courseID
_ = courseTitle
_ = courseInstructor
// Baca jumlah pelajaran
numLessons, _ := strconv.Atoi(readLine())
// TODO: Baca setiap pelajaran dan tambahkan ke kursus
for i := 0; i < numLessons; i++ {
lessonID := readLine()
lessonTitle := readLine()
lessonDuration, _ := strconv.Atoi(readLine())
// TODO: Buat pelajaran dan tambahkan ke kursus
_ = lessonID
_ = lessonTitle
_ = lessonDuration
}
// Baca informasi siswa
studentID := readLine()
studentName := readLine()
studentEmail := readLine()
// TODO: Buat siswa menggunakan NewStudent
_ = studentID
_ = studentName
_ = studentEmail
// TODO: Buat pendaftaran yang menghubungkan siswa dengan kursus
// Baca jumlah operasi
numOps, _ := strconv.Atoi(readLine())
// Proses setiap operasi
for i := 0; i < numOps; i++ {
operation := readLine()
if operation == "progress" {
// TODO: Panggil Progress() dan cetak dengan format "%.1f%%"
fmt.Println("0.0%") // Ganti dengan progres sebenarnya
} else if strings.HasPrefix(operation, "complete ") {
lessonID := strings.TrimPrefix(operation, "complete ")
// TODO: Panggil CompleteLesson dan cetak hasilnya
_ = lessonID
fmt.Println("") // Ganti dengan hasil sebenarnya
}
}
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online