Resumen - Jerarquía de empleados
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 40 de 107.
Desafío
FácilVamos a construir un sistema de jerarquía de empleados para una empresa que demuestre cómo la composición modela elegantemente las estructuras organizativas del mundo real. Crearás un tipo de empleado base que los roles especializados pueden extender con sus propios comportamientos únicos.
Organizarás tu código en tres archivos:
employee.go: Crea la base con un structEmployeeque contenga los camposID,NameyBaseSalary(float64). Dale dos métodos:Info() stringque devuelva[ID] [Name]CalculateBonus() float64que devuelva el 10% del salario base
roles.go: Crea dos tipos de empleados especializados que incrusten (embed)Employee:Managercon un campoTeamSize(int): los gerentes obtienen un bono mayor: 20% del salario base más $100 por cada miembro del equipo. Sombrea (shadow) el métodoCalculateBonuspara implementar esto.Developercon un campoLanguage(string): los desarrolladores mantienen el bono estándar pero sombrean el métodoInfopara añadir su lenguaje de programación:[ID] [Name] ([Language])
main.go: Lee los detalles de los empleados desde la entrada, crea un Manager y un Developer, luego muestra la información de cada empleado y su bono calculado.
Se proporcionarán las siguientes entradas:
- Línea 1: ID del Manager
- Línea 2: Nombre del Manager
- Línea 3: Salario base del Manager (float64)
- Línea 4: Tamaño del equipo del Manager (entero)
- Línea 5: ID del Developer
- Línea 6: Nombre del Developer
- Línea 7: Salario base del Developer (float64)
- Línea 8: Lenguaje de programación del Developer
Para cada empleado, imprime su información seguida de su bono en la siguiente línea. Formatea los bonos con dos decimales.
Por ejemplo, dados M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000, y Go, tu salida debería ser:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Observa cómo el cálculo del bono del Manager (20% de 80000 + 5×100 = 16500) difiere del bono estándar del 10% del Developer, mientras que el Developer personaliza cómo se muestra su información. Ambos tipos siguen teniendo acceso a los campos incrustados de Employee y pueden llamar a los métodos originales cuando sea necesario.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Leer los detalles del Gerente
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))
// Leer los detalles del Desarrollador
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: Crear un Manager usando los valores leídos
// Sugerencia: Usar composición - Manager incorpora a Employee
// TODO: Crear un Developer usando los valores leídos
// Sugerencia: Usar composición - Developer incorpora a Employee
// TODO: Imprimir la información del manager y el bono (bono formateado con 2 decimales)
// Usar fmt.Printf con "%.2f" para el formateo
// TODO: Imprimir la información del developer y el bono (bono formateado con 2 decimales)
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO en Go
Archivos externosEspacio de trabajo y módulos de GoPaquetes e importacionesNombres exportados vs. no exportadosIntroducción a la POO en GoStructs como clasesDefinición de métodos en structsReceptores de puntero vs. de valorInicialización de structsFunciones constructorasResumen - Calculadora simple4Interfaces
Introducción a las interfacesImplementación implícitaLa interfaz como contratoInterfaz vacía (any)Type AssertionType SwitchComposición de interfacesInterfaces Stringer y ErrorResumen: Calculadora de figuras7Encapsulamiento
Campos exportados vs. no exportadosEncapsulamiento a nivel de paqueteMétodos Getter y SetterOcultamiento de información en GoResumen - Registros de estudiantes10Genéricos (Go 1.18+)
Introducción a los GenéricosParámetros de tipoRestricciones de tipoStructs genéricosSolución alternativa para métodos genéricosResumen - Colección genérica13Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón Abstract FactoryPatrón ObserverPatrón Strategy2Inmersión profunda en Tipos y Structs
Tipos básicos y compuestosDefiniciones de tipos personalizadosEtiquetas de StructsStructs anónimosStructs anidadosValores cero y por defectoRepaso - Libreta de contactos5Composición sobre herencia
Por qué Go no tiene herenciaConceptos básicos de incrustación de structsPromoción de métodosIncrustación de múltiples structsIncrustación vs AgregaciónShadowing de métodos incrustadosResumen - Jerarquía de empleados8Manejo de Errores y OOP
La interfaz errorTipos de errores personalizadosEnvoltura de errores (fmt.Errorf)Errores centinelaerrors.Is() y errors.As()Panic, Defer y RecoverResumen - Analizador de archivos3Punteros y Memoria
Fundamentos de punteros en GoPunteros a StructsPaso por valor vs referenciaLa función new()Garbage Collection en GoResumen - Constructor de Linked List6Polimorfismo en Go
Polimorfismo mediante interfacesDuck Typing en GoReglas de satisfacción de interfacesColecciones polimórficasInyección de dependenciasResumen - Procesador de pagos9Concurrencia y POO
Fundamentos de GoroutinesChannels y comunicaciónChannels con buffer vs. sin bufferSentencia Selectsync.Mutex y sync.RWMutexsync.WaitGroupDiseño de estructuras Thread-SafeResumen - Worker Pool