2010-08-16 36 views
11

Tương tự như Does TDD mean not thinking about class design?, tôi đang gặp khó khăn khi nghĩ về giai đoạn "thiết kế" truyền thống phù hợp với TDD.Làm cách nào để thiết kế các hệ thống phức tạp với TDD?

Theo trò chơi Bowling Kata (phiên bản 'trò chuyện', có liên kết thoát tôi vào lúc này) TDD dường như bỏ qua các quyết định thiết kế được thực hiện sớm (loại bỏ đối tượng khung, đối tượng cuộn, v.v.). Tôi có thể thấy trong ví dụ đó là một ý tưởng tốt để làm theo các bài kiểm tra và bỏ qua những suy nghĩ thiết kế ban đầu của bạn, nhưng trong các dự án lớn hơn hoặc những dự án bạn muốn mở rộng để mở rộng/tùy chỉnh, sẽ không tốt hơn để đưa mọi thứ vào rằng bạn không có kiểm tra hoặc không có nhu cầu ngay lập tức để tránh ghi đè tốn thời gian sau này?

Tóm lại, có bao nhiêu thiết kế quá nhiều khi thực hiện TDD và tôi nên theo thiết kế như thế nào khi tôi viết kiểm tra và mã để vượt qua chúng (bỏ qua thiết kế của tôi để chỉ lo lắng về việc vượt qua bài kiểm tra)?

Hoặc tôi lo lắng về không có gì, và mã viết đơn giản để làm theo các bài kiểm tra là không (trong thực tế) khó viết lại hoặc tái cấu trúc nếu bạn được vẽ thành một góc? Ngoài ra, tôi có thiếu điểm và rằng tôi phải là mong muốn để viết lại các phần của mã khi tôi đến để kiểm tra một phần chức năng mới?

Trả lời

9

Tôi sẽ kiểm tra thiết kế ban đầu của bạn. Trong nhiều cách, TDD là một quá trình khám phá. Bạn có thể mong đợi để xác nhận lựa chọn thiết kế ban đầu của bạn hoặc thấy rằng có những lựa chọn tốt hơn bạn có thể thực hiện. Làm như thiết kế trả trước nhiều như bạn cảm thấy thoải mái. Một số thích bay trên ghế của những chiếc ghế làm thiết kế cao cấp và sử dụng TDD để xác định thiết kế. Trong khi những người khác muốn có tất cả mọi thứ trên giấy đầu tiên.

Một phần của TDD là tái cấu trúc.

+3

+1 cho 'Phần TDD là tái cấu trúc': Thiết kế sẽ cần được cập nhật để phản ánh các thay đổi cần thiết trong khi thử nghiệm. –

+0

Cảm ơn sau đó - vì vậy tôi đang thiếu điểm, và tái cấu trúc/viết lại là một phần của thiết kế nổi bật này. Tốt để biết, bây giờ để thử nó ra với một cái gì đó! –

3

Bắt đầu với ý tưởng thiết kế sơ bộ, chọn thử nghiệm đầu tiên và bắt đầu viết mã, kiểm tra màu xanh lá cây sau khi thử nghiệm, cho phép thiết kế nổi lên, tương tự hoặc không thiết kế ban đầu. Bao nhiêu thiết kế ban đầu phụ thuộc vào độ phức tạp của vấn đề.

Người ta phải chú ý và lắng nghe và đánh hơi mã, để phát hiện các cơ hội tái cấu trúc và mùi mã.

Theo đúng TDD và SOLID principles sẽ mang mã sạch, có thể kiểm tra và linh hoạt để có thể dễ dàng tái cấu trúc, tận dụng thử nghiệm đơn vị làm giàn giáo để ngăn chặn hồi quy.

+0

Vì vậy, thiết kế ban đầu là nhiều hơn trong trường hợp thiết kế nổi lên chạy vào một bức tường gạch (hoặc trông như thể nó sắp sửa)? –

+1

Thiết kế ban đầu là để bắt đầu, đưa ra hướng đầu tiên, cho vấn đề - hoặc một phần phụ của vấn đề. Thiết kế được tạo theo từng bước. – philant

+0

"Viết bài kiểm tra đầu tiên" mà không có ý tưởng nhỏ về những gì cần phải được thực hiện kết thúc lên sản xuất thử nghiệm chính xác cho vấn đề sai. Trước hết cần phải hiểu các vấn đề về miền và kiến ​​trúc, chúng tôi đang nói về các vấn đề phức tạp, sau đó sử dụng các nguyên mẫu nhỏ để nuôi trí tưởng tượng của bạn với ý tưởng và đặt những ý tưởng này dưới sự giám sát. Bạn chỉ cần một công cụ tạo mẫu như IPython hoặc Jupyter trong hầu hết các trường hợp hoặc bằng chứng về khái niệm trong các trường hợp phức tạp hơn, nhằm xác thực các yêu cầu của doanh nghiệp. Cuối cùng, bạn viết mã và viết các bài kiểm tra cho nó. –

2

tôi đã tìm thấy ba cách để làm thiết kế với TDD:

  • Cho phép thiết kế nổi lên một cách tự nhiên như sự trùng lặp và tính phức tạp được lấy ra
  • Tạo một thiết kế hoàn hảo lên phía trước, sử dụng mocks kết hợp với nguyên tắc trách nhiệm duy nhất
  • Hãy thực dụng về nó.

Chủ nghĩa thực dụng có vẻ là lựa chọn tốt nhất nhiều lần nhất, vì vậy, đây là những gì tôi làm. Nếu tôi biết rằng một mô hình cụ thể sẽ phù hợp với vấn đề của tôi rất tốt (ví dụ, MVC) tôi sẽ đi thẳng cho các mocks và giả sử nó hoạt động. Nếu không, nếu thiết kế ít rõ ràng hơn, tôi sẽ cho phép nó xuất hiện.

