2008-10-16 27 views
5

Tôi đã thừa kế ứng dụng web Java khổng lồ kế thừa này bằng Struts 1.2.4. Tôi có một câu hỏi cụ thể liên quan đến Hành động. Hầu hết các trang đều có chính xác một Action và các phương thức processExecute() là các quái vật gớm ghiếc (rất dài và tấn lồng nhau nếu các câu lệnh dựa trên các tham số yêu cầu).Làm thế nào để đối phó với hành động Struts quái dị?

Cho rằng Tác vụ là triển khai mẫu lệnh, tôi đang nghĩ chia các Hành động này thành một Hành động cho mỗi cử chỉ của người dùng. Đây sẽ là một quá trình tái cấu trúc lớn mặc dù, và tôi tự hỏi:

  1. Đây có phải là hướng đi đúng không?
  2. Có bước trung gian nào tôi có thể thực hiện hay không, một mẫu có liên quan đến sự lộn xộn bên trong các hành động nguyên khối? Có lẽ một mẫu lệnh khác bên trong Action?

Trả lời

9

cách tôi đối phó với điều này sẽ là:

  • không làm 'tất cả mọi thứ cùng một lúc'
  • bất cứ khi nào bạn thay đổi bất cứ điều gì, hãy để nó tốt hơn bạn tìm thấy nó
    • điều kiện thay thế với việc triển khai Hành động riêng biệt là một bước.
    • Hơn thế nữa: Hãy hiện thực của bạn tách biệt với lớp Action để bạn có thể sử dụng nó khi bạn thay đổi các khuôn khổ
    • Giữ bạn thực hiện lệnh mới hoàn toàn mà không tham chiếu đến Struts, sử dụng Hoạt động mới của bạn như Wrapper xung quanh những hiện thực.
    • Bạn có thể cần phải cung cấp giao diện cho ActionForms Struts của bạn để truyền chúng xung quanh mà không cần sao chép tất cả dữ liệu. Mặt khác - bạn có thể muốn vượt qua xung quanh các đối tượng khác hơn ActionForms mà thường là một loạt các Strings (xem câu hỏi khác của bạn về Struts 1.2 ActionForms)
  • bắt đầu di cư phần để mới hơn & công nghệ tốt hơn. Struts 1.2 thật tuyệt vời khi nó xuất hiện, nhưng chắc chắn không phải những gì bạn muốn hỗ trợ trong cõi đời đời. Có một số thế hệ của các khuôn khổ tốt hơn bây giờ.

Có chắc chắn hơn - Xin lỗi, tôi đang sắp hết thời gian ở đây ...

1

vấn đề khó khăn nhưng điển hình về phát triển ứng dụng web sớm. Trước tiên, bạn cần bắt đầu nghĩ về logic nào cấu thành hành vi kinh doanh, logic nào cấu thành "dòng chảy" (nghĩa là người dùng nhìn thấy gì) và logic nào nhận được nội dung cho những gì anh ta thấy.

Bạn không phải đi xuống tuyến đường của nhà máy và giao diện và tất cả những thứ đó; triển khai hồi tố kém hữu ích hơn ... nhưng hợp nhất logic nghiệp vụ và logic truy xuất dữ liệu vào các đại biểu của một số loại ... và để lại các hành động struts để xác định luồng trang dựa trên thành công/thất bại của logic đó.

Từ đó bạn chỉ cần mất một vài tuần và xay nó ra

1

Một phương pháp dài không bao giờ là tốt, trừ khi nó xảy ra là một câu lệnh switch nơi các trường hợp là rất ngắn (phân tích dấu hiệu hay cái gì đó như cái đó).

Bạn ít nhất có thể cấu trúc lại phương pháp dài thành các phương thức nhỏ hơn với tên mô tả.

Nếu có thể, bạn có thể bắt đầu phương pháp của mình để nhận ra nó phải làm gì bằng cách kiểm tra biểu mẫu và sau đó nếu/theo cách của bạn đến các tùy chọn khác nhau. Không có ifed lồng nhau mặc dù, những người có xu hướng làm cho mã không đọc được. Chỉ cần

enum Operation { 
    ADD, DELETE; 
} 

... 

Operation operation = determineOperation(form); 
if (operation == Operation.DELETE) { 
    doDelete(form); 
} else if (operation == Operation.ADD) { 
    doAdd(form); 
} 

