Làm thế nào để tiếp cận tái cấu trúc một ứng dụng web hiện có?


10

Gần đây tôi đã đọc và suy nghĩ rất nhiều, và tôi đã đi đến kết luận rằng có lẽ tôi nên suy nghĩ lại về chiến lược phát triển web của mình. Tôi đang làm rất nhiều chương trình đang hoạt động, và trong 2 năm tôi đã làm việc trên một ứng dụng web PHP, những gì có thể đã bắt đầu khi một công cụ nhỏ đã trở thành một dự án lớn. Nhưng có rất nhiều mã kế thừa từ tôi và người tiền nhiệm của tôi, đoạn mã có thể có ý nghĩa vào thời điểm đó, nhưng bây giờ tôi đang đặt câu hỏi về tính hữu dụng của mã nói ở dạng thực sự. Hơn nữa, những thứ như thử nghiệm đơn vị và Phát triển dựa trên thử nghiệm không nằm trong phạm vi của tôi cho đến gần đây.

Vì vậy, làm thế nào bạn sẽ tiếp cận tái cấu trúc ứng dụng web? Điều gì sẽ là những thứ tôi nên tìm kiếm và theo thứ tự nào? Những gì về trò chơi trình duyệt so với ứng dụng web chức năng? Sau đó sẽ có sự khác biệt trong cách tiếp cận?


4
Nếu nó không bị hỏng, đừng sửa nó. Dành nhiều thời gian hơn để viết bài kiểm tra, và ít thời gian hơn để thực hiện các thay đổi không cần thiết.
Macneil

Chỉ cần quan tâm. Ngôn ngữ / công nghệ nào bạn đã sử dụng để viết ứng dụng của mình? Đây là loại trang web gì? Xem Welie.com/potypes -> Bối cảnh thiết kế -> Các loại trang web
JW01

@ JW01 Tôi sử dụng PHP cho logic bên trong và AJAX để quản lý xem và xác thực mẫu. Đây sẽ là một biến thể của mẫu Ứng dụng dựa trên Web nhưng chỉ khả dụng trong một môi trường nhất định, vì đây là một công cụ nội bộ.
Eldros

Tôi đã có một hình ảnh hoàn toàn khác về ứng dụng của bạn trong đầu khi tôi trả lời câu hỏi. Bạn có nhiều tự do hơn để thay đổi API so với khi nó ở trong phạm vi công cộng.
JW01

@ JW01 Tôi không muốn quá cụ thể, vì tôi cũng muốn câu hỏi này hữu ích với người khác.
Eldros

Câu trả lời:


6

Khá giống với cách bạn tiếp cận bất kỳ loại mã kế thừa nào. Bạn tìm thấy một mảnh có thể kiểm tra được, bạn viết các bài kiểm tra cho nó và tái cấu trúc.

Nếu bạn không thể tìm thấy một mảnh dễ kiểm tra, bạn sẽ cần phải kiểm tra nó mà không cần khai thác an toàn của bộ kiểm tra, trong trường hợp đó bạn rất cẩn thận thay đổi một số mã gần như có thể kiểm tra để có thể kiểm tra được.

Mã không hiển thị mọi thứ cho trình duyệt - mã "cơ sở hạ tầng", mô hình, công cụ chạm vào cơ sở dữ liệu - có thể là một nơi tốt để bắt đầu.

Chỉnh sửa: Kiểm tra giao diện người dùng: Với cảnh báo rằng tôi có ít kinh nghiệm ở đây, một người bạn của tôi thực hiện điều này: anh ta chạy một số đoạn mã tạo HTML. Sau đó, anh ta hack mã của mình và so sánh mã được tạo mới so với phiên bản cũ (sử dụng diff; anh ta đã không tự động hoàn toàn). Thay đổi trong HTML có nghĩa là tái cấu trúc của bạn bị hỏng.


Bạn muốn đề xuất thử nghiệm phần "xem" của ứng dụng cũ - IE, phần HTML / JavaScript / CSS / etc như thế nào? Tôi đồng ý kiểm thử đơn vị là cách để đi, nhưng việc kiểm tra mã ứng dụng có vẻ khó tự động hóa.
Justin Ethier

khi tạo các thử nghiệm cho giao diện người dùng web - so sánh HTML cũ với HTML mới là một cách dễ dàng để thực hiện. Tôi có xu hướng xác định ngữ nghĩa của một trang web và kiểm tra điều đó. Tức là hỏi "Có dấu ấn web (tiêu đề trang, tiêu đề, từ khóa, liên kết ngoài, biểu mẫu) đã thay đổi?" không phải là "HTML đã thay đổi?".
JW01

Bạn có thể kiểm tra các ứng dụng web bằng 'trình duyệt không đầu' - về cơ bản là một thư viện dành cho đơn vị kiểm tra xem trình duyệt dành cho anh chàng QA là gì. Trong thế giới java, có HTMLUnit (java thuần túy, khép kín) và WebDriver (điều khiển từ xa một trình duyệt thực như FireFox). Dự án của tôi có một bộ gồm hàng trăm bài kiểm tra được viết như thế này.
Tom Anderson

