Riepilogo: gerarchia dei dipendenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 40 di 107.
Sfida
FacileCostruiamo un sistema gerarchico per i dipendenti di un'azienda che mostri come la composizione modelli in modo elegante le strutture organizzative del mondo reale. Creerai un tipo base per i dipendenti, che i ruoli specializzati potranno estendere con comportamenti specifici.
Organizzerai il codice in tre file:
employee.go: Crea le fondamenta con una structEmployeecontenente i campiID,NameeBaseSalary(float64). Aggiungi due metodi:Info() stringche restituisce[ID] [Name]CalculateBonus() float64che restituisce il 10% dello stipendio base
roles.go: Crea due tipi specializzati di dipendente che incorporanoEmployee:Managercon un campoTeamSize(int): i manager ricevono un bonus più alto, pari al 20% dello stipendio base più 100 $ per ogni membro del team. Ridefinisci il metodoCalculateBonusper implementare questo comportamento.Developercon un campoLanguage(string): gli sviluppatori mantengono il bonus standard, ma ridefiniscono il metodoInfoper aggiungere il loro linguaggio di programmazione:[ID] [Name] ([Language])
main.go: Leggi i dati dei dipendenti dall'input, crea un Manager e un Developer, quindi mostra le informazioni e il bonus calcolato di ciascun dipendente.
Verranno forniti i seguenti input:
- Riga 1: ID del Manager
- Riga 2: nome del Manager
- Riga 3: stipendio base del Manager (float64)
- Riga 4: dimensione del team del Manager (intero)
- Riga 5: ID del Developer
- Riga 6: nome del Developer
- Riga 7: stipendio base del Developer (float64)
- Riga 8: linguaggio di programmazione del Developer
Per ogni dipendente, stampa le sue informazioni e, nella riga successiva, il suo bonus. Formatta i bonus con due cifre decimali.
Ad esempio, dati M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000 e Go, l'output dovrebbe essere:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Nota come il calcolo del bonus del Manager (20% di 80000 + 5×100 = 16500) differisca dal bonus standard del 10% del Developer, mentre il Developer personalizza la visualizzazione delle proprie informazioni. Entrambi i tipi hanno comunque accesso ai campi di Employee incorporati e possono chiamare i metodi originali quando necessario.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Leggi i dati del 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))
// Leggi i dati del 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: Crea un Manager usando i valori letti
// Suggerimento: usa la composizione - Manager incorpora Employee
// TODO: Crea un Developer usando i valori letti
// Suggerimento: usa la composizione - Developer incorpora Employee
// TODO: Stampa le informazioni del manager e il bonus (bonus formattato con 2 cifre decimali)
// Usa fmt.Printf con "%.2f" per la formattazione
// TODO: Stampa le informazioni del developer e il bonus (bonus formattato con 2 cifre decimali)
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP in Go
File esterniWorkspace e moduli GoPacchetti e importazioniNomi esportati e non esportatiIntroduzione all’OOP in GoGli struct come classiDefinire metodi sugli structReceiver con puntatore vs receiver con valoreInizializzazione degli structFunzioni costruttriciRiepilogo - Calcolatrice semplice4Interfacce
Introduzione alle interfacceImplementazione implicitaL’interfaccia come contrattoInterfaccia vuota (any)Asserzione di tipoSwitch sul tipoComposizione di interfacceInterfacce Stringer ed ErrorRipasso - Calcolatore di forme7Incapsulamento
Campi esportati e non esportatiIncapsulamento a livello di packageMetodi Getter e SetterNascondimento delle informazioni in GoRiepilogo - Registri degli studenti10Tipi generici (Go 1.18+)
Introduzione ai tipi genericiParametri di tipoVincoli di tipoStruct genericheSoluzione alternativa per i metodi genericiRiepilogo - Collezione generica13Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello Abstract FactoryModello ObserverModello Strategy2Approfondimento su tipi e struct
Tipi di base e compostiDefinizioni di tipi personalizzatiTag delle structStruct anonimeStruct annidateValori zero e predefinitiRipasso - Rubrica5Composizione invece dell'ereditarietà
Perché Go non ha l'ereditarietàFondamenti dell'embedding delle structPromozione dei metodiEmbedding di più structEmbedding e aggregazione a confrontoMascheramento dei metodi embeddedRiepilogo: gerarchia dei dipendenti8Gestione degli errori e OOP
L'interfaccia errorTipi di errore personalizzatiWrapping degli errori (fmt.Errorf)Errori sentinellaerrors.Is() ed errors.As()Panic, Defer e RecoverRiepilogo - Parser di file11Libreria standard e OOP
io.Reader e io.Writersort.InterfaceInterfaccia fmt.Stringerencoding/json con le structInterfaccia http.HandlerRipasso - modelli REST API14Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeMiddleware come Decorator3Puntatori e memoria
Concetti base dei puntatori in GoPuntatori a structPassaggio per valore vs per riferimentoLa funzione new()Garbage collection in GoRiepilogo - Costruttore di liste concatenate6Polimorfismo in Go
Polimorfismo tramite interfacceDuck typing in GoRegole di soddisfacimento delle interfacceCollezioni polimorficheIniezione delle dipendenzeRiepilogo - Elaboratore di pagamenti9Concorrenza e OOP
Basi delle goroutineCanali e comunicazioneCanali bufferizzati vs non bufferizzatiIstruzione selectsync.Mutex e sync.RWMutexsync.WaitGroupProgettazione di struct thread-safeRiepilogo: worker poolEsercitati da solo: Compilatore Go online