Nếu bạn có thể đi xa đến mức bạn có logic tốt đẹp và sạch sẽ và bạn có thể làm bất cứ việc gì bạn muốn.

Phần khó khăn là làm cho logic của bạn rõ ràng và bạn có thể làm điều đó theo các bước. Đừng chọn một mô hình cho đến khi bạn hiểu chính xác vấn đề của bạn là gì.

1

Nếu bạn dự định tái cấu trúc mã, bạn nên đảm bảo viết kiểm tra mã hiện có trước để đảm bảo bạn không thay đổi chức năng của nó khi bạn bắt đầu tái cấu trúc.

+0

Tôi sẽ nói pshah. Tác giả nói rằng các phương pháp này dài một cách kỳ quái và có độ phức tạp chu kỳ cao. Đó là loại mã thường là một cơn ác mộng để kiểm tra đơn vị. – JonMR

2

Tôi đã xử lý loại điều này trước đây. Bước đầu tiên tốt là chèn một lớp cơ sở khác vào chuỗi kế thừa giữa Hành động và một trong các lớp hành động quái dị ban đầu (cho phép gọi nó là ClassA). Đặc biệt là nếu bạn không có thời gian để làm mọi thứ cùng một lúc. Sau đó, bạn có thể bắt đầu kéo ra các phần chức năng thành các lớp hành động song song nhỏ hơn (ClassB, ClassC). Bất cứ điều gì phổ biến giữa ClassA ban đầu và các lớp được cấu trúc lại mới có thể được kéo vào lớp cơ sở mới. Vì vậy, hệ thống phân cấp bây giờ trông giống như sau:

Original Hierarchy:  New Hierarchy: 

    Action     Action 
     |      | 
     |      BaseA 
    (old)ClassA     | 
         +--------+----------+ 
         |  |   | 
        ClassB (new)ClassA ClassC 
+0

Đọc câu trả lời của tôi ở trên để biết suy nghĩ về việc có phân cấp Hành động. Tôi nghĩ rằng ở rất nhiều nơi làm điều này họ có thể có quá nhiều logic kinh doanh trong lớp web của họ. – bpapa

5

Hành động khó khăn, tôi không nên có nhiều mã trong số đó. Họ chỉ cần tương tác trực tiếp với yêu cầu và phản hồi - lấy một số dữ liệu từ biểu mẫu hoặc tham số yêu cầu, đưa thông tin đó ra cho Lớp dịch vụ và sau đó đặt một số nội dung vào đối tượng Response hoặc có thể lưu một số dữ liệu trong phiên của người dùng.

Tôi khuyên bạn nên tránh xa việc làm thừa kế với các lớp hành động. Nghe có vẻ như một ý tưởng tốt lúc đầu nhưng tôi nghĩ sớm hay muộn bạn nhận ra rằng bạn là những thứ đáng sợ hơn là bạn thực sự làm cho cơ sở mã mạnh mẽ. Struts có đủ các hành động cơ bản như là, nếu bạn đang tạo ra những cái mới, bạn có thể đã có mã trong lớp web mà không nên có.

Đó chỉ là trải nghiệm cá nhân của tôi.

2
  1. Chuyển một phương pháp tại một thời điểm
  2. Ghi lại một số trường hợp kiểm tra bạn có thể phát lại sau. Example here (đảm bảo nhấn nhiều đường dẫn qua mã như bạn có thể, tức là tất cả cử chỉ của người dùng trên trang gọi hành động này)
  3. refactor phương pháp để giảm độ phức tạp của nó bằng cách tạo các phương thức nhỏ hơn.
  4. kiểm tra lại chạy như bạn làm điều này

Tại thời điểm này, bạn đã refactored phiên bản của phương pháp gây phiền nhiễu khổng lồ lớn. Bây giờ bạn thực sự có thể bắt đầu tạo các hành động cụ thể.

Bạn có thể sử dụng lớp mới được tái cấu trúc làm lớp cơ sở và triển khai từng hành động cụ thể dưới dạng lớp con bằng cách sử dụng các phương pháp nhỏ được cấu trúc lại.

Khi bạn đã thực hiện việc này, bạn nên có một hình ảnh tốt về logic được chia sẻ giữa các lớp và có thể kéo lên hoặc đẩy xuống các phương thức đó nếu cần.

Nó không vui, nhưng nếu bạn sẽ làm việc trên cơ sở mã nguồn trong một thời gian, nó sẽ giúp bạn tiết kiệm thời gian và đau đầu.

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