@ JW01 Bạn hoàn toàn đúng - nó rất dễ vỡ. Thật tuyệt vời khi thử nghiệm tái cấu trúc theo cách đã từng có một lần: bạn có thể kiểm tra xem việc tái cấu trúc không thay đổi đầu ra, nhưng mỗi khi bạn thay đổi HTML được tạo, bạn phải lưu HTML "dự kiến ​​mới".
Frank Shearar

10

Có một cuốn sách tuyệt vời về điều này được gọi là "Làm việc hiệu quả với Bộ luật kế thừa" của Michael Feathers. Hãy đối mặt với nó, tất cả chúng ta đều có mã kế thừa.

Điều chính là lái thử mã mới mà bạn đang tạo. Khi bạn phải chạm vào các đoạn mã khác, bạn cũng sẽ tìm thấy cơ hội để kiểm tra chúng. Đó là một quá trình chậm chạp dài, nhưng nếu bạn thực hiện nó một cách có hệ thống, bạn thực sự có thể cải thiện tổng thể sản phẩm theo thời gian.


3
"Hãy đối mặt với nó, tất cả những gì chúng ta đang làm là viết phần mềm kế thừa vào ngày mai." - Martin Fowler
Frank Shearar

3
  • Có - Ứng dụng web khác với Trang web

Tôi sẽ đối xử với họ một cách riêng biệt. Nếu bạn có một phần của trang web của mình chỉ đơn giản là một bộ tài liệu (trông giống với người dùng ẩn danh và người dùng đã đăng nhập) - thì phương pháp tốt nhất để cấu trúc nó rất khác với ứng dụng web phục vụ các trang khác nhau động cho mỗi người dùng. Chia hai phần của trang web thành hai ứng dụng / thành phần và giải quyết từng phần khác nhau.

  • Bắt đầu sử dụng Kiểm soát phiên bản

Khi mã của bạn nằm dưới sự kiểm soát phiên bản, bạn có thể tự tin và loại bỏ tất cả các mã không cần thiết mà trước đây bạn đã giữ 'chỉ trong trường hợp', v.v. Tôi không biết làm thế nào tôi sống sót mà không kiểm soát phiên bản.

  • Giảm thiểu vô số

Nếu bốn url khác nhau đều trỏ đến cùng một tài nguyên, thì vấn đề sẽ lớn hơn nhiều. Bạn kết thúc đối phó với một lượng vô hạn của các url. Ngay khi bạn có thể, hãy đảm bảo rằng bạn có chính sách Bình thường hóa URL. Khi đã xong, bạn có thể bắt đầu đính kèm ý nghĩa ngữ nghĩa vào URL và có thể thực hiện tra cứu ngược từ tài nguyên sang url. Điều này cho phép bạn tách 'dấu ấn web' khỏi 'tài nguyên' của trang web.

Bạn phải tự hỏi, "được cung cấp một url, dạng chuẩn hóa của nó là gì?". Một khi bạn đã có pin ghim xuống. Sau đó, 50,0000+ url trên trang web của bạn có thể được giảm xuống, 2.000. đó là dễ dàng hơn nhiều để hiểu và quản lý trong tâm trí của bạn.

xem: http://www.sugarrae.com/be-a-n normalizer-a-c14n-exterminator/

  • Bắt đầu bằng cách mô hình hóa 'cái gì là', không phải 'cái bạn muốn'

Nếu bạn đang dọn dẹp một trang web cũ, không được thiết kế với tâm trí tốt nhất ngay từ đầu, thì thật là hấp dẫn khi chuyển từ 'một mớ hỗn độn' sang 'thiết kế lý tưởng'. Tôi tin rằng bạn cần thực hiện trong ít nhất hai bước: 'mess' -> 'mã kế thừa được mô hình hóa tốt' -> 'mã mới lý tưởng với các tính năng được thêm vào'. Dừng thêm tính năng. Tập trung vào việc sửa chữa mớ hỗn độn hoặc gói gọn nó đằng sau một lớp chống tham nhũng. Chỉ sau đó, bạn có thể bắt đầu thay đổi thiết kế thành một cái gì đó tốt hơn.

Xem: http://www.joelonsoftware.com/articles/fog0000000069.html

Xem: http://www.laputan.org/mud/

  • Đặt nó dưới sự kiểm tra là một ý tưởng tốt.

Tạo một bộ kiểm tra / khung và bắt đầu thêm các bài kiểm tra. Nhưng, nó khá khó để kiểm tra một số mã kế thừa. Vì vậy, đừng quá bận tâm về nó. Miễn là bạn có khung ở đó, bạn có thể thêm các bài kiểm tra từng chút một.

Xem: http://www.simpletest.org/en/web_tester_documentation.html

  • Có can đảm trong niềm tin của bạn

