2009-04-17 34 views
5

Tôi đang cố gắng cấu trúc lại một ứng dụng Winform hiện có để sử dụng mẫu MVP Passive View. Giao diện người dùng của ứng dụng, logic nghiệp vụ và mã lưu trữ dữ liệu đã được tự do xen kẽ trong nhiều năm. Có vẻ như nó bắt đầu với các lớp riêng biệt hoặc một người nào đó đã cố gắng tách nó thành các lớp. Trong mọi trường hợp, các ranh giới lớp không được tôn trọng.Tái cấu trúc WinForm ClickNCode thành MVP Passive View

Vì các biểu mẫu trực tiếp thao tác các đối tượng miền và nguồn dữ liệu (và ngược lại), nhiệm vụ đầu tiên của tôi là tạo đối tượng trình bày/bộ điều khiển và ủy nhiệm các trách nhiệm đó.

Ứng dụng này là ứng dụng .NET 1.1 và tôi đang phát triển trong VS.NET 2003 với một trình bổ sung sắp xếp lại khá hạn chế. Tôi đã sử dụng một máy phát điện thử nghiệm cho mã hiện có để tạo ra các thử nghiệm đơn vị tấm nồi hơi sau đó đã đi qua và bàn tay chỉnh sửa từng thử nghiệm. Cấp, điều này gió lên kiểm tra những gì mã không, không nhất thiết những gì nó giả sử để làm. Đối với các lớp học mới, tôi đang làm TDD.

Bất kỳ mẹo, tài nguyên, cạm bẫy nào để tìm ra với nỗ lực tái cấu trúc quy mô này?

Một vài nguồn Tôi đã có lúc xử lý của tôi:

  • Bộ sưu tập sách lập trình; Refactoring, PEAA, welc
  • Internet (rõ ràng)
  • lượng lớn thức uống chứa caffeine

Cập nhật: Như một ví dụ những bước bạn sẽ có được để tắt chức năng này:

private void OneOfManyFormEventHandlers(object sender, System.EventArgs e) 
    { 
     string LocalVariable; 
     decimal AnotherLocal; 
     if (!this._SomeDomainObject.SomeMethod(ClassField, out LocalVariable, out AnotherLocal)) 
     { 
      MessageBox.Show("An error occurred calling method"); 
      return; 
     } 

     this.FormControl.Value = LocalVariable; 
     this.AnotherFormContorl.Value = AnotherLocal; 

     this.AnotherPrivateMethod(); 
    } 

Đây là:

private void OneOfManyFormEventHandlers(object sender, System.EventArgs e) 
    { 
     this.FormPresenter.DoSomething(); 
    } 
+0

Bạn có đề nghị "Làm việc hiệu quả với Legacy Code"? Tôi chưa bao giờ nghe nói về nó trước đây. Chúc may mắn bằng cách này, tôi e rằng tôi không có bất kỳ lời khuyên hữu ích nào để cung cấp cho bạn –

+0

Vâng, đó là một cuốn sách tuyệt vời. Nó cung cấp một số kỹ thuật rất hữu ích cho mã được thử nghiệm mà ban đầu không được thiết kế cho nó. Đối với tôi hữu ích nhất là * Trích xuất Giao diện * –

Trả lời

2

Cách tiếp cận tôi đã thực hiện là quá di chuyển mã ra khỏi trình xử lý sự kiện trước tiên. Về cơ bản tôi đã đặt một lớp bên cạnh biểu mẫu, thực hiện các trình xử lý sự kiện và giữ trạng thái giao diện người dùng bên cạnh các điều khiển.

Thông qua bước này, tôi đã có được sự tách biệt rõ ràng về biểu mẫu và tương tác thực tế với ứng dụng còn lại và có thể giới thiệu các bài kiểm tra ở cấp đó. Một kết quả khác của việc này là tầm nhìn trở nên thụ động khá nhanh chóng.

Tôi sắp xếp lại trình trình bày (bây giờ giữ các trình xử lý sự kiện) trong một bước riêng và giới thiệu các đối tượng miền chỉ sau khi tôi đã di chuyển tất cả việc sử dụng các đối tượng này ra khỏi tất cả các biểu mẫu.

Vì vậy, các bước của tôi sẽ là:

  1. Tháo phụ thuộc UI từ logic
  2. Tạo đối tượng tên miền (nếu không có sẵn đã được)
  3. Refactor các diễn giả sử dụng tên miền đối tượng
  4. giới thiệu dịch vụ theo lựa chọn thiết kế của bạn trong khi bạn đang ở đó

Trong khi tôi đã làm điều này tôi bắt đầu giới thiệu thử nghiệm tại các ranh giới mới được giới thiệu để đảm bảo rằng tôi không vi phạm mã làm việc hoặc tìm lỗi trong mã hiện tại mà tôi đang di chuyển.

0

Nếu bạn có thời gian, tôi khuyên bạn nên trước tiên viết một số thử nghiệm khói bằng cách sử dụng các khung kiểm tra WinForms như White trên ứng dụng hiện có. Bằng cách này bạn sẽ có thể kiểm tra bất kỳ lỗi mới được giới thiệu khi bạn bắt đầu refactoring mã.

+0

@Igor: Trắng không hoạt động tốt cho tôi (ít nhất là đối với các ứng dụng MFC dựa trên C++). –

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