2009-05-06 85 views
9

Tôi muốn biết lý do chúng tôi tái cấu trúc và biện minh cho nó. Tôi đọc rất nhiều người thất vọng về ý tưởng tái cấu trúc. Refactoring was variously described là:Tại sao chúng ta tái cấu trúc?

  1. Kết quả của thiết kế không đủ .

  2. vô kỷ luật hack

  3. Một hoạt động nguy hiểm mà không cần thiết liều gây bất ổn làm việc mã

  4. Một sự lãng phí nguồn lực.

Lý do có trách nhiệm khiến chúng tôi phải cấu trúc lại mã của mình là gì?

Tôi cũng tìm thấy câu hỏi tương tự ở đây how-often-should-you-refactor, nó không cung cấp lý do để tái cấu trúc.

+0

câu hỏi phải là "Tại sao việc tái cấu trúc lại quan trọng" :) – balexandre

+8

nên là cộng đồng wiki. – SilentGhost

+5

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

Trả lời

34

Tại sao chúng tôi tái cấu trúc?

Vì có không thay thế thực tế để viết mã. Không có số lượng lập kế hoạch hoặc trải nghiệm trả trước có thể thay thế việc viết mã thực tế. Đây là điều mà cả một thế hệ (gọi là thác nước) đã học được một cách khó khăn.

Một khi bạn bắt đầu viết mã và ở giữa nó, bạn lý do về cách nó hoạt động ở cấp thấp hơn bạn làm thông báo mọi thứ (hiệu suất, khả năng sử dụng hoặc tính chính xác) thoát khỏi thiết kế cao hơn.

Tái cấu trúc hoàn thiện.

Tự hỏi: tại sao các họa sĩ làm nhiều nét với bàn chải trên cùng một vị trí?

+12

Tôi cũng muốn thêm rằng yêu cầu của khách hàng của bạn hoặc sự hiểu biết của họ về yêu cầu của họ sẽ luôn thay đổi theo thời gian. Thiết kế trả trước của bạn có thể không kéo dài ... – morechilli

+0

@morechilli, tôi có thể báo cho bạn về điều đó: "Thiết kế trả trước tuyệt vời của bạn có thể không kéo dài ..."? :). Tôi thích cách bạn nói. –

+2

Tôi có thể nghỉ lại luật của morechilli không? "Thiết kế phía trước briallian của bạn S W KHÔNG kéo dài ..." –

7

Để giữ lại mã cơ sở có thể duy trì?

Mã được đọc nhiều hơn văn bản, vì vậy cần phải có mã cơ sở có thể đọc được, dễ hiểu và có thể bảo trì. Khi bạn nhìn thấy một cái gì đó được viết kém hoặc thiết kế, nó có thể được cấu trúc lại để cải thiện thiết kế của mã.

Bạn làm sạch ngôi nhà của bạn cũng thường xuyên, phải không? Mặc dù nó có thể được coi là một sự lãng phí thời gian, nó là cần thiết để giữ cho ngôi nhà của bạn sạch sẽ, do đó bạn có một môi trường tốt đẹp để sống.

6

Bạn có thể cần phải cấu trúc lại nếu mã của bạn là

  • không hiệu quả
  • Buggy
  • cứng để mở rộng
  • cứng để duy trì

Tất cả nắm xuống origina l mã không được tốt, vì vậy bạn cải thiện nó. Nếu bạn có các bài kiểm tra đơn vị hợp lý, nó sẽ không nguy hiểm chút nào.

+4

nó doesn ' t có nghĩa là mã ban đầu không phải là rất tốt. Các mã ban đầu có thể đã được awesome, nhưng sửa đổi tiếp theo do tác động của các tính năng khác hoặc yêu cầu thay đổi có thể đã làm những điều lộn xộn. Nếu _new_ code cần tái cấu trúc đó là độc tài của bạn "shit dev", mã cũ hầu như luôn luôn cần tái cấu trúc nếu mọi người không có kiến ​​thức làm sạch khi sửa lỗi/thay đổi tính năng (theo kinh nghiệm của tôi hiếm khi họ làm). – Quibblesome