Hầu hết các tài liệu về thực tiễn tốt nhất về phát triển phần mềm là trung tâm máy tính để bàn / Enterprise App Centric. Trong khi trang web của bạn đang ở trong một mớ hỗn độn, bạn đọc những cuốn sách này và bạn có thể sợ hãi sự khôn ngoan toát ra từ chúng. Nhưng, đừng quên rằng hầu hết các hoạt động tốt nhất này đã được tích lũy trong thời gian trước khi web / SEO trở nên quan trọng. Bạn biết rất nhiều về web hiện đại, nhiều hơn được đề cập trong các cuốn sách kinh điển như POEA, Gof, v.v. Có rất nhiều thứ để lấy từ chúng, nhưng không loại bỏ hoàn toàn kinh nghiệm và kiến ​​thức của riêng bạn.


Tôi có thể tiếp tục. Nhưng đó là một số thứ mà tôi đã chọn khi tái cấu trúc một trang web cũ thành một trang mới sáng bóng.


Liên kết tham khảo tốt!
Nilesh

2

Trước khi làm bất cứ điều gì, tốt nhất là để dự án của bạn kiểm soát nguồn. Bằng cách này, bạn có thể khôi phục các thay đổi hoặc thực hiện các thay đổi lớn trên một nhánh riêng biệt, cũng như các cột mốc thẻ.

Tiếp theo, viết bài kiểm tra cho bất kỳ mã nào bạn dự định thay đổi. Bạn không cần phải đi hết tất cả cùng một lúc, viết bài kiểm tra cho tất cả mọi thứ. Chỉ cần những gì bạn có kế hoạch để được làm việc ngay lập tức. Lý thuyết cho rằng đủ thời gian, hầu hết các cơ sở mã sẽ được kiểm tra. Lưu ý rằng một số phép tái cấu trúc là "an toàn" để thực hiện mà không cần kiểm tra - những điều này được ghi lại trong sách Bộ luật kế thừa được đề cập trước đó và không nghi ngờ gì ở nơi khác.

Với các thử nghiệm tại chỗ cho một phần của mã, thay đổi mã. Làm bất cứ điều gì bạn cần, miễn là các bài kiểm tra vẫn vượt qua.

Ngay cả với mã kế thừa, bạn có thể thực hiện TDD nếu thực hiện bổ sung hoặc thay đổi. Trước tiên, chỉ cần viết bài kiểm tra cho các thay đổi dự đoán của bạn, xem chúng không thành công và sau đó thực hiện các thay đổi.

Một số công cụ có thể hữu ích ở đây. NDepend có thể chỉ ra mã được ghép nối cao và các mùi khác. NCover theo dõi mức độ bao phủ mã của bạn. FxCop về cơ bản là một trình kiểm tra tính chính xác của mã, vượt ra ngoài những gì trình biên dịch làm. Đây là tất cả các công cụ hữu ích để có ích cho một dự án có kích thước thật, đặc biệt là sự đa dạng về di sản.

Cuối cùng, đó là một quá trình gồm nhiều bước. Đừng cố gắng làm tất cả cùng một lúc, chỉ cần thực hiện một chút tại một thời điểm.


-2

Nếu nó đủ xấu để làm tôi bực mình, thì nó đủ xấu để tôi xóa toàn bộ và viết một thay thế.

Bạn sẽ thấy rằng thường xuyên hơn không, phải mất cùng một thời gian để làm điều này, cũng như ngồi đó và nhón chân xung quanh một mớ hỗn độn không có tổ chức và không có giấy tờ và vuốt ve nhẹ nhàng.


2
Tôi không đồng ý (mặc dù tôi không cho bạn -1). joelonsoftware.com/articles/fog0000000069.html
JW01

1
Đó thực sự là quá nhiều quyết định tình huống để bảo vệ chính xác bản thân mình. Tôi có thể không làm điều này khi tôi đang làm việc trên một thư viện Objective-C đồ sộ, tuy nhiên, tôi không có ý định gì về việc viết một thư viện javascript hoàn toàn mới.
Lén lút

Ý tưởng rất tệ! Tôi ước rằng tôi đã đọc bài viết của Joel Spolsky rằng @ JW01 đã liên kết với 2 năm trước khi tôi quyết định viết lại một ứng dụng PHP hiện có bằng Angular & Bootstrap. Angular & Bootstrap là những công nghệ tuyệt vời nhưng tôi vẫn cố gắng chuyển đổi ứng dụng cũ này 2 năm sau. Tôi chỉ nên sửa đổi ứng dụng hiện có và không bị loại bỏ / thay thế.
Zack Macomber

Tôi đồng ý đặc biệt khi bao thanh toán trong bình luận của bạn. "Kịch bản" là điều quan trọng quyết định quyết định. Bạn có nên rút ra API khổng lồ phục vụ toàn bộ doanh nghiệp của mình không? Ai biết được, có rất nhiều điều để xem xét. Bạn muốn kiểm tra trước để kiểm tra sau đó. Bài viết được liên kết đến quá tuyến tính, giống như có một kích thước phù hợp với tất cả, nhưng còn khi một cái gì đó có lỗi, hoặc mã thực sự cũ thì sao? Bài viết có thực sự gợi ý chúng ta không nên chuyển từ di sản với mã mới dễ đọc và bảo trì hơn không? Không có màu đen và trắng trong thế giới dev, chỉ có kịch bản và quyết định
James
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.