2009-11-05 27 views
11

Bạn có nên thiết kế mã của mình để làm cho thử nghiệm dễ dàng hơn không? Và nếu có cách thiết kế C++ mã để dễ kiểm tra.Các mẫu để tạo mã C++ dễ kiểm tra

  • Làm cách nào để bạn áp dụng tính năng tiêm phụ thuộc vào C++?
  • Tôi có nên triển khai các lớp bằng cách sử dụng lớp giao diện thuần túy làm cơ sở để đơn giản hóa việc tạo các đối tượng thử nghiệm giả không?
    • Điều đó sẽ buộc tôi phải thực hiện nhiều phương thức ảo. Điều đó có ảnh hưởng đến hiệu suất không?
  • Tôi còn nghĩ gì nữa khi thiết kế cho testability trong C++?
+0

Thiết kế cho testability thực sự là phải có. Tuy nhiên, bạn cũng phải nhận ra rằng chỉ có 'ranh giới' mới có thể kiểm chứng theo kiểu độc lập, hoàn toàn hợp lý cho các thành phần bên trong phụ thuộc vào nhau và không được thử nghiệm cách ly. –

+0

Bạn có thể quan tâm đến [đề xuất trao đổi stack] này (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "xem xét mã"). Nó gần như đã sẵn sàng để bắt đầu phiên bản beta, chỉ cần một vài thứ nữa. – greatwolf

Trả lời

9

Tôi có nên triển khai các lớp bằng cách sử dụng lớp giao diện thuần túy làm cơ sở để đơn giản hóa việc tạo đối tượng thử nghiệm giả không?

  • Điều đó sẽ buộc tôi phải tạo nhiều phương pháp ảo. Điều đó có ảnh hưởng đến hiệu suất không?

Cách giải quyết khác mà tôi thường sử dụng là tạo lớp thay vì ẩn sau một giao diện. Sau đó, tôi có thể vượt qua các đối tượng thử nghiệm/mô hình như các tham số mẫu khi thử nghiệm và các đối tượng thực sự khác. Bằng cách đó, hiệu suất của các chức năng ảo được tránh.

Sửa
Ok, một ví dụ đơn giản:

Với OOP và giao diện, bạn có thể viết một hàm như thế này:

void Foo(IBar& someBar) { ... } 

chức năng này có một tham số mà thực hiện giao diện IBar và làm điều gì đó với nó. Nếu bạn muốn chuyển sang triển khai thực hiện giả, bạn chỉ cần viết đối tượng giả kế thừa từ IBar và chuyển đến Foo. Đơn giản và dễ hiểu.

Nhưng bạn có thể đạt được điều tương tự với mẫu:

template <typename BarType> 
void Foo(BarType& someBar) { ... } 

... và đó là nó. Phần thân của Foo có thể không thay đổi nhiều. Miễn là loại được truyền cho hàm hiển thị tất cả các thành viên chúng ta cần, nó sẽ hoạt động, mà không phải thừa hưởng chính thức từ một lớp giao diện, và không có các chức năng ảo và đa hình thời gian chạy.

+0

Tôi có thể đọc thêm về cách các lớp templatizing ở đâu? Có mô hình mô tả điều này không? –

+0

Tại sao Bạn muốn một mẫu cho mọi thứ ?? jalf đã chỉ cho bạn một ý tưởng để để lại thừa kế (ảo/đa hình) một mình và sử dụng thay vì các mẫu C++ (lập trình chung). Đưa ra mô hình chung (mẫu mã) sẽ bao gồm "tất cả" các loại có thể bạn sẽ sử dụng (với một hàm, thay vì nhiều "phương thức ảo"). – bua

+3

Tất nhiên, mẫu có thể làm cho phụ thuộc thời gian biên dịch trở nên khó hơn vì việc triển khai của chúng đi vào tiêu đề. –

3

Tối đa cohesion và tối thiểu coupling.

Điều này sẽ giúp cuộc sống của bạn dễ dàng hơn khi thử nghiệm.

0

Tôi nghĩ rằng mối quan tâm chính nên là ...

  1. Đạt Các chức năng
  2. Mã Extensiblity
  3. Mã Resuablity
  4. Mã Bảo trì
4

Đừng thiết kế quá nhiều lên từ đầu, sau đó viết một bài kiểm tra, sau đó làm cho nó vượt qua, nhưng không nhiều hơn thế. Giữ chức năng của bạn rất ngắn ngắn. Nhìn những gì bạn đã làm và refactor nó. Nếu bạn định viết bình luận, hãy đặt mã trong câu hỏi vào một hàm riêng biệt với một tên tốt.

Và đừng dành quá nhiều thời gian để suy nghĩ về mô hình, đó là rất nhiều khoa học và ít kết quả, chỉ cần viết một bài kiểm tra trước và giữ cho mã của bạn đơn giản, đáng ngạc nhiên là bạn không cần phải viết các bài kiểm tra cho nó, bạn đã làm nó rồi. Và mã của bạn hoạt động.

+1

"Nếu bạn định viết bình luận, hãy đặt mã được đề cập đến một chức năng riêng biệt với tên tốt" Đây là lời khuyên rất hay. –

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