Rekordy (Dart 3)
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 86 z 110.
Dart 3 wprowadził rekordy — lekki sposób na grupowanie wielu wartości bez tworzenia pełnej klasy. Rekordy są niezmienne, mają wbudowane porównywanie równości i idealnie nadają się do zwracania wielu wartości z funkcji lub tymczasowego grupowania powiązanych danych.
Utwórz rekord, umieszczając wartości w nawiasach:
void main() {
// Prosta krotka z dwiema wartościami
var point = (10, 20);
print(point.$1); // 10 - dostęp do pierwszego elementu
print(point.$2); // 20 - dostęp do drugiego elementu
// Krotki z polami nazwanymi
var person = (name: 'Alice', age: 30);
print(person.name); // Alice
print(person.age); // 30
}Do pól pozycyjnych odwołujesz się za pomocą $1, $2 itd., a pola nazwane wykorzystują bezpośrednio swoje nazwy. W jednym rekordzie możesz łączyć oba style.
Krotki świetnie sprawdzają się przy zwracaniu wielu wartości z funkcji — nie trzeba tworzyć klasy tylko po to, by zwrócić dwa elementy danych:
(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 reszta 2
var (name, age) = getUser();
print('$name is $age'); // Bob ma 25 lat
}Rekordy automatycznie obsługują porównywanie równości na podstawie swoich wartości, dzięki czemu można wygodnie je porównywać bez samodzielnego implementowania ==. Używaj rekordów, gdy potrzebujesz prostych, niezmiennych grup danych; używaj klas, gdy potrzebujesz metod, mutowalności lub bardziej złożonego zachowania.
Wyzwanie
ŁatwyZbudujmy układ współrzędnych przy użyciu rekordów! Utworzysz funkcje, które działają z punktami 2D reprezentowanymi jako rekordy, pokazując, jak rekordy ułatwiają zwracanie i przetwarzanie wielu powiązanych wartości bez tworzenia pełnych klas.
Podzielisz kod na dwa pliki:
geometry.dart: Utwórz funkcje, które używają rekordów do pracy z danymi współrzędnych:- Funkcję
createPoint(int x, int y), która zwraca rekord z nazwanymi polamixiy. Typem zwracanym powinno być({int x, int y}) - Funkcję
midpoint(({int x, int y}) p1, ({int x, int y}) p2), która oblicza i zwraca środek między dwoma punktami jako rekord z nazwanymi polami. Do obliczeń użyj dzielenia całkowitoliczbowego (~/) - Funkcję
distance(({int x, int y}) p1, ({int x, int y}) p2), która zwraca rekord z polami pozycyjnymi: odległość poziomą (różnicę x) i odległość pionową (różnicę y). Typem zwracanym powinno być(int, int). Oblicz je jakop2.x - p1.xorazp2.y - p1.y
- Funkcję
main.dart: Zaimportuj plik z geometrią i pokaż rekordy w działaniu:- Utwórz dwa punkty za pomocą
createPoint: punkt A w(2, 4)i punkt B w(10, 8) - Wypisz
Point A: ([x], [y]), używając nazwanych pól - Wypisz
Point B: ([x], [y]), używając nazwanych pól - Oblicz środek i wypisz
Midpoint: ([x], [y]) - Oblicz odległość i użyj destrukturyzacji, aby wyodrębnić wartości do zmiennych
dxidy, a następnie wypiszDistance: dx=[dx], dy=[dy]
- Utwórz dwa punkty za pomocą
Zauważ, jak rekordy pozwalają przejrzyście zwracać wiele wartości — używaj nazwanych pól dla jasności, gdy znaczenie ma znaczenie, a pól pozycyjnych, gdy kontekst jest oczywisty!
Oczekiwany wynik:
Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4Spróbuj swoich sił
import 'geometry.dart';
void main() {
// TODO: Utwórz punkt A w (2, 4) za pomocą createPoint
// TODO: Utwórz punkt B w (10, 8) za pomocą createPoint
// TODO: Wypisz punkt A, używając nazwanych pól: Punkt A: ([x], [y])
// TODO: Wypisz punkt B, używając nazwanych pól: Punkt B: ([x], [y])
// TODO: Oblicz punkt środkowy i wypisz: Punkt środkowy: ([x], [y])
// TODO: Oblicz odległość i użyj destrukturyzacji, aby przypisać wartości do dx i dy
// Następnie wypisz: Distance: dx=[dx], dy=[dy]
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online