2010-02-25 18 views
5

Mementos'u Tutmak için cadı koleksiyonunda Memento pattern (Geri Al/Yinele)Geri Al/Yinele Memento kullanarak: Yığın, Kuyruk veya sadece LinkedList?

uygulandığında en iyi olan nedir?

    0 
        *c 
      -1 0 
        *c 
     -2 -1 0 
        *c 
-3 -2 -1 0 
        <u 
     -2 -1 0 1 
        *c 
-3 -2 -1 0 

Varyantlar: - Mümkün prensipte belki optimize edilmemiş

  • LinkedList

    Temelde, bu (c = değişikliği u = geri al, r = redo) gerekir.

  • Kuyruk - bu görev için uygun değil, IMO.
  • Yığın - geri alma ve yeniden yapma için uyarlanmamış;
  • Çift Yığın - belki en iyisi, ancak maksimum boyutu geri almayı kontrol edemiyor.
+0

mi kullanılır? –

+0

Hayır, bu bir projedir. geri al/yineleme işlevselliğini uyguluyoruz. Bu durum için yığınlar ve sıralar kullanılabilirliği ile biraz karıştı. – serhio

cevap

1

Son olarak, bu ödev LinkedList

Public Sub Add(ByVal item As T) 
    If _list.Count > 0 Then 
    If Me.IsFull Then 
     ' we forgot (delete) the oldest state ' 
     _list.RemoveFirst() 
    End If 
    ' remove all the following the current items objects ' 
    Dim lastNode As LinkedListNode(Of T) = _list.Last 
    While Not Object.ReferenceEquals(_currentNode, lastNode) 
     _list.RemoveLast() 
     lastNode = _list.Last 
    End While 
    End If 

    ' add the new item and point current to it ' 
    _currentNode = _list.AddLast(item) 
End Sub 
0

Geri aldığınızda, en son üzerine yazılan verilere dönmek isteyeceksiniz. Yani kullanmak isteyeceğiniz memento, koleksiyona eklenen son kişi olacaktır. Yığınlar ilk çıkışta (LIFO) olduğu gibi, niyetleriniz için ideal olmalıdır.

Not: Geri alma işlevselliğini uygulamak için çok kullanışlı olduğundan komut desenine bakmak isteyebilirsiniz.

Düzeltme: Yeniden yapmak istediğinizi fark etmediniz. Eşyalarınızdan kurtulmak, sizin amaçlarınız için çok fazla kullanılmayacak şekilde kurtulmaktan kurtulacaktır. Bağlantılı liste çalışmalıdır.

+0

evet, ama memento yeterince iyi görünüyor.Ancak, "ezberlemek" için çok büyük bir cisim var, bu yüzden üzerinde Clone() uygulaması ile bir çalışma olacak. – serhio

+0

Yorumunuzu yukarıdaki düzenlemede yanıtladı. Origanally – sfg

+0

BağlantılıList'in tekrar yapmasını istediğinizi farketmediniz. Bazı elemanlar Sonra ve Önce ekleyebilir, bu yüzden arzu edilmez. Yığın - Geri Aldığımda, yine de Eylemi Yeniden Yapabilmem gerekir. Yani, "dışarı" elemanı "kesin" olmamalıdır. – serhio

0

Kullanıcının geri almak veya yeniden yapmak için birden fazla öğe seçebilmesini ister misiniz? Bu durumda

, o zaman (WPF/Silverlight ise) böylece ürün arayüzünde görüntülenen edilebilecek bir jenerik Liste veya ObservableCollection kullanmak istersiniz. İki listeyi kullanabilirsiniz: Biri geri almak için ve bir tanesi tekrarlamak için.

+0

no, sadece bir geri al ve yinele düğmesi. – serhio

0

Çift bağlantılı bir liste kullanın. Kullanıcılar geri almayı/geri almayı kullandıklarında, durumu birkaç kez indeksleyebilirler (örneğin, 4'ü geri al, sonra çok ileri gittiklerini ve tekrar yapmanın farkına varırlar). Tek bir yığın veya sıra bunu desteklemez.

İki yığınlarının geri alma desteklemek ve yeniden, ama onları kullanan bir atık türüdür düşünürler. Tüm redo mementosları, kullanıcı bir düzenleme yaptığında (yeni bir memento oluşturur) silinir. Yani, çoğu zaman bir uygulama çalışıyor, 'redo' mementos olmayacak.

Etiketlemenizden bu yana çöp toplama yaptığınız varsayılmaktadır .net: Bir kullanıcı bir düzenleme yaptığında, tümüyle çift bağlantılı listeyle ilgili yapmanız gereken, bağlantılı listenin baş başvurusunu geçerli memento olarak ayarlamasıdır. Eğer bir yığın kullanırsanız, o zaman gc menitos'u serbest bırakmak için yeni bir yığın oluşturmalı ya da her şeyi açmalısınız.

İlgili konular