2011-01-21 26 views
33

Tôi cần một số lời khuyên về cách làm việc với mã cũ.Lời khuyên về cách làm việc với mã di sản

Cách đây không lâu, tôi được giao nhiệm vụ thêm một vài báo cáo vào ứng dụng báo cáo. được viết trong Struts 1, vào năm 2005. Không có vấn đề gì lớn, nhưng đoạn mã khá lộn xộn. Không sử dụng các hình thức hành động, và về cơ bản mã là một hành động rất lớn, và rất nhiều câu lệnh if-else bên trong. Ngoài ra, không ai ở đây có kiến ​​thức về chức năng này. Chúng tôi chỉ tình cờ có nó trong hợp đồng của chúng tôi.

Tôi rất không hài lòng về điều này và không chắc chắn cách tiếp tục. Ứng dụng này là vô hình: Rất ít người (nhưng tất cả đều rất quan trọng) sử dụng nó, vì vậy họ không quan tâm liệu mắt tôi chảy máu khi đọc mã, tiêu chuẩn, v.v.

Tuy nhiên, tôi cảm thấy rằng nợ kỹ thuật là đã thanh toán. Tôi nên tiếp tục như thế nào? Tiếp tục xuống đường nếu không, hoặc cố gắng thực hiện yêu cầu này đúng cách, bỏ qua phần còn lại của dự án? Bắt đầu từ một nhà tái cấu trúc khổng lồ, có nguy cơ hạn chót của tôi?

+9

http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 –

+0

