2010-04-30 32 views
6

Tôi có một vài mã để làm một số việc nhưng tôi cần tạo một hàm để hoàn tác tác vụ/bổ sung/thay đổi trước đó. Làm cách nào để thực hiện điều này trong Borland C++?Làm cách nào để tạo "hoàn tác" trong C++?

(các cửa hàng chương trình chuỗi văn bản trong một tập tin văn bản sử dụng "danh sách", nó được lưu trữ và sau đó bị xóa trừ khi tôi sử dụng tiết kiệm năng tôi đã tạo ra)

đúng, vì vậy tôi không biết nếu tôi quên đề cập đến bất cứ điều gì quan trọng để bạn có thể giúp đỡ tôi tốt hơn, nhưng nếu có điều gì đó bạn thắc mắc về các chức năng chỉ cần hỏi.

Tôi có nghĩa là tạo ra một chức năng hoàn tác trong một ứng dụng consol đơn giản bằng cách này.

Trả lời

2

bạn có thể lưu ảnh chụp nhanh của nhà nước. trạng thái là tập hợp dữ liệu mà hành động có thể sửa đổi. khi bạn nhấp vào hoàn tác trạng thái hiện tại được thay thế bằng trước đó. thực sự nó không phải là nhiệm vụ tầm thường, đặc biệt là nếu nhà nước là phức tạp.

4

Cũng thấy mẫu ký tự. Đôi khi trí thông minh phải đi vào một lệnh để hoàn tác một hoạt động là khá liên quan. Vẽ các đối tượng trong một chương trình vẽ chẳng hạn. Nó có thể dễ dàng hơn để lưu trữ một vật lưu niệm và sau đó khôi phục lại từ vật lưu niệm đó để thực hiện hoàn tác.

13

Để triển khai Hoàn tác, bạn cần phải tạo "ngăn xếp hành động" trong ứng dụng của mình. Có hai phương pháp cơ bản, mặc dù:

  1. Biết ban đầu của bạn (lần cuối cùng các tập tin đã được cứu, hoặc từ các tập tin được tạo ra), nhớ mọi thay đổi duy nhất đã được thực hiện để khi một cái gì đó cần phải được hoàn tác bạn chỉ cần vứt bỏ mục "trên cùng" và tạo lại chế độ xem hiện tại từ đường cơ sở cộng với tất cả các thay đổi. Nhấp vào "Làm lại" sau đó chỉ cần đặt mục đó trở lại trên ngăn xếp. Điều này có lợi ích phụ là có thể loại bỏ một cách trivially các mục trong ngăn xếp mà không làm rối tung các tùy chọn hoàn tác/làm lại khác, mặc dù sẽ có sự chăm sóc đặc biệt cần thiết để đảm bảo rằng ứng dụng của trạng thái "cao hơn" là người dùng dự định.

  2. Đối với mỗi hành động, lưu trữ thay đổi đã được thực hiện cho trạng thái trước đó cũng như thay đổi cần thiết để khôi phục trạng thái trước đó nếu bạn muốn hoàn tác. Giờ đây, khi người dùng nhấp vào "Hoàn tác", chỉ cần thực hiện các bước "hoàn tác". Khi nhấp vào "Làm lại", áp dụng lại các thay đổi đã được thực hiện. Trong một số trường hợp, các bước "Hoàn tác" sẽ là "đây là điều trông giống như trước đây", nhưng điều đó có thể gây ra sự tàn phá nếu bạn muốn cho phép người dùng xóa các mục không nằm trên cùng của ngăn xếp và sau đó cần xóa thứ gì đó ở trên nó.

Lựa chọn thích hợp tùy thuộc vào nhiều yếu tố, bao gồm lượng dữ liệu bạn có thể/sẽ mang theo. Tùy chọn # 1 có ý nghĩa dễ dàng hơn nhưng nó có thể trở nên rất chậm để hoàn tác mọi thứ nếu ngăn xếp hành động lớn.

+0

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! –

+0

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. –

16

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 CommandMemento 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.

0

Tôi đã thử nghiệm gần đây về chủ đề đó. Trong trường hợp bạn không cần khả năng tương thích nhị phân, hãy kiểm tra https://github.com/d-led/undoredo-cpp

Các vấn đề liên quan