Các điểm chính của làm việc hiệu quả với mã di sản là gì? [đóng cửa]


133

Tôi đã thấy cuốn sách Làm việc hiệu quả với Mã di sản được đề xuất một vài lần. Những điểm chính của cuốn sách này là gì?

Có nhiều thứ để xử lý mã kế thừa hơn là thêm các bài kiểm tra đơn vị / tích hợp và sau đó tái cấu trúc không?



2
Tất nhiên vấn đề là thêm các bài kiểm tra và sau đó tái cấu trúc. Cuốn sách chủ yếu nói về cách bạn quản lý để có được mã phức tạp không thể kiểm tra được, và có rất nhiều người mở mắt về điểm đó. Hãy nói rằng Feathers không bắt bất kỳ tù nhân nào!
Kilian Foth

9
Có lẽ bạn chỉ nên đọc cuốn sách
HLGEM

Đánh giá đẹp tại đây: andreaangella.com/2014/03/
Mạnh

Câu trả lời:


157

Vấn đề chính với mã kế thừa là nó không có bài kiểm tra. Vì vậy, bạn cần thêm một số (và sau đó nhiều hơn nữa ...).

Điều này tự nó sẽ mất rất nhiều công việc, như @mattnz lưu ý. Nhưng vấn đề đặc biệt của mã kế thừa là nó không bao giờ được thiết kế để có thể kiểm tra được . Vì vậy, thông thường, nó là một mớ hỗn độn mã spaghetti rất lớn, trong đó rất khó hoặc hết sức không thể cô lập các phần nhỏ để được kiểm tra đơn vị. Vì vậy, trước khi kiểm thử đơn vị, bạn cần cấu trúc lại mã để làm cho nó dễ kiểm tra hơn.

Tuy nhiên, để cấu trúc lại một cách an toàn, bạn phải có các bài kiểm tra đơn vị để xác minh rằng bạn chưa phá vỡ bất cứ điều gì với các thay đổi của mình ... Đây là cách bắt 22 mã kế thừa.

Cuốn sách hướng dẫn bạn cách thoát ra khỏi sự nắm bắt này bằng cách thực hiện các thay đổi tối thiểu, an toàn nhất đối với mã chỉ để kích hoạt các thử nghiệm đơn vị đầu tiên. Chúng không có nghĩa là làm cho thiết kế đẹp hơn - chỉ để cho phép thử nghiệm đơn vị. Trong thực tế, đôi khi chúng làm cho thiết kế xấu hơn hoặc phức tạp hơn. Tuy nhiên, chúng cho phép bạn viết bài kiểm tra - và một khi bạn có bài kiểm tra đơn vị, bạn có thể tự do làm cho thiết kế tốt hơn.

Có rất nhiều thủ thuật để làm cho mã có thể kiểm tra được - một số là rõ ràng, một số thì không. Có những phương pháp tôi sẽ không bao giờ nghĩ về bản thân mình, nếu không đọc cuốn sách. Nhưng điều thậm chí còn quan trọng hơn là Feathers giải thích chính xác điều gì làm cho một đơn vị mã có thể kiểm tra được. Bạn cần cắt giảm sự phụ thuộc và đưa ra các rào cản vào mã của mình, nhưng vì hai lý do riêng biệt:

  • cảm biến - để kiểm tra và xác minh các tác động của việc thực thi một đoạn mã và
  • phân tách - trước hết để có được đoạn mã cụ thể vào khai thác thử nghiệm.

Cắt giảm phụ thuộc một cách an toàn có thể là khó khăn. Giới thiệu giao diện, giả và Dependency Injection là sạch và đẹp như một mục tiêu, chỉ không nhất thiết phải an toàn để làm vào thời điểm này. Vì vậy, đôi khi chúng ta phải dùng đến phân lớp của lớp đang được kiểm tra để ghi đè một số phương thức mà thông thường sẽ bắt đầu một yêu cầu trực tiếp đến DB. Đôi khi, chúng ta thậm chí có thể cần phải thay thế một lớp / lọ phụ thuộc bằng một lớp giả trong môi trường thử nghiệm ...

Đối với tôi, khái niệm quan trọng nhất do Feathers mang lại là các đường nối . Đường may là một vị trí trong mã nơi bạn có thể thay đổi hành vi của chương trình mà không cần sửa đổi mã . Xây dựng các đường nối vào mã của bạn cho phép tách đoạn mã đang kiểm tra, nhưng nó cũng cho phép bạn cảm nhận hành vi của mã đang kiểm tra ngay cả khi khó thực hiện hoặc không thể thực hiện trực tiếp (ví dụ: vì cuộc gọi thực hiện thay đổi trong một đối tượng hoặc hệ thống con khác , có trạng thái không thể truy vấn trực tiếp từ bên trong phương thức thử nghiệm).

