Tasarım deseni, yazılım tasarımında yaygın olarak tekrar eden bir sorunu çözen bir şablondur.
Durum modeli, bir nesnenin dahili durumu değiştiğinde davranışını değiştirmesine izin veren davranışsal bir modeldir.
Burada, TypeScript'te durum kalıbını nasıl kullanacağınızı öğreneceksiniz.
Devlet Modeli Nedir?
Durum tasarım modeli, sonlu durum makinesiyle yakından ilişkilidir ve bu, bir programda var olan bir programı tanımlar. sonlu herhangi bir anda durum sayısı ve her durum içinde farklı davranır.
Her bir durumun geçiş yapabileceği diğer durumları yöneten sınırlı, önceden belirlenmiş kurallar (geçişler) vardır.
Bağlam açısından, bir çevrimiçi mağazada, bir müşterinin alışveriş siparişi "teslim edildiyse" "iptal edilemez" çünkü zaten "teslim edilmiştir". "Teslim edildi" ve "İptal edildi" siparişin sonlu durumlarıdır ve sipariş, durumuna göre farklı davranacaktır.
durum modeli bir sınıf oluşturur her olası durum için, her sınıfta yer alan duruma özgü davranışla.
Örnek Durum Bazlı Uygulama
Örneğin, bir yayınevi için bir makalenin durumunu takip eden bir uygulama oluşturduğunuzu varsayalım. Bir makale onay bekliyor olabilir, bir yazar tarafından hazırlanabilir, bir editör tarafından düzenlenebilir veya yayınlanabilir. Bunlar yayınlanacak bir makalenin sonlu halleridir; her benzersiz durumda, makale farklı davranır.
Makale uygulamasının farklı durumlarını ve geçişlerini aşağıdaki durum diyagramı ile görselleştirebilirsiniz:
Bu senaryoyu kodda uygulayarak, önce Makale için bir arayüz bildirmeniz gerekir:
arayüzMakale Arayüzü{
saha(): geçersiz;
taslak(): geçersiz;
düzenlemek(): geçersiz;
Yayınla(): geçersiz;
}
Bu arayüz, uygulamanın tüm olası durumlarına sahip olacaktır.
Ardından, tüm arabirim yöntemlerini uygulayan bir uygulama oluşturun:
// Başvuru
sınıfMaddeuygularMakale Arayüzü{
inşaatçı() {
Bu.showCurrentState();
}özelGeçerli Durumu göster(): geçersiz{
//...
}halksaha(): geçersiz{
//...
}halktaslak(): geçersiz{
//...
}halkdüzenlemek(): geçersiz{
//...
}
halkYayınla(): geçersiz{
//...
}
}
Özel Geçerli Durumu göster yöntem bir yardımcı yöntemdir. Bu öğretici, her durumda ne olduğunu göstermek için kullanır. Durum modelinin gerekli bir parçası değildir.
Durum Geçişlerini İşleme
Ardından, durum geçişlerini halletmeniz gerekecek. Uygulama sınıfınızda durum geçişini ele almak, birçok koşullu ifadeler. Bu, okunması ve bakımı daha zor olan tekrarlayan kodlara neden olur. Bu sorunu çözmek için, her durum için geçiş mantığını kendi sınıfına devredebilirsiniz.
Her durum sınıfını yazmadan önce, geçersiz bir durumda çağrılan herhangi bir yöntemin hata vermesini sağlamak için soyut bir temel sınıf oluşturmalısınız.
Örneğin:
soyutsınıfMakale DurumuuygularMakale Arayüzü{
pitch(): ArticleState {
fırlatmakyeniHata("Geçersiz İşlem: Görev gerçekleştirilemiyor içinde mevcut durum");
}draft(): ArticleState {
fırlatmakyeniHata("Geçersiz İşlem: Görev gerçekleştirilemiyor içinde mevcut durum");
}düzenle(): ArticleState {
fırlatmakyeniHata("Geçersiz İşlem: Görev gerçekleştirilemiyor içinde mevcut durum");
}
yayınla(): ArticleState {
fırlatmakyeniHata("Geçersiz İşlem: Görev gerçekleştirilemiyor içinde mevcut durum");
}
}
Yukarıdaki temel sınıfta, her yöntem bir hata atar. Şimdi, belirli sınıflar oluşturarak her yöntemi geçersiz kılmanız gerekir. uzanır her durum için temel sınıf. Her belirli sınıf, duruma özgü mantık içerecektir.
Her uygulamanın, uygulamayı başlatan bir boşta durumu vardır. Bu uygulamanın boşta durumu, uygulamayı şu şekilde ayarlayacaktır: taslak durum.
Örneğin:
sınıfBekleyen Taslak DurumuuzanırMakale Durumu{
pitch(): ArticleState {
geri dönmekyeni DraftState();
}
}
bu saha yukarıdaki sınıftaki yöntem, mevcut durumu şu şekilde ayarlayarak uygulamayı başlatır: Taslak Durumu.
Ardından, aşağıdaki gibi yöntemlerin geri kalanını geçersiz kılın:
sınıfTaslak DurumuuzanırMakale Durumu{
draft(): ArticleState {
geri dönmekyeni EditingState();
}
}
Bu kod geçersiz kılar taslak yönteminin bir örneğini döndürür ve Düzenleme Durumu.
sınıfDüzenleme DurumuuzanırMakale Durumu{
düzenle(): ArticleState {
geri dönmekyeni PublishedState();
}
}
Yukarıdaki kod bloğu, düzenlemek yöntemi ve bir örneğini döndürür Yayın Durumu.
sınıfYayın DurumuuzanırMakale Durumu{
yayınla(): ArticleState {
geri dönmekyeni PendingDraftState();
}
}
Yukarıdaki kod bloğu, Yayınla yöntemini kullanır ve uygulamayı tekrar boşta durumuna getirir, Bekleyen Taslak Durumu.
Ardından, mevcut duruma özel bir değişken aracılığıyla başvurarak uygulamanın durumunu dahili olarak değiştirmesine izin vermeniz gerekir. Bunu, uygulama sınıfınız içinde boşta durumunu başlatarak ve değeri özel bir değişkene kaydederek yapabilirsiniz:
özel durum: ArticleState = yeni PendingDraftState();
Ardından, güncelleyin Geçerli Durumu göster geçerli durum değerini yazdırma yöntemi:
özelGeçerli Durumu göster(): geçersiz{
konsol.kayıt(Bu.durum);
}
bu Geçerli Durumu göster yöntemi, uygulamanın mevcut durumunu konsola kaydeder.
Son olarak, özel değişkeni uygulamanızın yöntemlerinin her birinde geçerli durum örneğine yeniden atayın.
Örneğin, uygulamalarınızı güncelleyin saha aşağıdaki kod bloğuna yöntem:
halksaha(): geçersiz{
Bu.durum = Bu.durum.pitch();
Bu.showCurrentState();
}
Yukarıdaki kod bloğunda, saha yöntemi, durumu geçerli durumdan adım durumuna değiştirir.
Benzer şekilde, diğer tüm yöntemler durumu mevcut uygulama durumundan kendi ilgili durumlarına değiştirecektir.
Uygulama yöntemlerinizi aşağıdaki kod bloklarına göre güncelleyin:
bu taslak yöntem:
halktaslak(): geçersiz{
Bu.durum = Bu.durum.draft();
Bu.showCurrentState();
}
bu düzenlemek yöntem:
halkdüzenlemek(): geçersiz{
Bu.durum = Bu.durum.edit();
Bu.showCurrentState();
}
Ve Yayınla yöntem:
halkYayınla(): geçersiz{
Bu.durum = Bu.durum.yayın();
Bu.showCurrentState();
}
Bitmiş Uygulamayı Kullanma
Bitmiş uygulama sınıfınız aşağıdaki kod bloğuna benzer olmalıdır:
// Başvuru
sınıfMaddeuygularMakale Arayüzü{
özel durum: ArticleState = yeni PendingDraftState();inşaatçı() {
Bu.showCurrentState();
}özelGeçerli Durumu göster(): geçersiz{
konsol.kayıt(Bu.durum);
}halksaha(): geçersiz{
Bu.durum = Bu.durum.pitch();
Bu.showCurrentState();
}halktaslak(): geçersiz{
Bu.durum = Bu.durum.draft();
Bu.showCurrentState();
}halkdüzenlemek(): geçersiz{
Bu.durum = Bu.durum.edit();
Bu.showCurrentState();
}
halkYayınla(): geçersiz{
Bu.durum = Bu.durum.yayın();
Bu.showCurrentState();
}
}
Yöntemleri doğru sırayla çağırarak durum geçişlerini test edebilirsiniz. Örneğin:
sabit dokümanlar = yeni Madde(); // PendingDraftState: {}
belgeler.pitch(); // Taslak Durumu: {}
belgeler.draft(); // Düzenleme Durumu: {}
belgeler.edit(); // Yayın Durumu: {}
belgeler.yayın(); // PendingDraftState: {}
Yukarıdaki kod bloğu, uygulamanın durumları uygun şekilde geçiş yaptığı için çalışır.
Durumu izin verilmeyen bir şekilde değiştirmeye çalışırsanız, örneğin perde durumundan düzenleme durumuna geçerseniz, uygulama bir hata atar:
sabit dokümanlar = yeni Madde(); // PendingDraftState: {}
dokümanlar.pitch() // Taslak Durumu: {}
dokümanlar.edit() // Geçersiz İşlem: Geçerli durumda görev gerçekleştirilemez
Bu kalıbı yalnızca şu durumlarda kullanmalısınız:
- Mevcut durumuna bağlı olarak farklı davranan bir nesne yaratıyorsunuz.
- Nesnenin birçok durumu vardır.
- Duruma özgü davranış sıklıkla değişir.
Devlet Modelinin Avantajları ve Takasları
Bu kalıp, hantal koşullu ifadeleri ortadan kaldırır ve tek sorumluluğu ve açık/kapalı ilkeleri korur. Ancak, uygulamanın birkaç durumu varsa veya durumları özellikle dinamik değilse, aşırıya kaçabilir.