Meyers mencionó en su libro Effective C++ que, en ciertos escenarios, las funciones de no amigos no miembros están mejor encapsuladas que las funciones de miembros.¿Cuándo debería preferir las funciones de no amigo no miembro a las funciones de miembro?
Ejemplo:
// Web browser allows to clear something
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
Muchos usuarios querrán realizar todas estas acciones en conjunto, por lo WebBrowser
también podría ofrecer una función para hacer precisamente eso:
class WebBrowser {
public:
...
void clearEverything(); // calls clearCache, clearHistory, removeCookies
...
};
La otra forma es definir una no miembro de la función no amigo.
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
La función no miembro es mejor porque "no aumenta el número de funciones que pueden acceder a las partes íntimas de la clase.", Lo que conduce a una mejor encapsulación.
Funciones como clearBrowser
son funciones de confort porque no pueden ofrecer ninguna funcionalidad WebBrowser
un cliente no podía conseguir ya de alguna otra manera. Por ejemplo, si clearBrowser
no existe, los clientes pueden simplemente llamar al clearCache
, clearHistory
y removeCookies
.
Para mí, el ejemplo de las funciones de conveniencia es razonable. ¿Pero hay algún otro ejemplo que no sea la función de conveniencia cuando la versión no miembro sobresale?
Más en general, ¿Cuáles son las reglas de cuándo usar qué?
Creo que hay más religión que reglas objetivas reales para ese tema. – PlasmaHH
Cualquier tipo de algoritmo se beneficia de ser gratuito en lugar de miembros, ya que puede reutilizarlos para una gama más amplia de objetos. Un ejemplo de esto son las funciones gratuitas 'begin()'/'end()' que se agregaron al nuevo estándar (que le permiten iterar matrices estáticas y contenedores). –
@PlasmaHH: No creo que sea más como religión. El fundamento para hacer algunas funciones de no miembro y no amigo es bastante razonable. – Nawaz