Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Kayı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:
    • x ve y adlandırılmış alanlarına sahip bir kayıt döndüren createPoint(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.x ve p2.y - p1.y olarak hesaplayın.
  • main.dart: Geometri dosyanızı içe aktarın ve kayıtların kullanımını gösterin:
    • createPoint kullanarak 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 dx ve dy değ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=4

Kopya 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);   // 30

Konumsal 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]
}
quiz iconKendini test et

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