Tôi muốn giải thích ngắn gọn ba điểm của bạn.
1. "Một kết quả không đủ thiết kế lên phía trước"
cảm giác chung (và nhiều cuốn sách và các blogger) cho chúng tôi biết chúng ta nên phấn đấu cho việc thiết kế đơn giản nhất, sạch nhất có thể để giải quyết một vấn đề nhất định. Mặc dù có thể một số mã được viết mà không có đủ công sức để phát triển sự hiểu biết về các yêu cầu và miền vấn đề, có lẽ phổ biến hơn là "mã nghèo" không phải là "nghèo" khi được viết; thay vào đó, nó không còn đủ.
Yêu cầu thay đổi và thiết kế phải hỗ trợ các tính năng và khả năng bổ sung. Nó không phải là không hợp lý để dự đoán một số thay đổi trong tương lai lên phía trước, nhưng McConnell et al. phải thận trọng đối với các thiết kế cao cấp, quá linh hoạt khi không có nhu cầu rõ ràng và hiện tại về cách tiếp cận như vậy.
3. "Một hoạt động nguy hiểm mà không cần thiết có nguy cơ gây mất ổn định mã làm việc"
Vâng, vâng, nếu được thực hiện đúng cách. Trước khi bạn tìm cách thực hiện bất kỳ sửa đổi đáng kể nào đối với một hệ thống làm việc, bạn nên đưa ra các biện pháp thích hợp để đảm bảo rằng bạn không gây ra bất kỳ tác hại nào - một loại "phát triển Hippocratic oath", gần như.
Thông thường, điều này sẽ được thực hiện bởi một hỗn hợp tài liệu và thử nghiệm, và thường xuyên hơn không, mã sẽ thắng, bởi vì đó là mô tả cập nhật nhất về hành vi thực tế. Trong điều kiện thực tế, điều này chuyển thành có phạm vi bảo hiểm phù hợp với bộ unit test, do đó nếu việc tái cấu trúc không đưa ra các vấn đề không mong muốn, chúng sẽ được xác định và giải quyết.
Rõ ràng, khi bạn tìm cách tái cấu trúc, bạn sẽ phá vỡ một số thử nghiệm nhất định, ít nhất là vì bạn đang cố sửa một số hợp đồng mã bị hỏng. Đó là, tuy nhiên, hoàn toàn có thể refactor với impunity, miễn là bạn có cơ chế đó tại chỗ để phát hiện những sai lầm ngẫu nhiên.
4. "Một sự lãng phí tài nguyên"
Những người khác đã đề cập đến khái niệm về technical debt, đó là, một thời gian ngắn, ý tưởng rằng theo thời gian, sự phức tạp của hệ thống như vậy được xây dựng lên, và rằng một số trong đó xây dựng phải được giảm, bằng cách tái cấu trúc và các kỹ thuật khác, để tạo điều kiện thuận lợi cho việc phát triển trong tương lai. Nói cách khác, đôi khi bạn phải cắn viên đạn và tiếp tục với sự thay đổi mà bạn đã bỏ đi, bởi vì nếu không bạn sẽ tạo ra một tình huống tồi tệ tồi tệ hơn khi bạn đến để thêm một cái gì đó mới trong khu vực đó.
Rõ ràng, có một thời gian và một nơi để trả hết những thứ như vậy; bạn sẽ không cố gắng và hoàn trả một khoản vay cho đến khi bạn có tiền mặt để làm điều đó, và bạn không thể đủ khả năng để đi xung quanh refactoring willy nilly trong một giai đoạn quan trọng trong phát triển. Tuy nhiên, bằng cách đưa ra quyết định giải quyết một số vấn đề trong cơ sở mã của bạn, bạn tiết kiệm thời gian phát triển trong tương lai, và do đó tiền, và thậm chí có thể tiếp tục trong tương lai, tránh chi phí phải từ bỏ hoặc viết lại hoàn toàn một số thành phần sự hiểu biết của bạn.
câu hỏi phải là "Tại sao việc tái cấu trúc lại quan trọng" :) – balexandre
nên là cộng đồng wiki. – SilentGhost
sao chép dán từ bài đăng blog này http://codebetter.com/blogs/jeremy.miller/archive/2008/05/15/why-do-we-refactor.aspx – SilentGhost