+0

@Quarrelsome Điểm tốt – Greg

0

tôi Refactor vì:

  1. Thường mã của tôi là xa lần đầu tiên tối ưu xung quanh.
  2. Cảnh báo thường là 20-20.
  3. Mã của tôi sẽ dễ bảo trì hơn cho người tiếp theo.
  4. Tôi có niềm tự hào chuyên nghiệp trong công việc tôi để lại.
  5. Tôi tin rằng thời gian dành cho bây giờ có thể tiết kiệm rất nhiều thời gian (và tiền bạc) hơn nữa xuống theo dõi.
3

Vì tầm nhìn xa dễ hơn tầm nhìn xa.

Phần mềm là một trong những thứ phức tạp nhất do con người tạo ra, vì vậy không dễ để xem xét mọi thứ trước.Đối với các dự án lớn, nó thậm chí có thể là không thể cho đội (ít nhất là cho một bao gồm con người;)) để xem xét tất cả mọi thứ trước khi họ thực sự bắt đầu phát triển nó.

Một lý do khác là phần mềm không được xây dựng, nó đang phát triển. Điều đó có nghĩa là phần mềm có thể và phải thích nghi với các yêu cầu và môi trường luôn thay đổi.

0

Trả trước: Tái cấu trúc không cần phải nguy hiểm khi a) được các công cụ hỗ trợ và b) bạn có một testuite mà bạn có thể chạy sau khi tái cấu trúc để kiểm tra chức năng của phần mềm.

Một trong những lý do chính để tái cấu trúc là tại một số thời điểm bạn tìm ra mã được sử dụng bởi nhiều đường dẫn mã và bạn không muốn sao chép (sao chép & dán) nhưng tái sử dụng. Điều này đặc biệt quan trọng trong trường hợp bạn tìm thấy lỗi trong mã đó. Nếu bạn đã tái cấu trúc mã trùng lặp thành một phương thức riêng, bạn có thể sửa phương thức đó và được thực hiện. Nếu bạn sao chép & dán mã xung quanh, có nhiều khả năng bạn không sửa tất cả các vị trí mà mã này xảy ra (chỉ cần nghĩ đến các dự án có một số thành viên và hàng nghìn dòng mã).

Bạn nên tất nhiên không làm tái cấu trúc chỉ vì mục đích tái cấu trúc - sau đó nó thực sự là một sự lãng phí tài nguyên.

0

Vì lý do gì, khi tôi tạo hoặc tìm một chức năng cuộn màn hình, tôi biết đã đến lúc phải ngồi lại và xem xét liệu nó có nên được tái cấu trúc hay không - nếu tôi phải cuộn toàn bộ trang để trong toàn bộ chức năng, rất có thể đó không phải là một ví dụ điển hình về tính dễ đọc hoặc khả năng bảo trì.

0

Để làm cho nội dung điên rồ trở nên lành mạnh.

Tôi chủ yếu refactor khi mã đã bị quá nhiều theo bản sao + dán và thiếu hướng dẫn kiến ​​trúc rằng hành động hiểu mã là giống như sắp xếp lại và loại bỏ trùng lặp.

1

Một tình huống khác mà bạn cần tái cấu trúc là TDD. Cách tiếp cận sách giáo khoa cho TDD là chỉ viết mã mà bạn cần để vượt qua bài kiểm tra và sau đó tái cấu trúc nó thành một thứ gì đó đẹp hơn sau đó.

0

Đó là con người bị lỗi và bạn luôn mắc phải lỗi khi phát triển phần mềm. Việc tạo ra một thiết kế tốt ngay từ đầu giúp ích rất nhiều, và có lập trình viên giỏi trong nhóm cũng là một điều tốt, nhưng họ sẽ luôn phạm sai lầm, và sẽ có mã khó đọc, kết hợp chặt chẽ hoặc không hoạt động, v.v ... Refactoring là một công cụ để sửa chữa những lỗi này khi chúng đã xảy ra. Bạn sẽ không bao giờ ngừng làm việc để ngăn chặn những điều này xảy ra để bắt đầu, nhưng khi chúng xảy ra, bạn có thể sửa chúng.

