2008-10-14 37 views
7

Tôi đang làm việc trên một hệ thống là người dùng có thể chỉnh sửa đối tượng hiện có ("Lọc" đối tượng tên miền chính xác) thông qua GUI. Như một gợi ý UI, chúng tôi chỉ muốn kích hoạt nút lưu nếu người dùng thực sự sửa đổi một cái gì đó cho đối tượng. Tôi đã tự hỏi nếu có ai có bất kỳ kinh nghiệm với vấn đề này và cách tốt nhất là để tiếp cận này là gì.chỉnh sửa đối tượng và isDirty() cờ

Tôi đã suy nghĩ về việc thêm cờ isDirty() vào đối tượng miền. Khi người dùng bắt đầu chỉnh sửa một Bộ lọc, sau đó tôi sẽ tạo một bản sao, chuyển nó vào GUI và cho phép người dùng thực hiện các sửa đổi đối với bản sao. Một ràng buộc trên cờ isDirty() sau đó sẽ kích hoạt/vô hiệu hóa nút lưu. Khi lưu, sự khác biệt sau đó sẽ được hợp nhất vào đối tượng ban đầu và được duy trì.

Bổ sung, tôi đã nghĩ điều gì sẽ xảy ra nếu người dùng hoàn tác các thay đổi mà anh đã thực hiện cho đối tượng. Cờ isDirty() sau đó sẽ trả về false. Vì vậy, tôi đoán cách duy nhất để đạt được điều này là giữ giá trị ban đầu của mỗi thuộc tính bên trong đối tượng miền.

Bất kỳ ý tưởng nào?

Trả lời

3

Chính xác!

Ngoài ra, bạn có thể hiển thị hai phương pháp: Bắt đầu chỉnh sửa - Trong phương pháp này, bạn đánh dấu Cờ IsDirty là True. Có nghĩa là bạn đang sửa đổi. Gọi phương thức này khi bạn chuẩn bị sửa đổi

Hủy chỉnh sửa - Trong phương pháp này, đặt lại cờ IsDirty thành False. Có nghĩa là bạn đã loại bỏ quy trình chỉnh sửa và hoàn nguyên về trạng thái ban đầu. Gọi phương thức này khi hủy bất kỳ sửa đổi nào được thực hiện.

Và sau khi bất kỳ sửa đổi nào được duy trì, bạn cũng đặt lại cờ IsDirty thành False.

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn tất cả các bạn trả lời. Tôi đã chấp nhận câu trả lời này vì nó là câu trả lời đầu tiên và có nhiều upvotes nhất. –

+1

Điều này nghe có vẻ khủng khiếp như CSLA. Nếu bạn đang sử dụng .NET, tôi khuyên bạn nên kiểm tra. http://www.lhotka.net –

1

Nếu bạn có một tập hợp các đối tượng đang được chỉnh sửa thì có thể bạn sẽ cần một cái gì đó nhiều hơn một cờ boolean cho isDirty(). Vấn đề này không giống với tính toán tham chiếu, tức là tăng số lượng bẩn trên chỉnh sửa và giảm về hoàn tác. Nếu bạn đang hỗ trợ hoàn tác, tôi nghi ngờ bạn sẽ kết thúc với một số logic khá lông. Tôi sẽ giữ nó ra khỏi các đối tượng miền của bạn.

1

Có, tính năng này hoạt động tốt. Thay vì hoàn tác, tôi sử dụng phương pháp IsDirty để biểu thị rằng một cái gì đó MIGHT đã thay đổi bản ghi và sau đó nó kích hoạt "logic thay đổi bản ghi" của tôi. Tôi đã phát triển khuôn khổ của riêng mình, trong đó mọi trường bảng thực sự là một thuộc tính của một đối tượng. Mỗi lần một trường được ghi vào các đối tượng "isDirty" flag được thiết lập. Trong phương thức "SaveObject" của đối tượng (thực sự là một lớp helper nhưng có thể dễ dàng ở trong đối tượng, nhưng tôi muốn khả năng lưu các đối tượng theo các cách khác nhau, như xml, database, ect.), Tôi kiểm tra IsDirty và nếu sai của nó thì tôi bỏ qua lưu. Điều này đơn giản hóa logic như mỗi lần tôi có khả năng thay đổi đối tượng, tôi gọi SaveObject và để cho khung công tác xử lý nó.

