Như một lưu ý phụ: tìm kiếm một công việc mới. Điều này sẽ không tốt hơn.
Mục tiêu của mã bạn đang xem xét là:
Mục tiêu đầu tiên được xem xét bằng cách kiểm tra xem các đơn vị, tích hợp, hệ thống và kiểm tra chức năng có ở đây không, có liên quan hay không và chúng bao gồm tất cả các tình huống phải kiểm tra. Bạn cũng phải kiểm tra niềm tin mà tác giả ban đầu có thể có về ngôn ngữ lập trình, điều này có thể dẫn đến các lỗi tinh vi hoặc mã giả vờ làm điều gì đó khác với những gì nó thực sự làm.
Mục tiêu thứ hai là câu hỏi của bạn tập trung vào. Một mặt, mã mới dự kiến sẽ không làm tăng nợ kỹ thuật. Mặt khác, phạm vi của đánh giá là chính mã, nhưng trong bối cảnh của toàn bộ cơ sở mã. Từ đó, bạn, với tư cách là người đánh giá, có thể mong đợi hai cách tiếp cận từ tác giả ban đầu:
Mã bên ngoài không phải là lỗi của tôi. Tôi chỉ thực hiện tính năng này và không quan tâm đến toàn bộ cơ sở mã.
Theo quan điểm này, mã sẽ sao chép các lỗ hổng của codebase, và do đó chắc chắn sẽ làm tăng nợ kỹ thuật: mã xấu hơn luôn luôn tệ hơn.
Mặc dù đây là một cách tiếp cận ngắn hạn hợp lệ, nhưng về lâu dài, nó sẽ dẫn đến sự chậm trễ và năng suất thấp, và cuối cùng dẫn đến quá trình phát triển trở nên đắt đỏ và rủi ro, sản phẩm sẽ ngừng phát triển.
Viết mã mới là một cơ hội để tái cấu trúc một di sản.
Trong viễn cảnh này, ảnh hưởng của các lỗ hổng của mã kế thừa đối với mã mới có thể bị hạn chế. Hơn nữa, các khoản nợ kỹ thuật có thể được giảm, hoặc ít nhất là không tăng tỷ lệ thuận với sự tăng trưởng của mã.
Mặc dù đây là một cách tiếp cận dài hạn hợp lệ, nhưng nó có những rủi ro ngắn hạn. Vấn đề chính là, trong ngắn hạn, đôi khi sẽ mất nhiều thời gian hơn để vận chuyển tính năng cụ thể. Một khía cạnh quan trọng khác là nếu mã kế thừa chưa được kiểm tra, việc tái cấu trúc nó có nguy cơ rất lớn trong việc đưa ra hồi quy.
Tùy thuộc vào quan điểm bạn muốn khuyến khích, bạn có thể có xu hướng khuyên người đánh giá tái cấu trúc nhiều hơn hay không. Trong mọi trường hợp, đừng mong đợi đoạn mã hoàn hảo, sạch sẽ với kiến trúc và thiết kế đẹp bên trong một cơ sở mã tào lao. Điều bạn không nên khuyến khích là hành vi mà một nhà phát triển có kiến thức phải làm việc với một cơ sở mã hóa xảo quyệt cố gắng làm tốt phần của mình . Thay vì làm cho mọi thứ đơn giản hơn, nó chỉ làm cho chúng phức tạp hơn trước đó. Bây giờ, thay vì mã xấu thống nhất, bạn có một phần với các mẫu thiết kế, một phần khác với mã rõ ràng, rõ ràng, một phần khác được tái cấu trúc rộng rãi theo thời gian và không có sự thống nhất nào.
Ví dụ, hãy tưởng tượng rằng bạn đang khám phá một cơ sở mã di sản của một trang web cỡ trung bình. Bạn ngạc nhiên vì thiếu cấu trúc thông thường và thực tế là việc ghi nhật ký, khi hoàn thành, được thực hiện bằng cách nối thêm nội dung vào tệp văn bản bằng tay, thay vì sử dụng khung ghi nhật ký. Bạn quyết định cho tính năng mới để sử dụng MVC và khung đăng nhập.
Đồng nghiệp của bạn đang triển khai một tính năng khác và rất ngạc nhiên khi thiếu ORM nơi người ta sẽ tạo ra kích thước hoàn hảo. Vì vậy, anh ta bắt đầu sử dụng một ORM.
Cả bạn và đồng nghiệp của bạn đều không thể trải qua hàng trăm ngàn dòng mã để sử dụng MVC, hoặc khung ghi nhật ký hoặc ORM ở mọi nơi. Trên thực tế, nó sẽ đòi hỏi nhiều tháng làm việc: tưởng tượng giới thiệu MVC; nó sẽ kéo dài bao lâu? Hoặc điều gì về một ORM trong các tình huống trong đó các truy vấn SQL được tạo ra một cách hỗn loạn thông qua ghép nối (với các vị trí không thường xuyên cho SQL Injection) bên trong mã không ai có thể hiểu được?
Bạn nghĩ rằng bạn đã làm một công việc tuyệt vời, nhưng bây giờ, một nhà phát triển mới tham gia dự án phải đối mặt với sự phức tạp hơn nhiều so với trước đây:
Cách xử lý các yêu cầu cũ,
Cách thức MVC
Cơ chế ghi nhật ký cũ,
Khung đăng nhập,
Truy cập trực tiếp vào cơ sở dữ liệu với các truy vấn SQL được xây dựng nhanh chóng,
ORM.
Trong một dự án tôi đang làm việc, có bốn khung ghi nhật ký (!) Được sử dụng cạnh nhau (cộng với ghi nhật ký thủ công). Lý do là vì mỗi khi ai đó muốn đăng nhập công cụ, không có cách tiếp cận chung để làm điều đó, vì vậy thay vì học một khung mới (trong tất cả các trường hợp chỉ được sử dụng trong 5% của cơ sở mã), người ta chỉ cần thêm một cách khác đã biết. Hãy tưởng tượng sự lộn xộn.
Một cách tiếp cận tốt hơn sẽ là cấu trúc lại cơ sở mã một bước. Lấy một lần nữa ví dụ về ghi nhật ký, tái cấu trúc sẽ bao gồm các bước nhỏ sau:
Tìm tất cả các địa điểm nơi ghi nhật ký cũ được thực hiện (nghĩa là khi tệp nhật ký được truy cập trực tiếp) và đảm bảo tất cả chúng đều gọi các phương thức giống nhau.
Di chuyển mã này đến một thư viện chuyên dụng, nếu có. Tôi không muốn đăng nhập logic lưu trữ trong lớp giỏ hàng của tôi.
Sửa đổi, nếu cần, giao diện của các phương thức đăng nhập. Chẳng hạn, chúng ta có thể thêm một mức cho biết tin nhắn là không chính thức, hay là một cảnh báo hay lỗi.
Sử dụng các phương thức mới được cấu trúc lại trong tính năng mới.
Di chuyển sang khung ghi nhật ký: mã bị ảnh hưởng duy nhất là mã trong thư viện chuyên dụng.