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.
Görev
KolayGeliş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 edenTaskCategoryadında gelişmiş bir enum oluşturun. Her kategori şunlara sahip olmalıdır:- İnsan tarafından okunabilir bir isim için bir
String labelalanı - Bir
int priorityalanı (1 en yüksek öncelik, 3 en düşük öncelik olacak şekilde) - Her iki alanı da başlatan bir
constyapıcı (constructor) - Dört enum değeri:
bug(label: "Bug Fix", priority: 1),feature(label: "New Feature", priority: 2),documentation(label: "Documentation", priority: 3) vetesting(label: "Testing", priority: 2) - Öncelik 1 ise
truedöndüren birisUrgentgetter'ı - Şu formatta bir dize döndüren
describe()metodu:[label] (Priority: [priority])
Comparable<TaskCategory>arayüzünü uygulamalıdır, böylece görevler önceliğe göre sıralanabilir (düşük öncelik numarası = önce gelir).- İnsan tarafından okunabilir bir isim için bir
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ızcaisUrgentdeğeri true olan kategorilerin etiketlerini yazdırın
- Şu sırayla dört görev kategorisinin tümünü içeren bir liste oluşturun:
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 FixKopya 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)
constolmalıdır - Tüm alanlar (fields)
finalolmalı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
}
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ı