2

Nếu bạn đang sử dụng .NET framework, bạn có thể muốn xem xét khuôn khổ csvn .NET bởi Rockford Lhotka: http://www.lhotka.net/cslanet/Default.aspx

csvn là một khuôn khổ trưởng thành trong đó bao gồm quản lý nhà nước đối tượng (IsDirty), lùi lại chức năng, ràng buộc dữ liệu và nhiều hơn nữa, cộng với nó là miễn phí và mã nguồn mở.

1

Tùy thuộc vào miền của bạn, bạn có thể sử dụng bình đẳng để kiểm tra sự khác biệt. Giữ đối tượng gốc và tạo một bản sao của đối tượng để chỉnh sửa. Bất kỳ lúc nào chỉnh sửa có thể được thực hiện, hãy sửa đổi giao diện người dùng một cách thích hợp.

Lợi ích của đề nghị này là nó không dính vào chức năng cụ thể GUI (các isDirty() cờ) trên các đối tượng tên miền của bạn, nhưng YMMV

1

Nếu bạn đang hỗ trợ hoạt động lùi lại ở một mức độ chi tiết lớn hơn 'hoàn tác mọi thứ kể từ lần lưu cuối cùng' sau đó tôi sẽ đề xuất một ngăn xếp hoàn tác. Khi một cái gì đó được chỉnh sửa, nó (hoặc nó undo hoạt động functor hoặc đại biểu) được thêm vào ngăn xếp. Khi bạn hoàn tác, bạn chỉ cần bật ngăn xếp và hoàn tác thao tác xuất hiện. Cờ isDirty() của bạn sau đó chỉ là một kiểm tra nếu ngăn xếp hoàn tác chứa các mục, thay vì lưu trữ thêm và logic để cập nhật.

+0

Cảm ơn bạn đã đề xuất. Tôi tự hỏi nơi mà các undo stack sẽ sống. Nó là một đối tượng riêng biệt trong một UndoManager hoặc một số loại, nơi ngăn xếp được liên kết với các đối tượng tên miền bạn đang chỉnh sửa? –

2

Có một vài giao diện mà bạn có thể triển khai trợ giúp đó với theo dõi thay đổi và hoàn tác: INotifyPropertyChanged và IEditableObject. Cả hai giao diện này cho phép đối tượng để chơi tốt đẹp với databinding.

public class Person : INotifyPropertyChanged, IEditableObject 
{ 
    private bool isDirty; 

    public bool IsDirty 
    { 
     get { return isDirty; } 
    } 

    private string firstname = string.Empty; 

    public string Firstname 
    { 
     get { return firstname; } 
     set 
     { 
      if (firstname == value) return; 
      firstname = value; 
      NotifyPropertyChanged("Firstname"); 
     } 
    } 

    private string lastname = string.Empty; 

    public string Lastname 
    { 
     get { return lastname; } 
     set 
     { 
      if (lastname == value) return; 
      lastname = value; 
      NotifyPropertyChanged("Lastname"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     isDirty = true; 

     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private bool inTrans; 
    private Person copy; 

    public void BeginEdit() 
    { 
     if (!inTrans) 
     { 
      if (copy == null) 
       copy = new Person(); 

      copy.isDirty = isDirty; 
      copy.Firstname = Firstname; 
      copy.Lastname = Lastname; 


      inTrans = true; 
      isDirty = false; 
     } 
    } 

    public void CancelEdit() 
    { 
     if (inTrans) 
     { 
      isDirty = copy.isDirty; 
      Firstname = copy.Firstname; 
      Lastname = copy.Lastname; 

      inTrans = false; 
     } 
    } 

    public void EndEdit() 
    { 
     if (inTrans) 
     { 
      copy = null; 
      inTrans = false; 
     } 
    } 
} 
Các vấn đề liên quan