Мейерс упомянул в своей книге «Эффективный C ++», что в некоторых случаях функции, не являющиеся членами, не являющимися друзьями, лучше инкапсулируются, чем функции-члены.
Пример:
// Web browser allows to clear something
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
Многие пользователи захотятвыполнить все эти действия вместе, поэтому WebBrowser
может также предложить функцию, которая делает именно это:
class WebBrowser {
public:
...
void clearEverything(); // calls clearCache, clearHistory, removeCookies
...
};
Другой способ - определить функцию, не являющуюся членом, не являющейся другом.
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
Функция, не являющаяся членом, лучше, потому что «она не увеличивает количество функций, которые могут получить доступ к закрытым частям класса.», Что приводит к лучшей инкапсуляции.
Функции, подобные clearBrowser
удобные функции , потому что они не могут предложить никакой функциональности, которую WebBrowser
клиент уже не мог получить другим способом.Например, если clearBrowser
не существует, клиенты могут просто вызвать clearCache
, clearHistory
и removeCookies
.
Для меня пример вспомогательных функций разумноНо есть ли какой-нибудь пример, кроме удобной функции, когда версия, не являющаяся членом, превосходит?
В общем, Каковы правила использования, которые ?