Menu
Coddy logo textTech

Durum Kalıbı

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

State deseni, bir nesnenin iç durumu değiştiğinde davranışını değiştirmesine olanak tanıyarak nesnenin sınıfı değişmiş gibi görünmesini sağlar. Farklı durumları yönetmek için karmaşık koşullu ifadeler kullanmak yerine, her durumu kendi sınıfında kapsüller ve davranışı mevcut durum nesnesine devredersiniz.

Desen, mevcut duruma bir referans tutan bir Context ve her olası durum için davranışı tanımlayan State sınıflarından oluşur. Context'in durumu değiştiğinde, davranışı otomatik olarak değişir:

abstract class DocumentState {
  void publish(Document doc);
  String getStatus();
}

class DraftState implements DocumentState {
  @override
  void publish(Document doc) {
    print('Moving to review...');
    doc.setState(ReviewState());
  }

  @override
  String getStatus() => 'Draft';
}

class ReviewState implements DocumentState {
  @override
  void publish(Document doc) {
    print('Document published!');
    doc.setState(PublishedState());
  }

  @override
  String getStatus() => 'Under Review';
}

class PublishedState implements DocumentState {
  @override
  void publish(Document doc) {
    print('Already published.');
  }

  @override
  String getStatus() => 'Published';
}

class Document {
  DocumentState _state = DraftState();

  void setState(DocumentState state) => _state = state;
  void publish() => _state.publish(this);
  String getStatus() => _state.getStatus();
}

void main() {
  var doc = Document();
  print(doc.getStatus());  // Taslak
  doc.publish();           // İncelemeye taşınıyor...
  print(doc.getStatus());  // İnceleme Altında
  doc.publish();           // Belge yayınlandı!
  print(doc.getStatus());  // Yayınlandı
}

Her durum sınıfı publish() eylemini farklı şekilde işler ve belgeyi bir sonraki duruma geçirebilir. Document sınıfı, mevcut durumunu kontrol etmek için koşullu ifadelere ihtiyaç duymaz; sadece o anda hangi durum nesnesi aktifse ona yetki devreder. Bu desen; sipariş işleme, medya oynatıcılar veya iş akışı sistemleri gibi belirgin davranış modlarına sahip nesneler için idealdir.

challenge icon

Görev

Kolay

State desenini kullanarak bir trafik ışığı sistemi oluşturalım! Her bir durumun ışığın rengini ve bir sonraki duruma nasıl geçeceğini belirlediği, farklı durumlar arasında döngü yapan bir trafik ışığı oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • traffic_light.dart: Bu dosya, durum sınıflarınızı ve trafik ışığı bağlamını (context) içerir. İki yöntemi olan bir TrafficLightState soyut sınıfı oluşturun: mevcut ışık rengini döndüren String getColor() ve ışığı bir sonraki durumuna geçiren void next(TrafficLight light). Üç somut durum sınıfı uygulayın:
    • RedState - renk olarak RED döndürür ve next() çağrıldığında Stop! Light is red. yazdırır, ardından GreenState durumuna geçer.
    • GreenState - renk olarak GREEN döndürür ve next() çağrıldığında Go! Light is green. yazdırır, ardından YellowState durumuna geçer.
    • YellowState - renk olarak YELLOW döndürür ve next() çağrıldığında Caution! Light is yellow. yazdırır, ardından RedState durumuna geçer.
    Ardından, RedState ile başlayan bir TrafficLight sınıfı (bağlam) oluşturun. Mevcut durumu değiştirmek için bir setState() yöntemine, mevcut duruma yetki veren bir getColor() yöntemine ve mevcut durum üzerinde next() yöntemini çağıran bir change() yöntemine sahip olmalıdır.
  • main.dart: Trafik ışığı dosyanızı içe aktarın ve State desenini iş başında gösterin. Bir TrafficLight oluşturun ve başlangıç rengini yazdırın. Ardından change() yöntemini üç kez çağırın ve her değişiklikten sonra rengi yazdırın. Bu, ışığın tüm durumlar arasında döngü yaparak başlangıca döndüğünü gösterecektir.

TrafficLight sınıfının davranışı belirlemek için herhangi bir koşullu ifadeye (if/else) ihtiyaç duymadığına dikkat edin; her durum kendi rengini ve hangi durumun sırada olduğunu bilir. Trafik ışığı sadece o an aktif olan duruma yetki verir!

Beklenen çıktı:

RED
Stop! Light is red.
GREEN
Go! Light is green.
YELLOW
Caution! Light is yellow.
RED

Kopya kağıdı

State deseni, bir nesnenin iç durumu değiştiğinde davranışını değiştirmesine olanak tanır. Karmaşık koşullu ifadeler kullanmak yerine, her durum kendi sınıfı içinde kapsüllenir.

Desen şunlardan oluşur:

  • Context: Mevcut duruma bir referans tutar
  • State sınıfları: Olası her durum için davranışı tanımlar

Temel yapı:

abstract class DocumentState {
  void publish(Document doc);
  String getStatus();
}

class DraftState implements DocumentState {
  @override
  void publish(Document doc) {
    print('Moving to review...');
    doc.setState(ReviewState());
  }

  @override
  String getStatus() => 'Draft';
}

class Document {
  DocumentState _state = DraftState();

  void setState(DocumentState state) => _state = state;
  void publish() => _state.publish(this);
  String getStatus() => _state.getStatus();
}

Bağlam (context), davranışı mevcut durum nesnesine devreder. Her durum sınıfı eylemleri farklı şekilde ele alır ve bir sonraki duruma geçiş yapabilir. Bu, mevcut durumu kontrol etmek için koşullu ifadelere olan ihtiyacı ortadan kaldırır.

Sipariş işleme, medya oynatıcılar veya iş akışı sistemleri gibi belirgin davranış modlarına sahip nesneler için idealdir.

Kendin dene

import 'traffic_light.dart';

void main() {
  // TODO: Bir TrafficLight örneği oluşturun
  
  // TODO: Başlangıç rengini yazdırın
  
  // TODO: change() fonksiyonunu çağırın ve rengi yazdırın (tüm durumlar arasında geçiş yapmak için 3 kez)
  // İlk değişim: RED -> GREEN
  
  // İkinci değişim: GREEN -> YELLOW
  
  // Üçüncü değişim: YELLOW -> RED
}
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