0

Tái cấu trúc với tôi giống như làm sạch bàn làm việc của tôi; nó tạo ra một môi trường làm việc tốt hơn bởi vì theo thời gian nó sẽ trở nên lộn xộn.

0

Tôi refactor bởi vì, mà không cần tái cấu trúc, nó trở nên khó khăn hơn và khó khăn hơn để thêm các tính năng mới vào một codebase theo thời gian. Nếu tôi có các tính năng A, B, và C để bổ sung, tính năng C sẽ sớm hoàn thành, với ít đau đớn và đau khổ hơn, nếu tôi dành thời gian để cấu trúc lại sau các tính năng A và B. Tôi hạnh phúc hơn, sếp của tôi hạnh phúc hơn và khách hàng của chúng tôi hạnh phúc hơn.

Tôi nghĩ rằng nó đáng để nghỉ ngơi, trong bất kỳ cuộc trò chuyện nào liên quan đến tái cấu trúc, việc tái cấu trúc đó là bảo toàn hành vi một cách chính xác. Nếu vào cuối của "tái cấu trúc" chương trình của bạn có đầu ra khác nhau, hoặc nếu bạn chỉ nghĩ, nhưng không thể chứng minh, rằng nó có cùng một kết quả đầu ra, thì những gì bạn đã làm không phải là tái cấu trúc. (Điều đó không có nghĩa là nó vô giá trị hoặc không đáng làm - có lẽ đó là một sự cải tiến. Nhưng nó không tái cấu trúc và không nên nhầm lẫn với nó.)

0

Tái cấu trúc là một thành phần trung tâm trong bất kỳ phương pháp phát triển phần mềm nhanh nào.

Trừ khi bạn hiểu đầy đủ các yêu cầu và giới hạn kỹ thuật của dự án, bạn không thể có thiết kế trả trước hoàn chỉnh. Trong trường hợp này thay vì sử dụng phương pháp tiếp cận thác nước truyền thống, có lẽ bạn nên sử dụng phương pháp nhanh nhẹn - các phương pháp nhanh nhẹn tập trung vào việc thích nghi nhanh chóng với các thực tế thay đổi. Và làm thế nào bạn sẽ thích ứng với mã nguồn của bạn mà không cần tái cấu trúc?

0

Tất cả các điểm của bạn là các trình mô tả chung về lý do khiến mọi người làm trình tái cấu trúc. Tôi sẽ nói rằng lý do mọi người nên refactor nằm trong điểm # 1: Một thiết kế lớn lên phía trước (BDUF) là hầu như luôn luôn không hoàn hảo. Bạn tìm hiểu về hệ thống khi bạn xây dựng nó. Trong cố gắng để dự đoán những gì có thể xảy ra bạn thường kết thúc xây dựng các giải pháp phức tạp để đối phó với những điều mà không bao giờ thực sự xảy ra. (YAGNI - Bạn sẽ không cần nó).

Thay vì tiếp cận BDUF, một giải pháp tốt hơn là do đó thiết kế các phần của hệ thống bạn biết bạn sẽ cần. Thực hiện theo các nguyên tắc của single responsibility principle, sử dụng inversion of control/dependency injection để bạn có thể thay thế các phần của hệ thống khi cần.

Viết thử nghiệm cho các thành phần của bạn. Và sau đó, khi các yêu cầu cho hệ thống của bạn thay đổi hoặc bạn phát hiện lỗi trong thiết kế ban đầu của bạn, bạn có thể cấu trúc lại và mở rộng mã của bạn. Vì bạn có các bài kiểm tra đơn vị và các bài kiểm tra tích hợp tại chỗ, bạn sẽ biết liệu khi nào và khi việc tái cấu trúc phá vỡ một cái gì đó.

