2010-10-19 15 views
9

Hi Tôi sắp thêm chức năng mới vào ứng dụng mà tôi hiện đang viết. Tôi cần phải viết một phần mở rộng hoàn tác/làm lại. Tuy nhiên, 90% ứng dụng của chúng tôi đã sẵn sàng và tôi không biết cách tốt nhất để triển khai chức năng này là gì mà không có mã có ảnh hưởng (quá nhiều) đã được tạo.cách triển khai hoạt động hoàn tác/làm lại mà không có thay đổi lớn trong chương trình

+0

Chúng tôi sẽ có để có thể nhìn thấy một số mã hoặc bạn sẽ phải mô tả những gì chương trình của bạn là để chúng tôi giúp đỡ. –

+2

Xem xét bạn thậm chí không cho chúng tôi biết loại ứng dụng đó là gì (web, bạc, máy tính để bàn, v.v.) hoặc thể loại nào (trò chơi, CRUD, mạng xã hội, v.v.) thực sự không có gì để chúng tôi tiếp tục . – tster

+0

Đây là một ứng dụng WPF cho phép người dùng vẽ sơ đồ. Người dùng có thể thêm các loại khối khác nhau, kết nối chúng di chuyển và thay đổi kích thước. Ông cũng có thể đảm bảo một số tài sản để chặn - tên, ngày, vv – pieere

Trả lời

0

Một số câu hỏi: Hoàn tác làm gì? Liệu nó có hoàn tác mọi thay đổi hay chỉ những thay đổi cuối cùng không?

Trong mọi trường hợp, trước tiên bạn lưu trữ trạng thái của trường nhập (trạng thái ban đầu hoặc vị trí mong muốn cuối cùng), sau đó nút hoàn tác sẽ lấy trạng thái đó và áp dụng cho trường.

Làm lại sẽ là cùng một khái niệm, nhưng nó sẽ lưu trữ trạng thái trước khi hoàn tác.

+1

Hoàn tác opeartion sẽ có thể hoàn tác tất cả các hoạt động từng bước. – pieere

8

Không có nhiều chi tiết ở đây. Tuy nhiên, chức năng Undo/Redo thường được xử lý thông qua một số biến thể của Command Pattern. Tùy thuộc vào kiến ​​trúc của bạn, điều này có thể là một cách đơn giản làm lại chức năng cơ bản của bạn thành "lệnh", hoặc sửa chữa lớn.

+1

Đây là cách bạn làm điều đó. Một khi tất cả mọi thứ chương trình của bạn làm là funneled thông qua các trường hợp của "lệnh" thì bạn 80% ở đó. – Detmar

+3

Nếu kiến ​​trúc sư/nhà phát triển ban đầu không có điều này trong tâm trí của họ khi họ lần đầu tiên bắt đầu thiết kế hệ thống, tôi nghiêng về phía đây là một đại tu lớn! – tster

+0

@tster: Nó thường là một việc làm lại khá lớn - mặc dù nó phụ thuộc vào việc ứng dụng được cấu trúc tốt như thế nào để bắt đầu. –

0

Bạn sẽ cần một ngăn xếp undo/redo, và những thay đổi lớn để làm cho mọi thứ nhận thức ngăn xếp này .. Tôi xin lỗi, nhưng kỳ diệu không tồn tại:/

0

Có một free library được viết bởi Rockford Lhotka cho Đối tượng kinh doanh bao gồm chức năng hoàn tác/hoàn tác được tạo sẵn. Tôi nghĩ rằng anh ấy thậm chí còn thực hiện nó thông qua một giao diện, vì vậy nó nên được "xâm lấn tối thiểu".

7

Như Reed Copsey nói mô hình phổ biến nhất để thực hiện làm/redo là Command Pattern. Ý tưởng cơ bản là thực hiện hành động như lệnh implemets một số giao diện như thế này:

public interface ICommand { public void Execute(); public void Undo(); } 

Sau đó, Bạn có một lớp (Control) mà thực hiện tất cả các lệnh như một toàn thể, lớp này phải được sáng tác bởi một nhóm các lệnh , khi bạn thực hiện các lệnh, mỗi lệnh được đẩy bên trong một ngăn xếp (có nghĩa là phương pháp push()), trong trường hợp bạn muốn hoàn tác các hành động thì bạn lấy mọi phần tử từ ngăn xếp (bằng phương tiện pop()) thực thi phương thức Undo() của nó .

public class Control { 
    private ArrayList<ICommand> commands = new ArrayList<ICommand>(); 
    private Stack<ICommand> stack = new Stack<ICommand>(); 

    public Control() {  
     commands.add(new Command1()); 
     commands.add(new Command2());  
     commands.add(new Command3());  
    } 

    public void Execute() { 
     for(int index=0; index<=command.size(); index++) { command.Execute(); stack.push(command);} 
    } 
    public void Undo() 
    { 
     while (!stack.empty()) { 
      ICommand command = (ICommand)stack.pop(); 
      if (command != null) { command.Undo(); }   
     }  
    } 
} 

Note: đây là một mã rất đơn giản, chỉ vì cố gắng làm rõ ý tưởng đằng sau các mẫu lệnh.

link text