2009-03-05 19 views
10

Giả sử bạn có một chương trình hiện đang hoạt động theo cách mà nó được yêu cầu. Ứng dụng này có mã rất kém phía sau nó, ăn nhiều bộ nhớ, không có giá trị và sẽ viết lại chính để thực hiện bất kỳ thay đổi nào về chức năng.Tại thời điểm nào việc tái cấu trúc trở nên không đáng giá?

Tại thời điểm nào việc tái cấu trúc trở nên ít hợp lý hơn sau đó tổng số xây dựng lại?

Trả lời

10

Joel đã viết một bài luận tốt đẹp về chủ đề rất này:

Things You Should Never Do, Part 1

Bài học then chốt tôi nhận được từ này là mặc dù các mã cũ là khủng khiếp, đau mắt lại và cảm giác thẩm mỹ của bạn, có một khá cơ hội tốt mà rất nhiều mã đó đang vá lỗi không có giấy tờ và các vấn đề. Tức là, nó có rất nhiều kiến ​​thức về miền được nhúng vào trong nó và sẽ khó khăn hoặc không thể để bạn tái tạo nó. Bạn sẽ liên tục bị đánh với những lỗi không cần thiết.

Sách tôi thấy vô cùng hữu ích là Working Effectively With Legacy Code bởi Michael C. Feathers. Nó cung cấp các chiến lược và phương pháp để tiếp cận ngay cả mã di sản thực sự xấu xí.

+0

Fred Brooks nói "xây dựng một cái để vứt bỏ" – 13ren

+0

Chưa kể rằng có rất nhiều chi tiết bạn cần phải thực hiện mà bạn không nghĩ đến khi bạn phác họa ra dự án lớn. –

0

Khi bạn dành nhiều thời gian để tái cấu trúc hơn là viết mã thực sự.

0

Một tùy chọn là viết các bài kiểm tra đơn vị để bao gồm ứng dụng hiện có và sau đó bắt đầu tái cấu trúc từng chút một, sử dụng các bài kiểm tra đơn vị để đảm bảo mọi thứ hoạt động như trước.

Trong một thế giới lý tưởng bạn muốn đã có các unit test cho chương trình, nhưng với ý kiến ​​của bạn về chất lượng của các ứng dụng Tôi đoán bạn không ...

1

Tại điểm mà phần mềm không làm những gì nó phải làm. Tái cấu trúc (thay đổi mã mà không thay đổi chức năng) có ý nghĩa khi và chỉ khi chức năng là "như dự định".

3

Vâng, câu trả lời đơn giản nhất là nếu nó sẽ mất nhiều thời gian để tái cấu trúc hơn là để xây dựng lại, thì bạn chỉ nên xây dựng lại.

Nếu đó là một dự án cá nhân thì bạn có thể muốn xây dựng lại nó vì bạn có thể sẽ tìm hiểu thêm từ việc xây dựng từ đầu hơn là tái cấu trúc, và đó là một mục tiêu lớn của các dự án cá nhân.

Tuy nhiên, trong một môi trường giới hạn thời gian chuyên nghiệp, bạn nên luôn luôn đi với bất kỳ chi phí nào của công ty số tiền ít nhất (cho cùng một phần thưởng) trong thời gian dài, có nghĩa là chọn bất kỳ thời gian nào mất ít thời gian hơn.

Tất nhiên, điều đó có thể phức tạp hơn một chút. Nếu những người khác có thể làm việc trên các tính năng trong khi việc tái cấu trúc đang được thực hiện, thì đó có thể là lựa chọn tốt hơn để mọi người chờ đợi một phiên bản hoàn toàn mới được xây dựng. Trong trường hợp đó việc xây dựng lại có thể mất ít thời gian hơn chỉ việc tái cấu trúc sẽ thực hiện, nhưng bạn cần phải thực hiện toàn bộ dự án và tất cả những người đóng góp của dự án.

1

Tôi đã làm việc với các ứng dụng như vậy trong quá khứ. Cách tiếp cận tốt nhất tôi đã tìm thấy là một cách dần dần: Khi bạn đang làm việc trên mã, hãy tìm những thứ được thực hiện nhiều lần, nhóm chúng lại với nhau theo chức năng. Giữ sổ ghi chép (bạn biết đấy, một quyển sổ thật, bằng giấy và bút chì hoặc bút) để bạn có thể đánh dấu sự tiến bộ của mình. Sử dụng nó kết hợp với VCS của bạn, không phải thay vì nó. Sổ ghi chép có thể được sử dụng để cung cấp một cái nhìn tổng quan về các chức năng mới mà bạn đã tạo ra như là một phần của việc tái cấu trúc, và VCS tất nhiên sẽ điền vào chỗ trống cho các chi tiết.

Theo thời gian, bạn sẽ hợp nhất nhiều mã vào những nơi thích hợp hơn. Sao chép mã trong khoảng thời gian này sẽ không thể thực hiện được, vì vậy, hãy thực hiện tốt nhất có thể cho đến khi bạn đạt đến điểm mà bạn có thể thực sự bắt đầu quá trình tái cấu trúc, kiểm tra toàn bộ cơ sở mã và làm việc nó như một toàn thể.

Nếu bạn không có đủ thời gian cho quá trình đó (sẽ mất một thời gian rất dài), sau đó viết lại từ đầu bằng cách sử dụng phương pháp thử nghiệm đầu tiên có lẽ tốt hơn.

