Meyers được đề cập trong cuốn sách của mình Hiệu quả C++ trong một số trường hợp nhất định không phải là thành viên không phải là người bạn chức năng được đóng gói tốt hơn so với chức năng thành viên.Khi nào tôi nên sử dụng các chức năng không phải là thành viên không phải thành viên đối với các chức năng của thành viên?
Ví dụ:
// Web browser allows to clear something
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
Nhiều người dùng sẽ muốn thực hiện tất cả những hành động này lại với nhau, vì vậy WebBrowser
cũng có thể cung cấp một chức năng để làm việc đó:
class WebBrowser {
public:
...
void clearEverything(); // calls clearCache, clearHistory, removeCookies
...
};
Một cách khác là để xác định một chức năng không phải là thành viên không phải là thành viên.
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
Chức năng không phải thành viên sẽ tốt hơn vì "nó không làm tăng số lượng chức năng có thể truy cập vào phần riêng tư của lớp".
Các chức năng như clearBrowser
là các chức năng tiện lợi vì chúng không thể cung cấp bất kỳ chức năng nào một cách khác. Ví dụ: nếu clearBrowser
không tồn tại, khách hàng chỉ có thể gọi số clearCache
, clearHistory
và removeCookies
.
Với tôi, ví dụ về các chức năng tiện lợi là hợp lý. Nhưng có bất kỳ ví dụ nào khác ngoài chức năng tiện lợi khi phiên bản không phải thành viên xuất sắc không?
Nói chung, các quy tắc khi sử dụng là gì?
Tôi nghĩ có nhiều tôn giáo hơn các quy tắc khách quan thực tế cho chủ đề đó. – PlasmaHH
Bất kỳ loại thuật toán nào được hưởng lợi miễn phí hơn là thành viên, vì bạn có thể sử dụng lại chúng cho một phạm vi rộng hơn các đối tượng. Một ví dụ về điều này là các hàm 'begin()'/'end()' miễn phí đã được thêm vào tiêu chuẩn mới (cho phép bạn lặp lại các mảng tĩnh cũng như các thùng chứa). –
@PlasmaHH: Tôi không nghĩ nó giống tôn giáo hơn. Lý do để thực hiện một số chức năng không phải là thành viên và không phải người bạn là khá hợp lý. – Nawaz