0

Tôi đã tìm thấy thiết kế và triển khai mã, đặc biệt với các dự án không quen thuộc và lớn là quá trình học tập.

Phạm vi và yêu cầu của dự án thay đổi theo thời gian, có hậu quả đối với thiết kế. Nó có thể là sau khi chi tiêu một số thời gian thực hiện sản phẩm của bạn, bạn khám phá ra rằng thiết kế kế hoạch của bạn không phải là tối ưu. Có lẽ các yêu cầu mới đã được khách hàng thêm vào. Hoặc có lẽ bạn đang thêm chức năng bổ sung cho một sản phẩm cũ và bạn cần phải cấu trúc lại mã để cung cấp đầy đủ chức năng này.

Trong mã kinh nghiệm của tôi đã được viết kém và việc tái cấu trúc trở nên cần thiết để ngăn không cho sản phẩm bị lỗi và để đảm bảo sản phẩm được duy trì/mở rộng.

Tôi tin rằng một quá trình thiết kế lặp đi lặp lại, với prototyping sớm là một cách tốt để giảm thiểu tái cấu trúc sau này. Điều này cũng cho phép bạn thử nghiệm với các triển khai khác nhau để xác định cái nào là phù hợp nhất.

Không chỉ vậy, nhưng những ý tưởng và phương pháp mới cho những gì bạn đang làm có thể có sẵn. Tại sao lại gắn bó với mã cũ, dễ đọc có thể trở thành vấn đề nếu nó có thể được cải thiện?

Tóm lại, các dự án sẽ thay đổi theo thời gian, điều này đòi hỏi những thay đổi về cấu trúc để đảm bảo thay đổi cấu trúc đáp ứng các yêu cầu mới.

1

... vì mã hóa giống như làm vườn. Codebase của bạn phát triển và bạn thay đổi tên miền khi thời gian trôi qua. Một ý tưởng hay khi trở lại sau đó thường trông giống như một thiết kế tồi tệ hiện nay và thiết kế tốt là gì bây giờ cũng có thể không được tối ưu trong tương lai.

Mã không bao giờ được coi là một tạo tác vĩnh viễn hoặc cũng không nên coi nó là quá thiêng liêng để chạm vào. Niềm tin cần được thu hút thông qua thử nghiệm và tái cấu trúc là một cơ chế để tạo thuận lợi cho sự thay đổi.

0

Từ kinh nghiệm cá nhân của riêng tôi, tôi tái cấu trúc bởi vì tôi thấy nếu tôi làm phần mềm theo cách tôi muốn nó được làm từ đầu tiên thì phải mất rất nhiều thời gian để tạo ra thứ gì đó.

Vì vậy, tôi đánh giá cao tính thực dụng của việc phát triển phần mềm trên mã sạch. Một khi tôi có một cái gì đó chạy tôi sau đó bắt đầu refactor nó vào cách nó nên được. Không cần phải nói, đoạn mã không bao giờ bị biến thành một mảnh không thể đọc được.

Một lưu ý phụ - Tôi đã lấy bằng về kĩ nghệ phần mềm sau khi đọc một số tài liệu từ Steve Mcconnell khi còn nhỏ. Tôi yêu các mẫu thiết kế, tái sử dụng mã tốt, thiết kế độc đáo và vân vân. Nhưng tôi tìm thấy khi làm việc trên các dự án của riêng mình mà thiết kế những thứ ban đầu từ quan điểm đó chỉ không hoạt động trừ khi tôi là một chuyên gia tuyệt đối với công nghệ tôi đang sử dụng (Điều đó không bao giờ xảy ra)

0

Có sự khác biệt giữa các phép tái cấu trúc lớn (các mô đun tái cấu trúc, các cấu trúc phân lớp, các giao diện) và các phép tái cấu trúc "đơn vị" - trong các phương thức và các lớp.

