Filosofi di balik pola kenang-kenangan

9

Saya telah membaca tentang pola kenang-kenangan dari berbagai sumber internet. Perbedaan informasi dari sumber yang berbeda membuat saya bingung mengenai mengapa pola ini sebenarnya dibutuhkan.

The dofactory implementasi mengatakan bahwa tujuan utama dari pola ini adalah untuk mengembalikan keadaan sistem.

Wiki mengatakan bahwa tujuan utamanya adalah untuk dapat mengembalikan perubahan pada sistem. Ini memberikan dampak yang berbeda - mengatakan bahwa ada kemungkinan sistem memiliki implementasi kenang-kenangan tanpa perlu memulihkan. Dan kemampuan mengembalikan itu adalah fitur dari ini.

OODesign mengatakan itu

Kadang-kadang diperlukan untuk menangkap keadaan internal suatu objek di beberapa titik dan memiliki kemampuan untuk mengembalikan objek ke keadaan itu nanti. Kasus seperti ini berguna jika terjadi kesalahan atau kegagalan.

Jadi, pertanyaan saya adalah mengapa kita menggunakan ini? Apakah itu untuk menyelamatkan negara-negara sebelumnya - atau untuk mempromosikan enkapsulasi antara Pengurus dan Memento? Mengapa jenis enkapsulasi ini begitu penting?

Sunting: Bagi mereka yang berkunjung, lihat Implementasi ini !

Sunting : Saya sedang bekerja dalam mengimplementasikan solusi kenang-kenangan untuk masalah saya. Saya akan memposting pertanyaan lain tentang itu dan menghubungkan pertanyaan itu dengan yang ini. Terima kasih semua telah merespons dengan saran yang berharga!

Sunting 3 : Berikut adalah tautan ke implementasi sampel saya

TheSilverBullet
sumber

Jawaban:

2

Pola serupa, Memo, atau Memoization, juga menyimpan status, tetapi sering digunakan sebagai pengoptimalan kecepatan program. Jika operasi yang memakan waktu memiliki jumlah input dan output umum yang terbatas, yang paling umum (atau semuanya) dapat disimpan dalam hashtable. Ketika dipanggil lagi dengan input yang sama, pertama-tama memeriksa hashtable dan jika menemukannya, ia mengembalikan output sebelumnya tanpa menghitung ulang.

Saya membayangkan pola Memento dapat digunakan untuk kinerja juga - alih-alih melakukan semua kalkulasi balik untuk perubahan keadaan terbalik, kembalikan saja dari kondisi sebelumnya. Beberapa fungsi bersifat satu arah, jadi tidak ada yang dibatalkan kecuali Anda menyimpan status sebelumnya.

Anda bisa menggunakan pola Memento untuk memoise fungsi periodik, atau simetris seperti sinus. Hitung semua nilai dari 0-180 derajat, lalu mundur untuk mendapatkan nilai negatif dari 180-360. Lebih baik lagi, hitung nilai dari 0-90, lalu mundur melalui nilai-nilai itu untuk mendapatkan 90-180, ke depan untuk 180-270, dan mundur dari 270-360.

Ctrl-Z di Word, atau fungsi undo dari setiap perangkat lunak kemungkinan dilaksanakan dengan menggunakan pola kenang-kenangan, atau dalam beberapa kasus, mungkin dengan kebalikan dari fungsi yang membuat setiap perubahan. Dalam kasus kedua, riwayat fungsi yang dipanggil adalah kenang-kenangan, jadi saya kira pola kenang-kenangan selalu digunakan untuk membatalkan.

GlenPeterson
sumber
pola menghafal yang digunakan untuk menghindari perhitungan terbalik dan untuk fungsi periodik - terima kasih atas info ini! Tidak ada contoh praktis untuk mendapatkan konsep untuk meresap!
TheSilverBullet
Itu juga dapat digunakan dengan sesuatu seperti metode Newton untuk pendekatan akar kuadrat untuk memutuskan kapan Anda selesai. mitpress.mit.edu/sicp/full-text/book/… Karena representasi floating-point yang mendasari memiliki keterbatasan akurasi, semua angka akhirnya akan memiliki perkiraan berulang. Jika Anda tahu perkiraan sebelumnya, Anda dapat berhenti memperkirakan saat pertama kali Anda mengulangi jawaban dan mendapatkan akurasi maksimal (dengan mengorbankan beberapa waktu dan memori).
GlenPeterson
8

Dengan sendirinya, Pola Memento hanya digunakan untuk menangkap dan menyimpan status. Enkapsulasi hanya ada untuk melindungi negara dari sistem - setelah negara ditangkap, perlu dikontrol dengan hati-hati. Misalnya, tidak masuk akal untuk dapat mengubah keadaan sebelumnya setelah disimpan (itu akan mengubah sejarah) dan mungkin tidak masuk akal untuk hanya kembali ke keadaan sebelumnya dari satu objek tanpa mempengaruhi yang lain (untuk mencegah sistem memasuki kondisi yang sepenuhnya tidak valid).

Penggunaan Memento yang paling umum yang pernah saya lihat adalah untuk mendukung fungsi undo. Ini juga terkait dengan menyimpan fungsi redo dengan bergerak mundur dalam waktu.

Thomas Owens
sumber
Saya juga menggunakannya dalam logika salin dan logika serialisasi (untuk mengirim objek melalui kabel, atau menyimpan status ke file).
Scott Whitlock
@ScottWhitlock Menyimpan status ke file masuk akal untuk Memento. Objek Memento akan memiliki kemampuan untuk menulis sendiri ke format yang ditentukan dan membuat yang baru dengan membaca format ini, sementara Caretaker akan menyediakan antarmuka untuk menyimpan status ke format eksternal atau memuat status dari format eksternal - itu hanya sebuah ekstensi untuk menghemat status dalam memori. Tapi saya tidak bisa melihatnya menggunakan logika copy. Saya harus memikirkannya lebih banyak.
Thomas Owens
1
Berikut ini adalah contoh menggunakannya dalam copy logic di VB6 .
Scott Whitlock
@ThomasOwens, terima kasih atas bagian penting dalam penjelasan Anda bahwa kenang-kenangan pada dasarnya adalah untuk "menyelamatkan" keadaan. Merupakan kebijaksanaan pelaksana untuk memulihkan atau tidak! Saya menemukan bagian penjelasan ini hilang dari semua referensi saya !!
TheSilverBullet
@ScottWhitlock, terima kasih banyak untuk tautan penerapan kenang-kenangan Anda! Saya dapat memahami tidak hanya penggunaan dasarnya, tetapi juga penggunaan intuitif seperti yang telah Anda lakukan!
TheSilverBullet
1

Semua definisi ini mengarahkan Anda ke arah yang sama; mereka semua mengatakan intinya adalah untuk dapat mengembalikan sesuatu ke keadaan sebelumnya. Sesuatu itu bisa menjadi keseluruhan sistem, atau hanya satu objek.

Pola ini berguna jika catatan berubah status dari waktu ke waktu, tetapi Anda memiliki persyaratan bisnis untuk dapat mengembalikannya ke keadaan sebelumnya kapan saja. Atau sebagai alternatif, jika Anda harus dapat melihat catatan seperti pada waktu sebelumnya. Jenis persyaratan ini sangat umum di banyak jenis sistem.

hvgotcodes
sumber