Điểm giao nhau mà tại đó tôi cảm thấy cần phải tái cấu trúc thiết kế nổi bật là điểm mà tại đó nó dừng việc thay đổi dễ dàng. Nếu một đoạn mã không được thiết kế hoàn hảo, nhưng một dev khác xuất hiện trên nó có thể dễ dàng tái cấu trúc nó, nó đủ tốt.Nếu mã đang trở nên quá phức tạp đến nỗi nó không còn rõ ràng với một dev khác, đây là lúc để cấu trúc lại nó.

Tôi thích Tùy chọn thực, và cấu trúc lại thứ gì đó để hoàn thiện cảm thấy với tôi như cam kết thiết kế mà không cần thực sự làm như vậy. Thay vào đó, tôi tái cấu trúc thành "đủ tốt"; theo cách đó, nếu thiết kế của tôi chứng minh là sai, tôi đã không lãng phí thời gian. Giả sử rằng thiết kế của bạn sẽ sai nếu bạn chưa từng sử dụng nó trước đây trong một ngữ cảnh tương tự.

Điều này cũng cho phép tôi lấy mã của mình nhanh hơn rất nhiều so với nếu nó hoàn hảo. Có nói rằng, đó là nỗ lực của tôi để làm cho mã hoàn hảo mà đã dạy tôi, nơi dòng được!

7

Có điều gì đó để nói về 'Thiết kế hệ thống phức tạp lớn' không được liên kết với TDD - đặc biệt là khi TDD được hiểu là 'Thiết kế thử nghiệm' chứ không phải 'Phát triển thử nghiệm'.

Trong bối cảnh 'phát triển', sử dụng TDD sẽ đảm bảo bạn đang viết kiểm chứng mã mà cho tất cả những lợi ích trích dẫn về TDD (phát hiện lỗi sớm, mã cao: tỷ lệ bảo hiểm thử nghiệm, tương lai dễ dàng hơn refactoring vv vv)

Nhưng trong các hệ thống phức tạp lớn 'Thiết kế', TDD không đặc biệt là giải quyết những mối quan tâm sau đó là cố hữu trong kiến ​​trúc của hệ thống

  1. (Engineering cho) hiệu suất
  2. an
  3. Khả năng mở rộng
  4. Availability
  5. (và tất cả 'ilities' khác)

(ví dụ: tất cả các mối quan tâm ở trên không kỳ diệu 'nổi lên' thông qua "viết một trường hợp thử nghiệm thất bại đầu tiên, tiếp theo là thực hiện công việc, Refactor - lather, rửa sạch, lặp lại ..." công thức).

  • Đối với điều này, bạn sẽ cần phải tiếp cận vấn đề bằng trắng nội trú cấp cao và sau đó chi tiết ở mức độ thấp của một hệ thống đối với những hạn chế áp đặt bởi các yêu cầu và không gian vấn đề với.

  • Một số cân nhắc ở trên cạnh tranh với nhau và yêu cầu sự cân bằng cẩn thận mà không 'nổi lên' thông qua việc viết nhiều bài kiểm tra đơn vị.

  • Khi các thành phần quan trọng và trách nhiệm của mình được định nghĩa và hiểu, TDD có thể được sử dụng trong thực hiện các thành phần. Quá trình tái cấu trúc và liên tục xem xét/cải thiện mã của bạn sẽ đảm bảo thiết kế cấp thấp chi tiết của các thành phần này được chế tác tốt.

Tôi chưa đi qua một mảnh phức tạp đáng kể của phần mềm (ví dụ trình biên dịch, cơ sở dữ liệu, hệ điều hành) đã được thực hiện trong một Test Driven Thiết kế phong cách.Bài viết trên blog sau đây nói về điểm này rất tốt (Compilers, TDD, Mastery)

Ngoài ra, hãy kiểm tra sau đây videos on Architecture làm tăng thêm ý thức chung cho quá trình suy nghĩ.

+0

Trên thực tế tôi đang phát triển một bản sao của stack Asp.Net MVC, tương tự như vNext nhưng dựa trên coroutines, và tôi nhận được điên cố gắng để kiểm tra tất cả mọi thứ. Trên thực tế tôi chủ yếu là làm bài kiểm tra tích hợp và kiểm tra đơn vị chỉ cho các thành phần nhỏ nhất, như cho các trang dựng hình hoặc dao cạo hoặc xử lý roouting. Là một môi trường đa luồng, tôi đã chuẩn bị một loại "chuỗi giả" để chạy tất cả các phần khác nhau từng bước một. Tôi biết rằng tôi không làm TDD nghiêm ngặt nhưng sẽ là IMHO kinda impossibile cho một "một người đàn ông ban nhạc". – EDR

+0

Đến nay, câu trả lời hợp lý nhất cho câu hỏi. Những người ủng hộ TDD truyền giáo: "Viết bài kiểm tra đầu tiên!" ... nhưng ... làm thế nào bạn có thể viết các bài kiểm tra nếu bạn không có bất cứ điều gì, thậm chí không phải là ý tưởng nhỏ nhất về những gì cần phải làm? Bạn sẽ viết các bài kiểm tra chính xác mà giải quyết vấn đề sai hoặc không giải quyết bất cứ điều gì cần thiết ở tất cả! Trước tiên, hãy hiểu miền vấn đề, viết một mẫu thử nghiệm bên trong Jupyter chẳng hạn, đánh giá hiệu suất của nó, dấu chân bộ nhớ, khả năng mở rộng và các yêu cầu khác; nếu cần, viết một bằng chứng về khái niệm; sau đó nắm lấy TDD với những kiến ​​thức bạn đã đạt được trong giai đoạn tạo mẫu. –

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