Tôi sẽ đưa ra một câu trả lời khác, nhưng tôi nghĩ rằng mức độ phù hợp vẫn chưa đủ.
Chủ đề không quan trọng, và googling nó trả về một số kết quả tốt. Nhiều ứng dụng thực hiện thao tác "hoàn tác" và có nhiều biến thể.
Có 2 mẫu thiết kế mà có thể giúp chúng ta ra khỏi đây:
Command
: đó là một reification của một hành động
Memento
: trong đó bao gồm trong việc lưu trữ nhà nước (thường ngụ ý một số hình thức serialization)
Mẫu Command
được sử dụng nhiều trong môi trường đồ họa vì thường có nhiều cách khác nhau để thực hiện hành động. Hãy suy nghĩ về tiết kiệm trong Microsoft Word ví dụ:
- bạn có thể click vào tiết kiệm biểu tượng
- bạn có thể đi vào file menu và bấm vào Lưu
- bạn sử dụng các phím tắt , thường là CTRL + S
Và dĩ nhiên lưu có thể được triển khai dưới dạng lưu dưới dạng.
Ưu điểm của Command
mẫu ở đây là gồm hai phần:
- bạn có thể tạo một ngăn xếp của các đối tượng
- bạn có thể hỏi mọi đối tượng để thực hiện một hoạt động
undo
Giờ đây, có các vấn đề khác nhau phù hợp với undo
:
- không thể hoàn tác một số thao tác (ví dụ: xem xét
rm
trên Linux hoặc thùng rác trống hành động trên Windows)
- một số thao tác khó hoàn tác hoặc có thể không tự nhiên (bạn cần lưu trữ một số trạng thái, đối tượng thường bị phá hủy nhưng ở đây bạn sẽ cần phải lưu trữ nó bên trong lệnh để hoàn tác tác vụ)
- nói chung chúng tôi nghĩ rằng hoàn tác/làm lại dưới dạng chồng, một số phần mềm (đồ họa chủ yếu) đề xuất hoàn tác các mục mà không thực sự hoàn tác những gì được thực hiện sau đó, điều này khó khăn hơn nhiều để đạt được, đặc biệt là khi các hành động mới hơn đã được xây dựng trên đầu trang để hoàn tác một ...
Bởi vì có những vấn đề khác nhau, có những chiến lược khác nhau:
- Đối với một lệnh đơn giản, bạn có thể xem xét thực hiện một undo (ví dụ, thêm một nhân vật có thể được hoàn tác bằng cách loại bỏ nó)
- Đối với một Lệnh phức tạp hơn, bạn có thể xem xét thực hiện hoàn tác như khôi phục trạng thái trước đó (đó là nơi
Memento
khởi động)
- Nếu bạn có nhiều Lệnh phức tạp, có thể có nghĩa là rất nhiều
Memento
s tiêu thụ không gian, bạn có thể chúng tôi e một cách tiếp cận trong đó bao gồm trong chỉ học thuộc lòng một Snapshot mỗi 10 hoặc 20 lệnh, và sau đó làm lại các lệnh từ ảnh chụp mới nhất lên đến lệnh hoàn tác
Trong thực tế, có lẽ bạn có thể kết hợp Command
và Memento
tại giải trí , tùy thuộc vào chi tiết cụ thể của hệ thống của bạn và do đó sự phức tạp của một trong hai.
Tôi sẽ chỉ xem xét hoàn tác hành động cuối cùng được thực hiện để bắt đầu (sử dụng một chồng hành động sau đó). Chức năng xóa bỏ bất kỳ hành động nào mà người dùng mong muốn phức tạp hơn nhiều.
Nguồn
2010-04-30 17:04:36
Có vẻ như bạn đã bỏ phiếu trên trang này nhưng tôi thích dòng suy nghĩ của bạn. Đặc biệt bạn là người duy nhất xem xét vấn đề muốn hoàn tác thứ gì đó không nằm ở trên cùng của ngăn xếp, điều này còn xa tầm thường! –
Cảm ơn, và vâng, các phản hồi khác chỉ ra các mẫu nhưng không thực sự thảo luận về chúng. Đó là tất cả tốt và tốt nhưng tôi không phải là một fan hâm mộ lớn của cố gắng để phù hợp với mô hình cho các vấn đề như là một điểm khởi đầu. Thông thường (đối với tôi, sử dụng TDD) nó hoạt động theo cách khác; một mô hình được tiết lộ khi giải pháp đạt được. –