Rangkuman: Pemroses Pembayaran
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 46 dari 107.
Tantangan
MudahMari kita bangun sistem pemrosesan pembayaran lengkap yang menyatukan semua konsep polimorfisme dari bab ini. Kamu akan membuat berbagai method pembayaran yang bekerja melalui interface terpadu, processor yang menerima method pembayaran apa pun melalui injeksi dependensi, dan memproses beberapa pembayaran melalui koleksi polimorfik.
Kamu akan mengatur kodemu dalam empat file:
payment.go: Definisikan interfacePaymentMethodyang mewajibkan methodProcess(amount float64) string. Ini adalah kontrak yang harus dipenuhi oleh semua tipe pembayaran.methods.go: Buat tiga tipe pembayaran yang masing-masing mengimplementasikan interfacePaymentMethod:CreditCarddengan fieldCardNumber(string) danHolderName(string). MethodProcess-nya mengembalikanCredit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]PayPaldengan fieldEmail. MethodProcess-nya mengembalikanPayPal payment of $[amount] from [Email]BankTransferdengan fieldBankNamedanAccountNumber. MethodProcess-nya mengembalikanBank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])
processor.go: Buat structPaymentProcessoryang menyimpanPaymentMethod(dependensi yang diinjeksi). Sertakan konstruktorNewPaymentProcessoryang menerimaPaymentMethod. Tambahkan methodExecutePayment(amount float64) stringyang meneruskan pemrosesan ke method pembayaran yang diinjeksi. Buat juga fungsiProcessAll(payments []PaymentMethod, amount float64) []stringyang memproses jumlah yang sama melalui setiap method pembayaran dalam slice dan mengembalikan semua hasil.main.go: Baca detail pembayaran dari input, buat ketiga tipe pembayaran, lalu tunjukkan injeksi dependensi dan koleksi polimorfik. Pertama, gunakanNewPaymentProcessordengan kartu kredit dan jalankan pembayaran. Kemudian, kumpulkan ketiga method pembayaran ke dalam slice dan gunakanProcessAlluntuk memproses semuanya dengan jumlah kedua. Cetak setiap hasil pada barisnya sendiri.
Input berikut akan diberikan:
- Baris 1: Nomor kartu kredit (misalnya,
4532015112830366) - Baris 2: Nama pemegang kartu
- Baris 3: Email PayPal
- Baris 4: Nama bank
- Baris 5: Nomor rekening (misalnya,
987654321) - Baris 6: Jumlah pembayaran pertama (untuk processor tunggal)
- Baris 7: Jumlah pembayaran kedua (untuk pemrosesan batch)
Format jumlah dengan dua angka desimal. Misalnya, jika inputnya adalah 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99, dan 50, outputmu seharusnya:
Credit Card 0366 charged $99.99 to John Smith
Credit Card 0366 charged $50.00 to John Smith
PayPal payment of $50.00 from john@email.com
Bank transfer of $50.00 via Chase (***321)Baris pertama menampilkan pembayaran tunggal melalui processor yang diinjeksi. Tiga baris berikutnya menampilkan pemrosesan batch melalui koleksi polimorfik: fungsi ProcessAll yang sama menangani semua tipe pembayaran secara seragam, menunjukkan bagaimana interface memungkinkan sistem pembayaran yang fleksibel dan mudah dikembangkan.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca input
cardNumber, _ := reader.ReadString('\n')
cardNumber = strings.TrimSpace(cardNumber)
holderName, _ := reader.ReadString('\n')
holderName = strings.TrimSpace(holderName)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
bankName, _ := reader.ReadString('\n')
bankName = strings.TrimSpace(bankName)
accountNumber, _ := reader.ReadString('\n')
accountNumber = strings.TrimSpace(accountNumber)
amount1Str, _ := reader.ReadString('\n')
amount1Str = strings.TrimSpace(amount1Str)
amount1, _ := strconv.ParseFloat(amount1Str, 64)
amount2Str, _ := reader.ReadString('\n')
amount2Str = strings.TrimSpace(amount2Str)
amount2, _ := strconv.ParseFloat(amount2Str, 64)
// TODO: Buat tiga tipe pembayaran (CreditCard, PayPal, BankTransfer)
// TODO: Buat PaymentProcessor untuk kartu kredit menggunakan NewPaymentProcessor
// dan lakukan pembayaran dengan amount1, lalu cetak hasilnya
// TODO: Buat slice PaymentMethod yang berisi ketiga tipe pembayaran
// TODO: Gunakan ProcessAll untuk memproses semua pembayaran dengan amount2
// dan cetak setiap hasil pada baris terpisah
}
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