Hatıra modelinin arkasındaki felsefe


9

İnternetin çeşitli kaynaklarından hatıra desenini okudum. Farklı kaynaklardan farklı bilgiler, bu kalıbın gerçekte neden gerekli olduğu konusunda karışıklığa neden oldu.

Dofactory uygulama bu modelin birincil amaç sisteminin durumunu geri yüklemek için olduğunu söylüyor.

Wiki birincil amaç olması olduğunu söylüyor mümkün sistemde değişiklikler geri yükleyin. Bu, farklı bir etki yaratır - bir sistemin, geri yüklemeye gerek kalmadan anı uygulamasının mümkün olduğunu söyleyerek. Ve bu geri yükleme yeteneği bunun bir özelliğidir.

OODesign diyor ki

Bazen bir noktada bir nesnenin iç durumunu yakalamak ve daha sonra nesneyi bu duruma geri yükleme yeteneğine sahip olmak gerekir. Böyle bir durum, hata veya hata durumunda faydalıdır.

Öyleyse sorum şu: Bunu tam olarak neden kullanıyoruz? Önceki devletleri kurtarmak mı yoksa Bekçi ve Memento arasındaki kapsüllemeyi teşvik etmek mi? Bu tür bir kapsülleme neden bu kadar önemlidir?

Düzenleme: Ziyaret edenler için, bu Uygulama göz atın!

Düzenleme : Sorunum için bir hatıra çözüm uygulama üzerinde çalışıyorum. Bununla ilgili başka bir soru yayınlayacağım ve bu soruyu bu soruya bağlayacağım. Değerli önerilere cevap verdiğiniz için hepinize teşekkürler!

Edit 3 : İşte benim örnek uygulama bağlantısı

Yanıtlar:


2

Benzer bir desen olan Not veya Not, durumu da depolar, ancak genellikle program hızı optimizasyonu olarak kullanılır. Zaman alan bir işlem sınırlı sayıda ortak giriş ve çıkışa sahipse, en yaygın olanları (veya tümünü) bir karma tabloda saklayabilirsiniz. Aynı girişlerle tekrar çağrıldığında, önce hashtable'ı kontrol eder ve bulursa, önceki çıktıyı yeniden hesaplamadan döndürür.

Bir Memento modelinin performans için de kullanılabileceğini hayal ediyorum - ters durum değişikliği için tüm ters hesaplamaları yapmak yerine, önceki durumdan geri yükleyin. Bazı işlevler tek yönlüdür, bu nedenle önceki durumu kaydetmedikçe geri alınamaz.

Sinüs gibi periyodik veya simetrik bir fonksiyonu hatırlamak için bir Memento kalıbı kullanabilirsiniz. Tüm değerleri 0-180 dereceden hesaplayın, ardından 180-360'tan negatif değerleri almak için geriye doğru gidin. Daha da iyisi, 0-90 arasındaki değerleri hesaplayın, sonra 90-180, 180-270 için ileri ve 270-360 arasında geriye doğru almak için bu değerler arasında geriye doğru gidin.

Word'deki Ctrl-Z veya herhangi bir yazılımın geri alma işlevi, muhtemelen hatıra kalıbı kullanılarak veya bazı durumlarda, her değişikliği yapan işlevin tersi olarak uygulanır. İkinci durumda, işlevlerin çağrıldığı tarih hatıra olur, bu yüzden hatıra deseninin her zaman geri almak için kullanıldığını düşünüyorum.


ters hesaplama önlemek ve periyodik fonksiyonlar için kullanılan ezberleme desen - bu bilgi için teşekkürler! Kavramlara sızmak için pratik bir örnek gibi bir şey yok!
TheSilverBullet

Ayrıca, ne zaman tamamlandığınıza karar vermek için Newton'un karekök yaklaşımı için yöntemi gibi bir şeyle kullanılabilir. mitpress.mit.edu/sicp/full-text/book/… Temel kayan nokta gösteriminin doğruluğu sınırlı olduğundan, tüm sayılar nihayetinde yinelenen tahminlere sahip olacaktır. Eski yaklaşımların ne olduğunu biliyorsanız, bir cevabı ilk kez tekrarladığınızda yaklaşmayı durdurabilir ve maksimum doğruluk elde edebilirsiniz (biraz zaman ve hafıza pahasına).
GlenPeterson

8

Kendi başına, Memento Kalıbı sadece durumları yakalamak ve kaydetmek için kullanılır. Kapsülleme yalnızca durumları sistemin geri kalanından korumak için mevcuttur - bir durum ele geçirildikten sonra dikkatlice kontrol edilmesi gerekir. Örneğin, kaydedildikten sonra (geçmişi değiştirecek olan) önceki bir durumu değiştirmek mantıklı değildir ve başkalarını etkilemeden bir nesnenin önceki durumuna geri dönmek mantıklı olmayabilir (önlemek için) sistemin tamamen geçersiz bir duruma girmesi).

Gördüğüm bir Memento'nun en yaygın kullanımı, işlevselliği geri almaktır. Ayrıca, zamanda geriye doğru hareket ederek yeniden işlevsellik depolamakla da ilgilidir.


Ayrıca kopya mantığı ve serileştirme mantığında da kullandım (kablo üzerinden nesne göndermek veya durumu bir dosyaya kaydetmek için).
Scott Whitlock

@ScottWhitlock Durumu bir dosyaya kaydetmek Memento için anlamlıdır. Memento nesnesi, belirli bir formata yazma ve bu formatı okuyarak yeni bir tane oluşturma yeteneğine sahip olurken, Bekçi, durumu harici bir formata kaydetmek veya harici formattan yükleme durumunu sağlamak için arayüz sağlar - bu sadece bir uzantıdır hafızada durum kaydetme. Yine de kopya mantığında kullanıldığını gerçekten göremiyorum. Bunu daha çok düşünmek zorundayım.
Thomas Owens


@ThomasOwens, açıklamada memento'nun durumları "kurtarmak" için önemli olduğu için teşekkürler. Uygulayıcının restore etmek ya da vermemek takdirindedir! Açıklamanın bu kısmını tüm referanslarımda eksik buldum!
TheSilverBullet

@ScottWhitlock, hatıra uygulamanıza bağlantı için çok teşekkürler! Sadece temel kullanımını değil, aynı zamanda yaptığınız gibi sezgisel kullanımı da anlayabildim!
TheSilverBullet

1

Tüm bu tanımlar sizi aynı yöne yönlendirir; hepsinin amacı bir şeyi önceki durumuna geri getirebilmek olduğunu söylüyor . Bir şey tüm sistem veya sadece tek bir nesne olabilir.

Bu kalıp, bir kayıt zaman içinde durumunu değiştirirse yararlıdır, ancak herhangi bir zamanda önceki bir duruma geri yükleyebilmek için iş gereksiniminiz vardır. Veya alternatif olarak, kaydı önceki herhangi bir zamanda olduğu gibi görüntüleyebilmeniz gerekiyorsa. Bu tür gereksinimler birçok sistem türünde çok yaygındır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.