Bất cứ khi nào tôi chạm vào một đoạn mã, tôi thực hiện tái cấu trúc đơn vị - đổi tên biến, giải nén phương thức; bởi vì thực sự nhìn thấy mã trước mặt tôi mang lại cho tôi nhiều thông tin hơn để làm cho nó tốt hơn. Đôi khi việc tái cấu trúc cũng giúp tôi hiểu rõ hơn mã đang làm. Nó giống như viết hoặc vẽ, bạn lấy ra một ý tưởng mờ ảo ra khỏi đầu; đặt một bộ xương thô lên giấy; sau đó vào mã. Sau đó, bạn tinh chỉnh ý tưởng thô trong mã.

Với các công cụ tái cấu trúc hiện đại như ReSharper trong C#, loại tái cấu trúc đơn vị này cực kỳ dễ dàng, nhanh chóng & rủi ro thấp.

Tái cấu trúc lớn khó hơn, phá vỡ nhiều thứ hơn và yêu cầu liên lạc với các thành viên trong nhóm của bạn. Nó sẽ trở nên rõ ràng cho mọi người khi những điều này cần phải xảy ra - bởi vì các yêu cầu đã thay đổi rất nhiều đến mức thiết kế ban đầu không còn hoạt động nữa - và sau đó chúng nên được lên kế hoạch như một tính năng mới.

Quy tắc cuối cùng của tôi - chỉ mã refactor mà bạn đang thực sự làm việc. Nếu chức năng của mã không cần phải thay đổi, thì nó đủ tốt & không cần phải làm việc thêm nữa.

Tránh tái cấu trúc chỉ vì mục đích tái cấu trúc; đó chỉ là refactorbating!

0

Tái cấu trúc được thực hiện để giúp mã dễ hiểu hơn/tài liệu.

  • Để đặt tên cho phương thức tốt hơn - có thể tên trước đó không rõ ràng hoặc không chính xác.
  • Để cung cấp cho các biến nhiều hơn các tên mô tả/tốt hơn.
  • Chia nhỏ một phương pháp thực sự thành nhiều phương thức nhỏ hơn đại diện cho các bước liên quan đến giải quyết vấn đề.
  • Chuyển lớp học sang gói mới (không gian tên) để hỗ trợ tổ chức.
  • Giảm mã trùng lặp.
6

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.

+0

Câu trả lời hay. Tôi muốn thêm vào, theo điểm 1, rằng chúng ta thường không biết chính xác những gì chúng ta muốn cho đến khi chúng ta có một cái gì đó tương tự. Nó không chỉ là lập kế hoạch cho chính xác những gì chúng ta muốn lúc đầu là không thực tế; nó thường là không thể. –

0
  1. hiểu biết nghèo trong những yêu cầu:

    Nếu nhà phát triển không có một sự hiểu biết rõ ràng về các yêu cầu, thiết kế kết quả và mã không thể làm hài lòng khách hàng. Sau đó khi các yêu cầu trở nên rõ ràng hơn, refactor trở nên cần thiết.

  2. Hỗ trợ các yêu cầu mới.

    Nếu một thành phần cũ, trong hầu hết các trường hợp, nó sẽ không thể xử lý các yêu cầu mới cấp tiến. Sau đó nó trở nên cần thiết để đi tái cấu trúc.

  3. Rất nhiều lỗi trong mã hiện có.

    Nếu bạn đã dành nhiều giờ trong văn phòng sửa chữa một vài lỗi khó chịu trong một thành phần cụ thể, nó sẽ trở thành một sự lựa chọn tự nhiên để tái cấu trúc sớm nhất.

1

Trong khi rất nhiều người khác đã nói lý do hoàn toàn hợp lệ, đây là của tôi:

Bởi vì đó là niềm vui . Nó giống như đánh bại thời gian của riêng bạn trong steeplechase, có bicep mạnh hơn trong armwrestling hoặc cải thiện điểm cao của bạn trong một trò chơi của sự lựa chọn của bạn.

1

Câu trả lời đơn giản là, các yêu cầu thay đổi. Không có vấn đề làm thế nào thanh lịch thiết kế của bạn, một số yêu cầu sau này sẽ không mua nó.

