Resumen: Calculadora de figuras
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 33 de 107.
Desafío
FácilVamos a construir una calculadora de formas que reúna todos los conceptos de interfaces de este capítulo. Crearás un sistema donde diferentes formas geométricas puedan procesarse uniformemente a través de una interfaz compartida, demostrando el poder del polimorfismo en Go.
Organizarás tu código en tres archivos:
shape.go: Define una interfazShapecon dos métodos:Area() float64yPerimeter() float64. También crea una función llamadaDescribeShapeque acepte cualquierShapey devuelva una cadena formateada que muestre tanto su área como su perímetro.shapes.go: Crea dos structs que implementen la interfazShape:- Un
Rectanglecon los camposWidthyHeight - Un
Circlecon un campoRadius
Area()yPerimeter(), además de un métodoString()(implementandofmt.Stringer) que devuelva una descripción legible de la forma.- Un
main.go: Lee los datos de la forma desde la entrada, crea las formas apropiadas y usa tu funciónDescribeShapepara mostrar información sobre cada una. También imprime cada forma directamente para demostrar la interfazStringer.
Se proporcionarán las siguientes entradas:
- Línea 1: Ancho del rectángulo (float)
- Línea 2: Altura del rectángulo (float)
- Línea 3: Radio del círculo (float)
Para los cálculos, usa 3.14159 como el valor de pi. El perímetro del círculo es 2 * pi * radius.
Tus métodos String() deben devolver:
- Rectangle:
"Rectangle(%.2f x %.2f)" - Circle:
"Circle(Radius: %.2f)"
Tu función DescribeShape debe devolver:
"Area: %.2f, Perimeter: %.2f"Formatea todos los valores flotantes con dos decimales usando %.2f.
Por ejemplo, dados 4, 3, y 5, tu salida debería ser:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Imprime cada forma primero (usando su método String()), luego su descripción de DescribeShape. Procesa primero el rectángulo, luego el círculo.
Pruébalo tú mismo
package main
import (
"fmt"
)
func main() {
// Leer los valores de entrada
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Crear un Rectangle con el ancho y la altura dados
// TODO: Crear un Circle con el radio dado
// TODO: Imprimir el rectángulo (usa el método String())
// TODO: Imprimir la descripción del rectángulo usando DescribeShape()
// TODO: Imprimir el círculo (usa el método String())
// TODO: Imprimir la descripción del círculo usando DescribeShape()
}
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