Kiến thức này cho phép bạn nhận thấy các hạt giống của khả năng kiểm tra trong đống mã khó nhất và tìm ra những thay đổi tối thiểu, ít gây rối nhất, an toàn nhất để đạt được điều đó. Nói cách khác, để tránh thực hiện các phép tái cấu trúc "rõ ràng" có nguy cơ phá mã mà bạn không nhận thấy - bởi vì bạn chưa có các bài kiểm tra đơn vị để phát hiện điều đó.


5
Lưu ý khi câu trả lời ở trên nói "kiểm tra đơn vị" thực tế nó có nghĩa là "kiểm tra tự động" . Đối với một ứng dụng cũ, phần lớn các thử nghiệm tự động hữu ích ban đầu trên thực tế sẽ là các thử nghiệm tích hợp (trong đó logic thử nghiệm thực thi một phiến lớn hơn của mã tổng thể và có thể tạo ra lỗi do lỗi ở nhiều vị trí khác nhau), thay vì đơn vị thực các thử nghiệm (nhằm mục đích phân tích chỉ một mô-đun và thực hiện từng phần nhỏ hơn của từng mã).
Lutz Prechelt

99

Cách nhanh chóng để có được những điểm chính của Làm việc hiệu quả với Mã kế thừa


3
Liên kết MP3 trên trang Hanselminutes bị hỏng, nhưng liên kết trên hanselminutes.com/165/iêu thì không - s3.amazonaws.com/hanselminutes/hanselminutes_0165.mp3 .
Peter Mortensen

Cảm ơn rosston đã sửa liên kết PDF. Có vẻ như objectmentor.com đã biến mất - có lẽ "Chú Bob" đã phá sản?
MarkJ

Tôi không chắc điều gì đã xảy ra với người cố vấn đối tượng, nhưng những ngày này, chú Bob làm việc cho Ánh sáng thứ 7.
Jules

40

Tôi làm việc trên cơ sở mã gồm hàng triệu dòng mã, một số có niên đại từ những năm 1980. Nó chỉ là phần mềm, vì vậy nó chỉ là vấn đề viết một vài bài kiểm tra đơn vị, vì vậy bạn có thể đi và chỉ cần cấu trúc lại nó, và làm cho nó tốt hơn nhiều.

Từ khóa ở đây chỉ là - đó là một từ có bốn chữ cái không thuộc về từ vựng của lập trình viên, chứ đừng nói đến một người đang làm việc trên các hệ thống cũ.

Bạn nghĩ mất bao lâu để viết một bài kiểm tra đơn vị, để kiểm tra nỗ lực phát triển trong một giờ? Để thảo luận, hãy nói một giờ nữa.

Bao nhiêu thời gian được đầu tư vào hệ thống di sản 20 triệu tuổi đó? Giả sử, 20 nhà phát triển trong 20 năm gấp 2000 giờ / năm (họ đã làm việc khá chăm chỉ). Bây giờ chúng ta hãy chọn một số - bạn có máy tính mới và công cụ mới, và bạn thông minh hơn rất nhiều so với những người đã viết đoạn $% ^^ này ngay từ đầu - giả sử bạn đáng giá 10 trong số đó. Bạn đã có 40 năm đàn ông, tốt, bạn có ...?

Vì vậy, câu trả lời cho câu hỏi của bạn là có nhiều hơn nữa. Ví dụ, thói quen đó là 1000 dòng (tôi có một vài dòng trên 5000), nó quá phức tạp và là một miếng mì spaghetti. Nó sẽ chỉ (một từ bốn chữ cái khác) sẽ mất một vài ngày để tính lại nó thành một vài thói quen 100 dòng và một vài người trợ giúp 20 dòng nữa, phải không? SAI LẦM. Ẩn trong 1000 dòng đó là 100 sửa lỗi, mỗi lỗi là một yêu cầu người dùng không có giấy tờ hoặc trường hợp cạnh khó hiểu. Đó là 1000 dòng vì thói quen 100 dòng ban đầu không thực hiện được công việc.

Bạn cần phải làm việc với tâm trí " nếu nó không bị hỏng, đừng sửa nó ". Khi nó bị hỏng, bạn cần phải rất cẩn thận khi sửa nó - vì bạn làm nó tốt hơn, rằng bạn không vô tình thay đổi thứ khác. Lưu ý rằng "đã phá vỡ" có thể bao gồm mã không thể xác định được, nhưng hoạt động chính xác, phụ thuộc vào hệ thống và việc sử dụng nó. Hãy hỏi "chuyện gì xảy ra nếu tôi làm hỏng việc này và làm cho nó tồi tệ hơn", bởi vì một ngày nào đó bạn sẽ làm được, và bạn sẽ phải nói với sếp của sếp tại sao bạn lại chọn làm điều đó.

