Hãy tưởng tượng rằng tôi có việc phải làm, có thể được thực hiện theo ba cách khác nhau: một cách chậm và đau đớn nhưng không an toàn; con đường với đau khổ vừa phải, cho bạn có Resource1
; và một cách nhanh chóng và dễ dàng, yêu cầu cả hai số Resource1
và Resource2
. Bây giờ, những nguồn lực quý giá để tôi bọc chúng vào RAII-thực hiện ResNHolder
s và viết một cái gì đó như thế này:RAII và ngoại lệ trong nhà xây dựng
void DoTheJob(Logger& log/*, some other params */) {
try {
Res1Holder r1(/* arguments for creating resource #1 */);
try {
Res2Holder r2(/* arguments */);
DoTheJobQuicklyAndEasily(log, r1, r2);
}
catch (Res2InitializationException& e) {
log.log("Can't obtain resource 2, that'll slowdown us a bit");
DoTheJobWithModerateSuffering(log, r1);
}
}
catch (Res1InitializationException& e) {
log.log("Can't obtain resource 1, using fallback");
DoTheJobTheSlowAndPainfulWay(log);
}
}
"DoTheJobXxx()" lấy tham chiếu đến Logger
/ResNHolder
, bởi vì họ đều là phòng không copyable. Tôi có làm nó quá vụng về không? Có cách nào khác thông minh để cấu trúc các chức năng?
tôi nghĩ rằng đó là tốt. – Nawaz
Điều này có thể là một ví dụ về sách giáo khoa để thử nắm bắt. –
Tôi sẽ sử dụng phương thức factory trả về đối tượng tùy chọn thay vì ngoại lệ. –
yngccc