Menu
Coddy logo textTech

Metot İçeren Enum'lar

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 88 / 110.

Dart'ta enum'lar sadece basit sabit listeleri değildir; alanlara, kuruculara ve metotlara sahip olabilirler, bu da onları güçlü mini sınıflar haline getirir. Buna gelişmiş enum'lar (enhanced enums) denir ve her bir enum değerine doğrudan davranış ve veri eklemenize olanak tanır.

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

void main() {
  var status = Status.pending;
  print(status.displayName);    // Waiting
  print(status.isFinalized);    // false
  
  print(Status.approved.isFinalized);  // true
}

Her enum değeri, yapıcıyı kendi özel argümanlarıyla çağırır. Yapıcı const olmalı ve tüm alanlar final olmalıdır. Enum'ın verileriyle çalışan veya diğer değerlerle karşılaştırma yapan getter'lar ve metotlar ekleyebilirsiniz.

Geliştirilmiş enum'lar ayrıca arayüzleri de uygulayabilir, bu da onlara daha fazla esneklik sağlar:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

void main() {
  var tasks = [Priority.high, Priority.low, Priority.medium];
  tasks.sort();
  print(tasks);  // [Priority.low, Priority.medium, Priority.high]
}

Gelişmiş enum'lar, her birinin ilişkili veriye veya davranışa ihtiyaç duyduğu sabit bir değer kümesine sahip olduğunuzda -mesaj içeren durum kodları, seviye içeren öncelikler veya koordinat içeren yönler gibi- idealdir.

challenge icon

Görev

Kolay

Gelişmiş enum'ları kullanarak bir görev yönetim sistemi oluşturalım! İşleri organize etmeye ve önceliklendirmeye yardımcı olan, her biri kendi özelliklerine ve davranışlarına sahip farklı görev kategorilerini temsil eden bir enum oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • task_category.dart: Bir projedeki farklı görev türlerini temsil eden TaskCategory adında gelişmiş bir enum oluşturun. Her kategori şunlara sahip olmalıdır:
    • İnsan tarafından okunabilir bir isim için bir String label alanı
    • Bir int priority alanı (1 en yüksek öncelik, 3 en düşük öncelik olacak şekilde)
    • Her iki alanı da başlatan bir const yapıcı (constructor)
    • Dört enum değeri: bug (label: "Bug Fix", priority: 1), feature (label: "New Feature", priority: 2), documentation (label: "Documentation", priority: 3) ve testing (label: "Testing", priority: 2)
    • Öncelik 1 ise true döndüren bir isUrgent getter'ı
    • Şu formatta bir dize döndüren describe() metodu: [label] (Priority: [priority])
    Enum'ınız ayrıca Comparable<TaskCategory> arayüzünü uygulamalıdır, böylece görevler önceliğe göre sıralanabilir (düşük öncelik numarası = önce gelir).
  • main.dart: Görev kategorisi enum'ınızı içe aktarın ve yeteneklerini gösterin:
    • Şu sırayla dört görev kategorisinin tümünü içeren bir liste oluşturun: feature, bug, documentation, testing
    • Her kategorinin açıklamasını describe() metodunu kullanarak her satıra bir tane gelecek şekilde yazdırın
    • Boş bir satır yazdırın
    • Listeyi önceliğe göre sıralayın ve After sorting by priority: yazdırın
    • Sıralanmış her kategorinin etiketini (label) her satıra bir tane gelecek şekilde yazdırın
    • Boş bir satır yazdırın
    • Urgent tasks: yazdırın
    • Orijinal sıra (feature, bug, documentation, testing) üzerinde döngü kurun ve yalnızca isUrgent değeri true olan kategorilerin etiketlerini yazdırın

Bu meydan okuma, gelişmiş enum özelliklerini birleştirir: alanlar, yapıcılar, getter'lar, metodlar ve arayüz uygulama - hepsi kullanışlı bir görev kategorizasyon sistemi oluşturmak için birlikte çalışır!

Beklenen çıktı:

New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)

After sorting by priority:
Bug Fix
New Feature
Testing
Documentation

Urgent tasks:
Bug Fix

Kopya kağıdı

Dart'taki geliştirilmiş enum'lar (enhanced enums); alanlara, kuruculara ve metotlara sahip olabilir; bu da onları her bir enum değerine davranış ve veri ekleyen güçlü mini sınıflar haline getirir.

Alanları ve kurucusu olan temel bir geliştirilmiş enum:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
}

Temel gereksinimler:

  • Kurucu (Constructor) const olmalıdır
  • Tüm alanlar (fields) final olmalıdır
  • Her bir enum değeri, kurucuyu belirli argümanlarla çağırır

Geliştirilmiş enum'lar getter'lar ve metotlar içerebilir:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

Geliştirilmiş enum'lar Comparable gibi arayüzleri (interfaces) uygulayabilir:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

Her birinin ilişkili veriye veya davranışa ihtiyaç duyduğu sabit bir değer kümesine sahip olduğunuzda geliştirilmiş enum'ları kullanın.

Kendin dene

import 'task_category.dart';

void main() {
  // TODO: Bu sırayla dört görev kategorisinin tümünü içeren bir liste oluşturun:
  // feature, bug, documentation, testing
  
  // TODO: describe() kullanarak her kategorinin açıklamasını her satıra bir tane gelecek şekilde yazdırın
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Listeyi önceliğe göre sıralayın
  
  // TODO: "After sorting by priority:" yazdırın
  
  // TODO: Sıralanmış her kategorinin etiketini her satıra bir tane gelecek şekilde yazdırın
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: "Urgent tasks:" yazdırın
  
  // TODO: Orijinal sıra (feature, bug, documentation, testing) üzerinde döngü kurun
  // ve yalnızca isUrgent değeri true olan kategorilerin etiketlerini yazdırın
}
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