0

Điểm số một là vấn đề? Nếu bạn đang tái cấu trúc, thiết kế phía trước rõ ràng là thiếu sót. Đừng lãng phí thời gian đáng lo ngại về những sai sót trong thiết kế ban đầu; đó là tin cũ. Điều quan trọng là những gì bạn có bây giờ, vì vậy dành thời gian tái cấu trúc.

2

Như Martin Fowler nói, điều duy nhất đáng ngạc nhiên về yêu cầu thay đổi phần mềm là bất kỳ ai cũng ngạc nhiên bởi nó.

Yêu cầu sẽ thay đổi, các tính năng mới sẽ được yêu cầu. Đây là một điều tốt. Những nỗ lực nâng cao thành công hầu hết thời gian, và khi họ thất bại, họ thất bại nhỏ, vì vậy có ngân sách để làm nhiều hơn. Các dự án thiết kế phía trước lớn không thành công thường xuyên (một thống kê đặt tỷ lệ thất bại ở mức 66%), vì vậy hãy tránh chúng. Cách để tránh chúng là thiết kế đủ cho phiên bản đầu tiên, và khi các tính năng nâng cao được thêm vào, hãy cấu trúc lại đến điểm mà nó trông giống như hệ thống dự định làm điều đó ngay từ đầu. Tuổi thọ của một dự án có thể thực hiện điều này (có vấn đề khi bạn xuất bản định dạng dữ liệu hoặc API - khi bạn phát trực tiếp bạn không thể lúc nào cũng nguyên sơ nữa) là vô hạn.

Để đối phó với bốn điểm, tôi sẽ nói rằng một quá trình mà tránh xa nhu cầu refactoring:

  1. Một thế giới tĩnh nơi có gì thay đổi để thiết kế trả trước có thể bắn trúng mục tiêu không di chuyển cách hoàn hảo.
  2. Sẽ dẫn đến hack xấu xí để làm việc xung quanh lỗi thiết kế không được được cấu trúc lại.
  3. sẽ dẫn đến nguy hiểm trùng lặp mã như sợ thay đổi bộ mã hiện tại.
  4. Will lãng phí tài nguyên trên kỹ thuật vấn đề và xây dựng thiết kế lớn hiện vật với dự đoán của yêu cầu mà không bao giờ kết thúc nhận được xây dựng, gây ra số tiền lớn mã và biến chứng để kéo dự án xuống trong khi không cung cấp bất kỳ giá trị nào.

Một báo trước, mặc dù vậy. Nếu bạn không có sự hỗ trợ thích hợp, trong một công cụ tự động cho các trường hợp đơn giản, và thử nghiệm đơn vị toàn diện trong các trường hợp phức tạp hơn, nó sẽ bị tổn thương, sẽ có lỗi mới được giới thiệu, và bạn sẽ phát triển một nỗi sợ (khá hợp lý) làm nhiều hơn. Tái cấu trúc là một công cụ tuyệt vời, nhưng nó đòi hỏi thiết bị an toàn.

+0

Bạn có tài liệu tham khảo hỗ trợ tuyên bố của bạn về tỷ lệ thất bại của các dự án BDUF không? Tôi đang chuẩn bị một danh sách các lý do cho việc tái cấu trúc cho công ty của tôi, vì vậy điều đó sẽ rất hữu ích. –

+0

@GinoBambino, tôi khuyên bạn nên Bob Lewis http://issurvivor.com/ Ông có một số bài viết làm cho vấn đề. – Yishai

0

Tôi refactor vì tái cấu trúc đúng cách làm cho bảo trì SO dễ dàng hơn nhiều. Tôi đã phải duy trì một TÔN của mã xấu, khủng khiếp và tôi không muốn bàn giao bất kỳ thứ gì tôi đã viết cho người khác để duy trì.

Chi phí bảo dưỡng của mã có mùi sẽ hầu như luôn cao hơn chi phí bảo trì đối với mã có mùi ngọt.

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