Những hệ thống này luôn có thể được làm tốt hơn. Bạn sẽ có một ngân sách để làm việc, một dòng thời gian, bất cứ điều gì. Nếu bạn không - hãy đi và làm cho một. Ngừng làm cho nó tốt hơn khi tiền / thời gian đã hết. Thêm một tính năng, cho mình thời gian để làm cho nó tốt hơn một chút. Sửa một lỗi - một lần nữa, dành thêm một chút thời gian và làm cho nó tốt hơn. Không bao giờ cung cấp nó tồi tệ hơn so với khi bạn bắt đầu.


2
cảm ơn vì những lời khuyên! Đây là của bạn hoặc từ cuốn sách?
Armand

3
Có lẽ là một chút của cả hai - tôi đã đọc cuốn sách sau một vài năm làm công việc này, và có lẽ nên đọc nó agian. Giống như bất kỳ cuốn sách hay nào, nó sẽ khiến bạn phải nắm bắt một số điều bạn đang làm, thực thi lại hầu hết những gì bạn làm, nhưng không có tất cả các câu trả lời cho các vấn đề cụ thể của bạn.
mattnz

7
"Đó là 1000 dòng vì thói quen 100line ban đầu không thực hiện được công việc." Vì vậy, rất hiếm khi điều này dường như thực sự là trường hợp. Thường xuyên hơn không phải là 1.000 dòng đơn giản chỉ vì nhà phát triển ban đầu xắn tay áo lên và bắt đầu viết mã trước khi bỏ ra ngay cả một khoảnh khắc để lập kế hoạch hoặc thiết kế.
Stephen Touset

3
Không. Tôi đang nói rằng trong hầu hết các trường hợp (cá nhân tôi gặp phải), 1.000 thói quen dòng là dấu hiệu rõ ràng rằng mọi người bắt đầu viết mã trước khi nghĩ về cách viết một bản tóm tắt thích hợp. Hàng ngàn thói quen hầu như theo định nghĩa quá phức tạp - bạn có nói rằng một thói quen hàng nghìn dòng với hàng trăm lỗi không được ẩn, không bị lỗi là dấu hiệu của một nhà phát triển có trách nhiệm?
Stephen Touset

16
Nếu bạn tin rằng mỗi bài đăng trên trang web này, mọi người đều phải xử lý 1000 mã spaghetti, nhưng không ai từng viết nó. Theo kinh nghiệm của tôi, 1000 (và 10000) thói quen dòng là dấu hiệu của các nhà phát triển đang làm tốt nhất có thể với những gì họ có, để cung cấp những gì họ yêu cầu bởi ông chủ trả lương cho họ. Tôi thấy thật xúc phạm và kiêu ngạo theo cách mà nhiều nhà phát triển cảm thấy thoải mái khi bình luận bên lề mà không biết gì về hoàn cảnh, trong khi không bao giờ phải phơi bày công việc của chính mình cho cộng đồng để phê bình.
mattnz

19

Có hai điểm chính để lấy đi từ cuốn sách.

  1. Mã kế thừa là bất kỳ mã nào không có phạm vi kiểm tra.
  2. Bất cứ khi nào bạn phải thay đổi mã kế thừa, bạn nên đảm bảo rằng nó có phạm vi bảo hiểm.

Như những người phản hồi khác đã chỉ ra, cố gắng cập nhật trước mã di sản hiện tại của bạn là một việc vặt . Thay vào đó, bất cứ khi nào bạn phải thay đổi mã kế thừa (đối với tính năng mới hoặc sửa lỗi), hãy dành thời gian để xóa trạng thái kế thừa của nó.


6
+1 Điểm tuyệt vời: "Bất cứ khi nào bạn phải thay đổi mã kế thừa, hãy dành thời gian để xóa trạng thái kế thừa của nó."
Giăng

3
Xóa trạng thái Di sản, nhận phiếu bầu của tôi :)
Rachel

7

Trong một vỏ hạt đó là sự thật - thêm các bài kiểm tra và tái cấu trúc là tất cả những gì về nó.

Nhưng cuốn sách cung cấp cho bạn nhiều kỹ thuật khác nhau để làm như vậy với mã rất khó kiểm tra và cấu trúc lại một cách an toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.