Thay vì lo lắng về cách kiểm tra chức năng như nó đứng, tôi sẽ thiết kế lại chức năng để làm việc một cách hợp lý hơn một chút, và kiểm tra phiên bản được thiết kế lại để thay thế.
Ngay bây giờ, hàm dường như có ba trách nhiệm riêng biệt (và chỉ một chút liên quan): thực hiện chuyển đổi, sửa đổi chuỗi được cung cấp bên ngoài và ghi một số dữ liệu vào luồng. Luồng mà nó viết (std::cout
) cũng được mã hóa cứng - một sự cố đang chờ xảy ra (ví dụ: chuyển đổi sang môi trường GUI có thể không quan trọng).
Tôi bắt đầu bằng 1) chia thành các hàm lôgic và 2) cung cấp luồng dưới dạng thông số.
std::string convert_int(int val) {
switch (val) {
case 1: return "1";
case 2: return "2";
default: return "Nix";
}
}
std::ostream &write_string(std::ostream &os, std::string const &s) {
return os << s;
}
Tôi đã không bao gồm bất cứ điều gì để (đặc biệt) sửa đổi một chuỗi bên ngoài cung cấp - rõ ràng là bạn có thể gán giá trị trả về từ convert_int
như bạn thấy phù hợp, và giá trị của chuỗi đó được thông qua năm wasn' t được sử dụng anyway.
Thật vậy, write_string
là một ứng cử viên tốt để được loại bỏ hoàn toàn, nhưng vì bạn có loại khả năng cơ bản đó, chúng tôi sẽ giữ lại nó cho thời điểm này. Thử nghiệm những điều này là tương đối đơn giản - đối với convert_int
, chúng tôi xem xét chuỗi trả về và so sánh với những gì chúng tôi mong đợi. Đối với write_string
, chúng tôi có thể chuyển một số stringstream
thay vì thông thường ostream
- sau đó chúng tôi có thể sử dụng .str()
để nhận kết quả đó dưới dạng chuỗi và (lại) so sánh với những gì chúng tôi mong đợi.
Nguồn
2010-05-06 16:44:20
Bạn chỉ cần đảm bảo rằng hiệu ứng mong muốn đã xảy ra sau cuộc gọi? – jball
Tôi giả sử "tác dụng phụ" trong ví dụ này đề cập đến đầu ra cho std :: cout. –
Tôi phải hỏi, tuy nhiên, tại sao bạn không chỉ trả về một chuỗi thay vì đi qua trong một tham chiếu? Bạn hoàn toàn thay thế cái mà bạn vượt qua, vì vậy bạn không nhận được lợi ích nào từ việc tránh sao chép (vì bạn không tránh nó), và nếu bạn trả về chuỗi, bạn có thể hưởng lợi từ RVO (tối ưu hóa giá trị trả về) . –