Recapitulação - Calculadora de Formas
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy. Lição 33 de 107.
Desafio
FácilVamos criar uma calculadora de formas que reúne todos os conceitos de interfaces deste capítulo. Você criará um sistema no qual diferentes formas geométricas podem ser processadas uniformemente por meio de uma interface compartilhada, demonstrando o poder do polimorfismo em Go.
Você organizará seu código em três arquivos:
shape.go: Defina uma interfaceShapecom dois métodos:Area() float64ePerimeter() float64. Crie também uma função chamadaDescribeShapeque aceite qualquerShapee retorne uma string formatada mostrando tanto sua área quanto seu perímetro.shapes.go: Crie duas estruturas que implementem a interfaceShape:- Um
Rectanglecom os camposWidtheHeight - Um
Circlecom um campoRadius
Area()ePerimeter(), além de um métodoString()(implementandofmt.Stringer) que retorne uma descrição legível da forma.- Um
main.go: Leia os dados das formas da entrada, crie as formas apropriadas e use sua funçãoDescribeShapepara exibir informações sobre cada uma delas. Imprima também cada forma diretamente para demonstrar a interfaceStringer.
As seguintes entradas serão fornecidas:
- Linha 1: largura do Rectangle (float)
- Linha 2: altura do Rectangle (float)
- Linha 3: raio do Circle (float)
Para os cálculos, use 3.14159 como o valor de pi. O perímetro do Circle é 2 * pi * radius.
Seus métodos String() devem retornar:
- Rectangle:
Rectangle(Width x Height) - Circle:
Circle(Radius: R)
Sua função DescribeShape deve retornar:
Area: [area], Perimeter: [perimeter]Formate todos os valores float com duas casas decimais usando %.2f.
Por exemplo, dadas as entradas 4, 3 e 5, sua saída deverá ser:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Imprima cada forma primeiro (usando seu método String()) e, em seguida, sua descrição usando DescribeShape. Processe o rectangle primeiro e depois o circle.
Experimente você mesmo
package main
import (
"fmt"
)
func main() {
// Lê os valores de entrada
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Create a Rectangle com os valores de width e height fornecidos
// TODO: Create a Circle com o radius fornecido
// TODO: Print o rectangle (usa o método String())
// TODO: Print a descrição do rectangle usando DescribeShape()
// TODO: Print o circle (usa o método String())
// TODO: Print a descrição do circle usando DescribeShape()
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosWorkspace e Módulos do GoPacotes e ImportsNomes Exportados vs. Não ExportadosIntrodução à OOP em GoStructs como ClassesDefinindo Métodos em StructsReceptores de Ponteiro vs. de ValorInicialização de StructsFunções ConstrutorasRecapitulação — Calculadora Simples4Interfaces
Introdução às InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Asserção de TipoSwitch de TipoComposição de InterfacesInterfaces Stringer e ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs. Não ExportadosEncapsulamento no Nível de PacoteMétodos Getters e SettersOcultação de Informações em GoRecapitulação - Registros de Alunos10Genéricos (Go 1.18+)
Introdução aos genéricosParâmetros de tipoRestrições de tipoStructs genéricasAlternativa para métodos genéricosRecapitulação - Coleção genérica13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão Abstract FactoryPadrão ObserverPadrão Strategy2Tipos e Structs em Profundidade
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosTags de StructStructs AnônimasStructs AninhadasValores Zero e PadrõesRecapitulação - Livro de Contatos5Composição em vez de herança
Por que Go não tem herançaNoções básicas de incorporação de structsPromoção de métodosIncorporação de várias structsIncorporação vs agregaçãoOcultação de métodos incorporadosRecapitulação - Hierarquia de funcionários8Tratamento de Erros e OOP
A interface errorTipos de Erro PersonalizadosEncapsulamento de Erros (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - Analisador de Arquivos3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs. ReferênciaA Função new()Coleta de Lixo em GoRecapitulação - Construtor de Lista Ligada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfacesColeções PolimórficasInjeção de DependênciasRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e comunicaçãoCanais com e sem bufferInstrução selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de structs thread-safeRevisão - Worker PoolPratique por conta própria: Compilador de Go online