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.
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. –
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