Soru 1: Neyi geri alacaksın?
Bir metin editörüne “Bugün hava çok güzel” yazıp geri al’a bastığını düşün. Sadece son harf mi silinmeli? O zaman geri al’ın backspace’ten farkı kalmaz. Bütün cümle mi? O da fazla.
Programlar bu yüzden düzenlemeleri gruplara ayırıyor. Yazmaktan silmeye geçtiğin an, bir şey yapıştırdığın an ya da yazım denetleyicinin bir kelimeyi düzelttiği an yeni bir grup başlıyor. Videodaki güzel bir örnek: Word’de düz tırnağın otomatik olarak “akıllı” tırnağa dönüşmesi bile ayrı bir adım. Geri al’a basınca önce o geri alınıyor.
Videodaki Dr. Steve Bagley başka bir yol da öneriyor: Duraksamaya bakmak. Hızlı yazarken araya sınır koymuyorsun, bir saniye durup düşündüysen orası bir sınır oluyor.
Çizim programında iş daha kolay: Kalemi ekrana değdirip kaldırdığın her hareket tek bir adım.
Soru 2: Nasıl saklayacaksın?
İki temel yol var.
İşlemi ve tersini saklamak. Metinde “10. konuma ‘kedi’ eklendi” diye kaydedersin. Geri almak için o konumdan dört harf silersin, yinelemek (redo) için tekrar eklersin. Kayıt küçük, iş ucuz. Yazılımda bunun adı Command tasarım kalıbı: Her değişiklik, kendini nasıl geri alacağını bilen bir nesne.
Önceki hâli saklamak. Piksel tabanlı bir resimde bir çizgiyi “geri çizemezsin”, çünkü altında ne olduğu artık yok. Çizmeden önce değişecek bölgenin bir kopyasını alman gerekiyor. Sorun bellek: Bir fotoğraf editörü sıkıştırılmamış görüntüyle çalışır, bu da tek bir resimde yüzlerce megabayt demek. Her adımda bir kopya alırsan bellek hızla doluyor.
Çoğu gerçek program ikisini karıştırıyor: Tersi kolay olan işlemler için tersini, olmayanlar için önceki hâli saklıyor.
Soru 3: Kaç adım geri?
Çok seviyeli geri al için doğal veri yapısı yığın (stack): Son giren ilk çıkar. Her değişiklik yığına itiliyor, geri al’a basınca en üstteki çıkarılıp tersine çevriliyor.
Yinele için ikinci bir yığın gerekiyor. Geri aldığın adım, yinele yığınına geçiyor. Peki birkaç adım geri gidip yeni bir şey yazarsan ne olur? Qt’nin QUndoStack sınıfı buna net cevap veriyor: Geri alınmış adımlar siliniyor, yinele geçmişi kayboluyor. Çoğu programda gördüğün davranış da bu.
Gerçek bir uygulamada birkaç ayrıntı daha çıkıyor:
- Sınır: Sonsuz geçmiş belleği bitirir. Qt’de bir üst sınır koyabiliyorsun, aşılınca en eski adımlar yığının dibinden siliniyor. Üç saat önce koyduğun bir noktayı kimse geri almak istemiyor.
- Birleştirme: Art arda gelen benzer komutlar tek komutta birleşebiliyor. Harf harf yazmayı tek bir “yazma” adımına çevirmenin yolu bu.
- Kaydedilmiş nokta: Dosyayı kaydettiğin yeri işaretlersen, geri ala geri ala oraya döndüğünde “kaydedilmemiş değişiklik var” uyarısını kaldırabilirsin.
Bonus: Neredeyse bedava geri al
Metin editörlerinde veriyi nasıl tuttuğun da işi değiştiriyor. VS Code’un kullandığı piece table yapısında dosyanın orijinal metni hiç değiştirilmiyor. Yazdığın her şey ayrı bir tampona ekleniyor, belge de “şuradan şu kadar, sonra buradan bu kadar” diyen parçaların listesi oluyor. Eski metin hiç silinmediği için, videoya göre geri al bu yapıda neredeyse bedavaya geliyor: Sadece parça listesinin eski hâline dönmek yetiyor.
Aynı fikri verinin kendisine uygulayan bir örnek olarak Dolt yazısına bakabilirsin: Orada geri alınabilir olan, bütün bir veritabanı.
Düşün
- Bir form uygulamasında geri al’ı nasıl gruplardın: Her harfte mi, her alanda mı, her kaydette mi?
- Bir yapay zekâ ajanı senin dosyalarını değiştirirken, onun yaptıklarını geri almak için hangi yolu seçerdin: işlemin tersini mi, önceki hâlin kopyasını mı?
Videoyu izle
Kaynaklar (4, İngilizce)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.