Records (Dart 3)
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 86 / 110.
Dart 3, tam bir sınıf oluşturmadan birden fazla değeri bir araya getirmenin hafif bir yolu olan records özelliğini tanıttı. Records değişmezdir, yerleşik eşitlik özelliğine sahiptir ve bir fonksiyondan birden fazla değer döndürmek veya ilgili verileri geçici olarak gruplandırmak için mükemmeldir.
Değerleri parantez içine alarak bir record oluşturun:
void main() {
// İki değerli basit bir record
var point = (10, 20);
print(point.$1); // 10 - birinci elemana erişim
print(point.$2); // 20 - ikinci elemana erişim
// İsimlendirilmiş alanlara sahip record'lar
var person = (name: 'Alice', age: 30);
print(person.name); // Alice
print(person.age); // 30
}Konumsal alanlara $1, $2 vb. ile erişilirken, adlandırılmış alanlar doğrudan adlarını kullanır. Her iki stili de tek bir kayıtta karıştırabilirsiniz.
Fonksiyonlardan birden fazla değer döndürürken record'lar öne çıkar; sadece iki veri parçasını döndürmek için bir sınıf oluşturmaya gerek yoktur:
(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 kalan 2
var (name, age) = getUser();
print('$name is $age'); // Bob 25 yaşında
}Record'lar, değerlerine dayalı eşitliği otomatik olarak destekler; bu da == operatörünü kendiniz uygulamanıza gerek kalmadan onları karşılaştırmalar için kullanışlı hale getirir. Basit, değişmez veri gruplandırmalarına ihtiyaç duyduğunuzda record'ları; metotlara, değişebilirliğe veya daha karmaşık davranışlara ihtiyaç duyduğunuzda ise sınıfları kullanın.
Görev
KolayKayıtları (records) kullanarak bir koordinat sistemi oluşturalım! Tam sınıflar oluşturmadan birden fazla ilişkili değerle çalışmayı ve bunları döndürmeyi kolaylaştıran kayıtlarla çalışan fonksiyonlar oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
geometry.dart: Koordinat verileriyle çalışmak için kayıtları kullanan fonksiyonlar oluşturun:xveyadlandırılmış alanlarına sahip bir kayıt döndürencreatePoint(int x, int y)fonksiyonu. Dönüş türü({int x, int y})olmalıdır.- İki nokta arasındaki orta noktayı adlandırılmış alanlara sahip bir kayıt olarak hesaplayan ve döndüren
midpoint(({int x, int y}) p1, ({int x, int y}) p2)fonksiyonu. Hesaplama için tam sayı bölme (~/) kullanın. - Konumsal alanlara sahip bir kayıt döndüren
distance(({int x, int y}) p1, ({int x, int y}) p2)fonksiyonu: yatay mesafe (x farkı) ve dikey mesafe (y farkı). Dönüş türü(int, int)olmalıdır.p2.x - p1.xvep2.y - p1.yolarak hesaplayın.
main.dart: Geometri dosyanızı içe aktarın ve kayıtların kullanımını gösterin:createPointkullanarak iki nokta oluşturun:(2, 4)konumunda nokta A ve(10, 8)konumunda nokta B.- Adlandırılmış alanları kullanarak
'Point A: (${pointA.x}, ${pointA.y})'yazdırın. - Adlandırılmış alanları kullanarak
'Point B: (${pointB.x}, ${pointB.y})'yazdırın. - Orta noktayı hesaplayın ve
'Midpoint: (${mid.x}, ${mid.y})'yazdırın. - Mesafeyi hesaplayın ve değerleri
dxvedydeğişkenlerine çıkarmak için yapı sökme (destructuring) kullanın, ardından'Distance: dx=$dx, dy=$dy'yazdırın.
Kayıtların birden fazla değeri ne kadar temiz bir şekilde döndürmenize izin verdiğine dikkat edin - anlamın önemli olduğu durumlarda netlik için adlandırılmış alanlar, bağlamın açık olduğu durumlarda ise konumsal alanlar!
Beklenen çıktı:
Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4Kopya kağıdı
Dart 3, tam bir sınıf oluşturmadan birden fazla değeri bir araya getirmenin hafif bir yolu olan kayıtları (records) tanıttı. Kayıtlar değiştirilemezdir (immutable) ve bir fonksiyondan birden fazla değer döndürmek için mükemmeldir.
Değerleri parantez içine alarak bir kayıt oluşturun:
// Konumsal alanlara sahip basit kayıt
var point = (10, 20);
print(point.$1); // 10 - ilk öğeye erişim
print(point.$2); // 20 - ikinci öğeye erişim
// İsimlendirilmiş alanlara sahip kayıtlar
var person = (name: 'Alice', age: 30);
print(person.name); // Alice
print(person.age); // 30Konumsal alanlara $1, $2 vb. ile erişilirken, isimlendirilmiş alanlar doğrudan kendi adlarını kullanır.
Kayıtlar, fonksiyonlardan birden fazla değer döndürmek için idealdir:
// Dönüş türü kayıt yapısını belirtir
(int, int) divideWithRemainder(int a, int b) {
return (a ~/ b, a % b);
}
// Dönüş türünde isimlendirilmiş alanlar
(String name, int age) getUser() {
return ('Bob', 25);
}
// Kayıtları parçalarına ayırma (Destructuring)
var (quotient, remainder) = divideWithRemainder(17, 5);
print('$quotient remainder $remainder'); // 3 remainder 2
var (name, age) = getUser();
print('$name is $age'); // Bob is 25İsimlendirilmiş alanlara sahip kayıt dönüş türleri süslü parantez kullanır:
({int x, int y}) createPoint(int x, int y) {
return (x: x, y: y);
}Kayıtlar, değerlerine dayalı eşitliği otomatik olarak destekler.
Kendin dene
import 'geometry.dart';
void main() {
// TODO: createPoint kullanarak (2, 4) konumunda A noktasını oluşturun
// TODO: createPoint kullanarak (10, 8) konumunda B noktasını oluşturun
// TODO: İsimlendirilmiş alanları kullanarak A Noktasını yazdırın: Point A: ([x], [y])
// TODO: İsimlendirilmiş alanları kullanarak B Noktasını yazdırın: Point B: ([x], [y])
// TODO: Orta noktayı hesaplayın ve yazdırın: Midpoint: ([x], [y])
// TODO: Mesafeyi hesaplayın ve dx ile dy değişkenlerine ayıklamak için yapı sökme (destructuring) kullanın
// Ardından yazdırın: Distance: dx=[dx], dy=[dy]
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama13İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımExtension MetotlarÇağrılabilir SınıflarSealed Sınıflar (Dart 3)Records (Dart 3)Desenler ve Eşleştirme (3.0)Metot İçeren Enum'lar2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı