Ringkasan: Data Siswa
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 51 dari 107.
Tantangan
MudahMari buat sistem Catatan Siswa yang menunjukkan enkapsulasi yang tepat. Kamu akan membuat struktur pengelolaan siswa yang melindungi data akademik sensitif, sekaligus menyediakan akses terkontrol melalui method yang dirancang dengan baik.
Kamu akan mengatur kodemu dalam dua file:
student.go: Buat structStudentyang melindungi informasi sensitif sekaligus mengekspos data publik yang aman.Namesiswa harus diekspor (dapat diakses secara publik), tetapigrade(float64) danstudentID(string) harus tidak diekspor untuk melindungi informasi sensitif ini.Implementasikan hal-hal berikut:
- Konstruktor
NewStudent(name, id string, initialGrade float64) *Studentyang membuat siswa. Nilai awal grade hanya boleh ditetapkan jika berada di antara 0 dan 100 (inklusif); jika tidak, gunakan nilai default 0. - Getter
Grade() float64yang mengembalikan grade saat ini - Getter
StudentID() stringyang mengembalikan ID siswa - Setter
SetGrade(newGrade float64) boolyang memperbarui grade hanya jika nilai baru berada di antara 0 dan 100 (inklusif). Kembalikantruejika grade berhasil diperbarui, danfalsejika tidak. - Method
Summary() stringyang mengembalikan format:[Name] (ID: [studentID]) - Grade: [grade]
- Konstruktor
main.go: Baca informasi siswa dari input, buat siswa menggunakan konstruktor, lalu lakukan operasi grade. Tampilkan ringkasan siswa setelah pembuatan dan setelah setiap upaya pembaruan grade.
Input berikut akan diberikan:
- Baris 1: Nama siswa
- Baris 2: ID siswa
- Baris 3: Grade awal
- Baris 4: Grade baru pertama yang akan ditetapkan
- Baris 5: Grade baru kedua yang akan ditetapkan
Setelah membuat siswa, cetak ringkasannya. Lalu coba setiap pembaruan grade. Jika berhasil, cetak ringkasan yang sudah diperbarui; jika ditolak, cetak Invalid grade rejected. Format semua nilai grade dengan dua angka di belakang koma.
Misalnya, jika inputnya Emma Wilson, STU001, 85.5, 92.0, dan 150, outputmu seharusnya:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejectedPembaruan terakhir gagal karena 150 berada di luar rentang yang valid. Method setter-mu menerapkan aturan ini agar data siswa tetap valid. Perhatikan bahwa studentID dan grade tidak pernah dapat diakses secara langsung: kode eksternal harus menggunakan method getter dan setter-mu untuk berinteraksi dengan data yang dilindungi ini.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca nama siswa
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Baca ID siswa
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// Baca nilai awal
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// Baca nilai baru pertama
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// Baca nilai baru kedua
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: Buat siswa baru menggunakan konstruktor NewStudent
// TODO: Cetak ringkasan siswa setelah dibuat
// TODO: Coba perbarui nilai untuk pertama kalinya
// Jika berhasil, cetak ringkasan yang sudah diperbarui
// Jika ditolak, cetak "Invalid grade rejected"
// TODO: Coba perbarui nilai untuk kedua kalinya
// Jika berhasil, cetak ringkasan yang sudah diperbarui
// Jika ditolak, cetak "Invalid grade rejected"
// Petunjuk: Gunakan fmt.Sprintf dengan %.2f untuk memformat nilai di Summary()
_ = newGrade1 // Hapus baris ini saat kamu menggunakan variabel tersebut
_ = newGrade2 // Hapus baris ini saat kamu menggunakan variabel tersebut
}
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