@ Dave Vâng, công ty của tôi đã mua nó, nhưng một trong những những tên tuổi lớn có nó. Câu chuyện buồn :( – Tom

+0

để mua bản sao của riêng bạn –

Trả lời

44

Mã cũ là vấn đề lớn và tôi chắc chắn mọi người sẽ không đồng ý!

Tôi có thể nói rằng việc bắt đầu một yếu tố lớn có thể là một sai lầm.

Một yếu tố lại lớn có nghĩa là thực hiện rất nhiều công việc để làm cho nó hoạt động chính xác theo cách hiện tại. Nếu bạn chọn tự mình thực hiện việc này, sẽ không có nhiều khả năng hiển thị về những gì bạn đang làm. Nếu nó hoạt động, không ai sẽ biết giờ làm việc bạn đặt nó. Nếu nó không hoạt động, và bạn kết thúc với mã gọn gàng, nhưng thêm một số lỗi (và ai đã từng viết mã mà không thêm một số lỗi) thì bạn sẽ nhận được câu hỏi 'tại sao thay đổi này'.

Tôi hiện đã gần hoàn thành một dự án làm việc trên cơ sở mã 10 năm tuổi. Chúng tôi đã thực hiện khá một vài lần tái bao thanh toán trên đường đi. Nhưng đối với mỗi yếu tố lại chúng tôi đã thực hiện, chúng tôi có thể biện minh cho 'thay đổi cụ thể này sẽ làm cho công việc thực tế chúng tôi đang làm bây giờ dễ dàng hơn'. Thay vì 'điều này bây giờ là sạch hơn cho công việc trong tương lai'. Chúng tôi đã thấy rằng khi chúng tôi làm việc trên mã, khắc phục các vấn đề mà chúng tôi thực sự gặp phải cùng một lúc, chúng tôi đã làm sạch rất nhiều, không phá vỡ nó (nhiều).

Và tôi sẽ nói trước khi bạn có thể tái yếu tố nhiều, bạn sẽ cần các bài kiểm tra tự động, vì vậy bạn có thể khá vui vì bạn đã đặt nó lại với nhau ngay!

Hầu hết việc thanh toán lại được thực hiện để 'bảo trì và phát triển trong tương lai dễ dàng hơn'. Dự án của bạn có vẻ như không có nhiều phát triển trong tương lai sắp tới. Điều đó hạn chế lợi thế mà một yếu tố lại sẽ cung cấp cho công ty.

+0

Bạn có một điểm tốt, dự án này được đông lạnh hầu hết thời gian. – Tom

+0

"Và tôi sẽ nói trước khi bạn có thể tái yếu tố nhiều, bạn sẽ cần kiểm tra tự động, vì vậy bạn có thể khá hạnh phúc vì bạn đã đặt nó trở lại với nhau ngay!" Nếu codebase của bạn yêu cầu những thay đổi quan trọng để hỗ trợ kiểm tra đơn vị thì sao? – NeverEndingQueue

+0

Ý kiến ​​của tôi? Bạn cần phải chứng minh rằng yếu tố lại không phá vỡ bất cứ điều gì. Bạn sẽ làm nó thế nào? Các bài kiểm tra thủ công có thể tốt hơn các bài kiểm tra tự động..Nếu quá trình tự động mất quá nhiều thời gian. Tôi đã tìm thấy các bài kiểm tra tự động quá tốn kém khi làm việc với VMware tích hợp – Jon

12

Quy tắc số 1: Nếu nó không bị hỏng, đừng sửa lỗi.

Quy tắc 2: Khi nghi ngờ, hãy đọc lại quy tắC# 1.

Thật không may, mã cũ có thể rất hiếm khi được mô tả là "nó không bị hỏng". Do đó, chúng ta phải chỉnh sửa mã hiện có để sửa lỗi mới tìm thấy, chỉnh sửa mã hiện có để sửa đổi hành vi đã được chấp nhận trước đó hoặc tinh chỉnh mã hiện có để thêm chức năng mới.

Kinh nghiệm của tôi đã dạy tôi rằng bất kỳ việc tái cấu trúc nào cũng phải được thực hiện trong các khoản tăng nhỏ 'vô cùng nhỏ'. Nếu bạn phải phá quy tắC# 2, tôi khuyên bạn nên bắt đầu tìm kiếm bằng vòng lặp lồng nhau bên trong hoặc cấu trúc IF và mở rộng ra ngoài cho đến khi bạn tìm thấy một điểm tách biệt, hợp lý và tạo một hàm/phương thức/chương trình con mới chỉ chứa ruột của vòng lặp hoặc cấu trúc đó. Điều này sẽ không làm cho bất cứ điều gì hiệu quả hơn nhưng nó sẽ cung cấp cho bạn một cái nhìn rõ ràng hơn về logic và cấu trúc cơ bản. Khi bạn có một số hàm, phương thức/chương trình con mới, nhỏ hơn, bạn có thể cấu trúc lại và hợp nhất chúng thành một thứ dễ quản lý hơn.

Quy tắc 3: Bỏ qua đoạn trước của tôi và đọc lại hai quy tắc đầu tiên.

3

Tôi đồng ý với các nhận xét khác. Nếu bạn không phải làm vậy thì đừng làm. Nó thường tốn kém hơn rất nhiều sau đó nó có giá trị nếu cơ sở mã là nhiều hơn hoặc ít hơn chết bất kỳ cách nào.

Mặt khác, nếu bạn cảm thấy rằng bạn không thể có được đầu của bạn xung quanh mã sau đó một refactor có lẽ là không thể tránh khỏi. Nếu đây là trường hợp đó, vì đó là một ứng dụng web, bạn có thể tạo ra một bộ kiểm tra chức năng vững chắc bằng selenium không? Nếu vậy đây là cách tiếp cận thử nghiệm nhanh nhất và bổ ích nhất cho mã như vậy và sẽ bắt được hầu hết các lỗi cho buck.

Thứ hai, bắt đầu với việc tái cấu trúc phương pháp trích xuất để tạo phương pháp soạn của các phương pháp khó khăn lớn. Mỗi khi bạn nghĩ đến bản thân của mình "Điều này cần phải có một bình luận để giải thích nó làm gì", bạn nên giải nén nó thành một phương thức có tên thay thế cho bình luận.

Khi điều này đã được thực hiện, nếu bạn vẫn không thể thêm chức năng cần thiết, bạn có thể thực hiện các phép tái cấu trúc nâng cao hơn và thậm chí có thể thêm một số kiểm tra đơn vị. Nhưng tôi thường thấy rằng tôi có thể thêm những gì được yêu cầu/sửa lỗi trong mã kế thừa bằng cách chỉ tạo mã tự viết.

+0

nó chi phí cho tôi một công việc! –

3

Trong một vài từ: trước khi thực hiện bất kỳ sửa đổi nào đối với mã cũ, ý tưởng hay của nó bắt đầu từ các thử nghiệm đơn vị tự động. Điều này sẽ cung cấp cho nhà phát triển sự hiểu biết về những điều quan trọng: phụ thuộc đoạn mã này có, dữ liệu đầu vào, kết quả đầu ra, điều kiện biên như vậy.

Khi được thực hiện nhiều khả năng bạn sẽ hiểu rõ hơn về mã này hoạt động như thế nào và cách mã hoạt động.

Sau khi có ý nghĩa (nhưng không bắt buộc) hãy làm sạch mã một cách chính xác hơn cho các biến cục bộ, di chuyển một số chức năng (mã lặp lại, nếu có) vào các chức năng có tên thân thiện với con người rõ ràng.

Việc dọn dẹp đơn giản có thể làm cho mã dễ đọc hơn và đồng thời lưu nhà phát triển khỏi các vấn đề hồi quy với trợ giúp kiểm tra đơn vị.

Tái cấu trúc - thực hiện các thay đổi nhỏ, từng bước, khi bạn có thời gian và sự hiểu biết về các yêu cầu và chức năng, đơn vị thường xuyên kiểm tra mã.

Nhưng đừng bắt đầu từ refactoring

+0

Nó không thường xuyên tôi đã đi qua bất kỳ mã di sản đòi hỏi các loại tái cấu trúc có thể kiểm tra ở bất kỳ mức độ hợp lý ... – Joe

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