Ripasso - Calcolatore di forme
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 33 di 107.
Sfida
FacileCostruiamo un calcolatore di forme che riunisce tutti i concetti sulle interfacce di questo capitolo. Creerai un sistema in cui forme geometriche diverse possono essere elaborate in modo uniforme tramite un'interfaccia condivisa, dimostrando la potenza del polimorfismo in Go.
Organizzerai il codice in tre file:
shape.go: Definisci un'interfacciaShapecon due metodi:Area() float64ePerimeter() float64. Crea anche una funzione chiamataDescribeShapeche accetta qualsiasiShapee restituisce una stringa formattata che mostra sia la sua area sia il suo perimetro.shapes.go: Crea due struct che implementano l'interfacciaShape:- Un
Rectanglecon i campiWidtheHeight - Un
Circlecon un campoRadius
Area()ePerimeter(), sia un metodoString()(che implementafmt.Stringer) che restituisce una descrizione leggibile della forma.- Un
main.go: Leggi i dati delle forme dall'input, crea le forme appropriate e usa la tua funzioneDescribeShapeper visualizzare le informazioni su ciascuna. Stampa anche direttamente ogni forma per dimostrare l'interfacciaStringer.
Verranno forniti i seguenti input:
- Riga 1: larghezza del rettangolo (numero in virgola mobile)
- Riga 2: altezza del rettangolo (numero in virgola mobile)
- Riga 3: raggio del cerchio (numero in virgola mobile)
Per i calcoli, usa 3.14159 come valore di pi. Il perimetro del cerchio è 2 * pi * radius.
I tuoi metodi String() devono restituire:
- Rectangle:
Rectangle(Width x Height) - Circle:
Circle(Radius: R)
La tua funzione DescribeShape deve restituire:
Area: [area], Perimeter: [perimeter]Formatta tutti i valori in virgola mobile con due cifre decimali usando %.2f.
Ad esempio, dati 4, 3 e 5, il tuo output dovrebbe essere:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Stampa prima ogni forma (usando il suo metodo String()), poi la sua descrizione restituita da DescribeShape. Elabora prima il rettangolo, poi il cerchio.
Provalo tu
package main
import (
"fmt"
)
func main() {
// Leggi i valori di input
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Crea un Rectangle con la larghezza e l'altezza indicate
// TODO: Crea un Circle con il raggio indicato
// TODO: Stampa il rettangolo (usa il metodo String())
// TODO: Stampa la descrizione del rettangolo usando DescribeShape()
// TODO: Stampa il cerchio (usa il metodo String())
// TODO: Stampa la descrizione del cerchio usando DescribeShape()
}
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