Rangkuman: Hierarki Karyawan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 40 dari 107.
Tantangan
MudahMari kita bangun sistem hierarki pegawai untuk sebuah perusahaan yang menunjukkan cara composition memodelkan struktur organisasi dunia nyata dengan elegan. Kamu akan membuat tipe pegawai dasar yang dapat diperluas oleh peran khusus dengan perilaku uniknya masing-masing.
Kamu akan mengatur kodemu dalam tiga file:
employee.go: Buat fondasinya dengan structEmployeeyang berisi fieldID,Name, danBaseSalary(float64). Tambahkan dua method:Info() stringyang mengembalikan[ID] [Name]CalculateBonus() float64yang mengembalikan 10% dari gaji pokok
roles.go: Buat dua tipe pegawai khusus yang menyematkanEmployee:Managerdengan fieldTeamSize(int): manager mendapat bonus lebih besar, yaitu 20% dari gaji pokok ditambah $100 untuk setiap anggota tim. Timpa methodCalculateBonusuntuk menerapkan hal ini.Developerdengan fieldLanguage(string): developer tetap mendapat bonus standar, tetapi menimpa methodInfountuk menambahkan bahasa pemrograman mereka:[ID] [Name] ([Language])
main.go: Baca detail pegawai dari input, buat satu Manager dan satu Developer, lalu tampilkan info dan bonus yang dihitung untuk setiap pegawai.
Input berikut akan diberikan:
- Baris 1: ID Manager
- Baris 2: Nama Manager
- Baris 3: Gaji pokok Manager (float64)
- Baris 4: Ukuran tim Manager (integer)
- Baris 5: ID Developer
- Baris 6: Nama Developer
- Baris 7: Gaji pokok Developer (float64)
- Baris 8: Bahasa pemrograman Developer
Untuk setiap pegawai, cetak info mereka, lalu bonus pada baris berikutnya. Format bonus dengan dua angka di belakang koma.
Misalnya, jika inputnya adalah M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000, dan Go, outputmu seharusnya:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Perhatikan bagaimana perhitungan bonus Manager (20% dari 80000 + 5×100 = 16500) berbeda dari bonus standar Developer sebesar 10%, sementara Developer menyesuaikan cara infonya ditampilkan. Kedua tipe tetap memiliki akses ke field Employee yang disematkan dan dapat memanggil method aslinya saat diperlukan.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca detail Manager
managerID, _ := reader.ReadString('\n')
managerID = strings.TrimSpace(managerID)
managerName, _ := reader.ReadString('\n')
managerName = strings.TrimSpace(managerName)
managerSalaryStr, _ := reader.ReadString('\n')
managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)
teamSizeStr, _ := reader.ReadString('\n')
teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))
// Baca detail Developer
devID, _ := reader.ReadString('\n')
devID = strings.TrimSpace(devID)
devName, _ := reader.ReadString('\n')
devName = strings.TrimSpace(devName)
devSalaryStr, _ := reader.ReadString('\n')
devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)
devLanguage, _ := reader.ReadString('\n')
devLanguage = strings.TrimSpace(devLanguage)
// TODO: Buat Manager menggunakan nilai yang telah kamu baca
// Petunjuk: Gunakan komposisi. Manager menyematkan Employee
// TODO: Buat Developer menggunakan nilai yang telah kamu baca
// Petunjuk: Gunakan komposisi. Developer menyematkan Employee
// TODO: Cetak info dan bonus manager (format bonus dengan 2 angka di belakang koma)
// Gunakan fmt.Printf dengan "%.2f" untuk mengatur format
// TODO: Cetak info dan bonus developer (format bonus dengan 2 angka di belakang koma)
}
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