1

Nếu bạn có thể đủ thời gian để xây dựng lại hoàn toàn ứng dụng, không cần phải cải thiện chức năng từng bước và không muốn giữ lại bất kỳ mã hiện có nào sau đó viết lại chắc chắn là một giải pháp thay thế khả thi. Mặt khác, bạn có thể sử dụng tái cấu trúc để thực hiện ghi đè gia tăng bằng cách thay thế dần các hàm hiện có với các hàm tương đương được viết tốt hơn và hiệu quả hơn.

6

Một lợi ích của việc tái cấu trúc qua việc xây dựng lại là NẾU bạn có thể thực hiện tái cấu trúc từng bước, tức là theo từng bước, bạn có thể kiểm tra số gia tăng trong ngữ cảnh của toàn bộ hệ thống, giúp phát triển và gỡ lỗi nhanh hơn.

Mã cũ và được triển khai, ngay cả khi xấu và chậm, có lợi ích khi được kiểm tra kỹ lưỡng và lợi ích này sẽ bị mất nếu bạn bắt đầu từ đầu.

Phương pháp tái cấu trúc gia tăng cũng giúp đảm bảo rằng luôn có một sản phẩm có sẵn có thể được vận chuyển (và nó được cải thiện liên tục).

Có một bài viết hay trên web về how Netscape 6 was written from scratch and it was business-wise a bad idea.

1

Nếu ứng dụng rất nhỏ, bạn có thể viết lại từ đầu. Nếu ứng dụng là lớn, không bao giờ làm điều đó. Viết lại nó dần dần, một bước tại một thời điểm xác nhận bạn đã không phá vỡ bất cứ điều gì.

Ứng dụng là đặc điểm kỹ thuật. Nếu bạn viết lại từ đầu, bạn sẽ gặp phải rất nhiều lỗi ngấm ngầm bởi vì "không ai biết rằng lời gọi hàm này được cho là trả về 3 trong trường hợp rất cụ thể" (hành vi không có giấy tờ ...).

Sẽ luôn vui hơn khi viết lại từ đầu để bộ não của bạn có thể lừa bạn nghĩ đó là lựa chọn đúng đắn. Hãy cẩn thận, rất có thể là không.

0

Không có tài liệu, không có nhà văn gốc, không có trường hợp kiểm tra và một loạt lỗi còn lại.

1

Uncle Bob weighs in như sau:

Khi là một thiết kế lại các chiến lược đúng đắn?

Tôi rất vui vì bạn đã đặt câu hỏi đó. Đây là câu trả lời. Không bao giờ.

Hãy nhìn xem, bạn đã tạo ra mớ hỗn độn, giờ hãy dọn dẹp nó.

0

Tôi không có nhiều may mắn với những thay đổi nhỏ khi mã tôi kế thừa thực sự tệ. Về lý thuyết, phương pháp gia tăng nhỏ có vẻ tốt, nhưng trong thực tế tất cả nó kết thúc với là một ứng dụng tốt hơn, nhưng vẫn kém được thiết kế mà mọi người nghĩ bây giờ là thiết kế của bạn. Khi mọi thứ xảy ra, mọi người không còn nghĩ rằng đó là vì mã trước đó, bây giờ nó trở thành lỗi CỦA BẠN. Vì vậy, tôi sẽ không sử dụng thiết kế lại từ, refactor hoặc bất cứ điều gì khác ngụ ý đến một kiểu quản lý mà bạn đang thay đổi mọi thứ theo cách của bạn trừ khi tôi thực sự sẽ làm theo cách của tôi. Nếu không, mặc dù bạn có thể đã khắc phục được hàng tá vấn đề, bất kỳ vấn đề nào vẫn còn tồn tại (nhưng không được phát hiện) sẽ được quy cho việc bạn làm lại. Và được đảm bảo rằng nếu mã là xấu thì các bản sửa lỗi của bạn sẽ phát hiện nhiều lỗi hơn mà chỉ đơn giản là bị bỏ qua trước bởi vì mã quá tệ để bắt đầu.

Nếu bạn thực sự biết cách phát triển hệ thống phần mềm thì tôi sẽ thiết kế lại toàn bộ hệ thống. Nếu bạn không thực sự biết cách thiết kế phần mềm GOOD thì tôi sẽ nói với những thay đổi nhỏ gia tăng như bạn có thể kết thúc với một cơ sở mã mà chỉ là xấu như bản gốc.

Một lỗi thường được thực hiện khi thiết kế lại là mọi người bỏ qua cơ sở mã ban đầu. Tuy nhiên, thiết kế lại không có nghĩa là hoàn toàn bỏ qua mã cũ. Mã cũ vẫn phải làm những gì mã mới của bạn phải làm, vì vậy trong nhiều trường hợp, các bước bạn cần đã có trong mã cũ. Sao chép và dán sau đó tinh chỉnh hoạt động kỳ diệu khi thiết kế lại hệ thống. Tôi đã thấy rằng trong nhiều trường hợp, việc thiết kế lại và viết lại một ứng dụng và đánh cắp các đoạn mã từ mã ban đầu nhanh hơn nhiều và đáng tin cậy hơn nhiều so với các thay đổi gia tăng nhỏ.

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