Record (Dart 3)
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 86 di 110.
Dart 3 ha introdotto i record: un modo leggero per raggruppare più valori senza creare una classe completa. I record sono immutabili, hanno l'uguaglianza integrata e sono perfetti per restituire più valori da una funzione o raggruppare temporaneamente dati correlati.
Crea un record racchiudendo i valori tra parentesi:
void main() {
// Un record semplice con due valori
var point = (10, 20);
print(point.$1); // 10 - accedi al primo elemento
print(point.$2); // 20 - accedi al secondo elemento
// Record con campi denominati
var person = (name: 'Alice', age: 30);
print(person.name); // Alice
print(person.age); // 30
}I campi posizionali si accedono con $1, $2, ecc., mentre per i campi denominati si usano direttamente i loro nomi. Puoi combinare entrambi gli stili in un singolo record.
I record brillano quando restituiscono più valori dalle funzioni: non serve creare una classe solo per restituire due dati:
(int, int) divideWithRemainder(int a, int b) {
return (a ~/ b, a % b);
}
(String name, int age) getUser() {
return ('Bob', 25);
}
void main() {
var (quotient, remainder) = divideWithRemainder(17, 5);
print('$quotient remainder $remainder'); // 3 remainder 2
var (name, age) = getUser();
print('$name is $age'); // Bob is 25
}I record supportano automaticamente l’uguaglianza in base ai loro valori, rendendoli pratici per i confronti senza dover implementare personalmente ==. Usa i record quando hai bisogno di semplici raggruppamenti di dati immutabili; usa le classi quando ti servono metodi, mutabilità o comportamenti più complessi.
Sfida
FacileCostruiamo un sistema di coordinate usando i record! Creerai funzioni che lavorano con punti 2D rappresentati come record, mostrando come i record rendano semplice restituire e usare più valori correlati senza creare classi complete.
Organizzerai il codice in due file:
geometry.dart: crea funzioni che usano i record per lavorare con i dati delle coordinate:- Una funzione
createPoint(int x, int y)che restituisce un record con i campi denominatixey. Il tipo restituito dovrebbe essere({int x, int y}) - Una funzione
midpoint(({int x, int y}) p1, ({int x, int y}) p2)che calcola e restituisce il punto medio tra due punti come record con campi denominati. Usa la divisione intera (~/) per il calcolo - Una funzione
distance(({int x, int y}) p1, ({int x, int y}) p2)che restituisce un record con campi posizionali: la distanza orizzontale (differenza in x) e la distanza verticale (differenza in y). Il tipo restituito dovrebbe essere(int, int). Calcolap2.x - p1.xep2.y - p1.y
- Una funzione
main.dart: importa il tuo file geometry e mostra i record in azione:- Crea due punti usando
createPoint: il punto A in(2, 4)e il punto B in(10, 8) - Stampa
Point A: ([x], [y])usando i campi denominati - Stampa
Point B: ([x], [y])usando i campi denominati - Calcola il punto medio e stampa
Midpoint: ([x], [y]) - Calcola la distanza e usa la destrutturazione per estrarre i valori nelle variabili
dxedy, poi stampaDistance: dx=[dx], dy=[dy]
- Crea due punti usando
Nota come i record ti permettono di restituire più valori in modo pulito: campi denominati per maggiore chiarezza quando il significato è importante, e campi posizionali quando il contesto è ovvio!
Output previsto:
Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4Provalo tu
import 'geometry.dart';
void main() {
// TODO: Crea il punto A in (2, 4) usando createPoint
// TODO: Crea il punto B in (10, 8) usando createPoint
// TODO: Stampa Point A usando i campi con nome: Point A: ([x], [y])
// TODO: Stampa Point B usando i campi con nome: Point B: ([x], [y])
// TODO: Calcola il punto medio e stampa: Midpoint: ([x], [y])
// TODO: Calcola la distanza e usa la destrutturazione per assegnare i valori a dx e dy
// Poi stampa: Distance: dx=[dx], dy=[dy]
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online