Me sigo confundiendo sobre esta decisión de diseño muchas veces cuando estoy escribiendo programas, pero no estoy 100% seguro de cuándo debo hacer una función para ser una función miembro de una clase, cuándo dejarla como una función normal en la que otros archivos fuente pueden llamar a la función cuando la declaración de la función se expone en un archivo de encabezado. ¿El acceso deseado a las variables miembro de una clase tiene que ver con la decisión la mayor parte del tiempo?C++ Funciones de miembros vs funciones gratuitas
Respuesta
La Interfaz Principio por Herb Sutter
Para una clase X, todas las funciones, incluyendo las funciones libres, que tanto
(a) "Mención" X, y
(b) están "suministrado con" X
son lógicamente parte de X, debido a que forman parte de la interfaz de X.
Para discusión a fondo leer Namespaces and the Interface Principle por Herb Sutter.
EDITAR
En realidad, si se quiere entender C++ ir y leer todo lo Herb Sutter ha escrito :)
Gracias por su respuesta. El enlace es bastante descriptivo. – stanigator
(+1). También me gusta este de Scott Meyers: http://www.ddj.com/cpp/184401197. Los artículos de Scott y Herb se complementan enormemente, creo. –
Estoy confundido. El artículo vinculado trata sobre espacios de nombres, pero la pregunta no es sobre espacios de nombres. Se pregunta cuándo tener "funciones gratuitas" frente a "funciones de miembros". –
Si algo necesita acceder a variables miembro o algún aspecto de una instancia del objeto, a continuación, debería ser un método.
Si está estrechamente relacionado con la clase, pero no necesita acceder a ninguna información específica de la instancia, debe ser una función compartida (o función de clase, o función estática según el lenguaje de programación con el que se trate)
Incluso si solo se trata de una función genérica, es probable que tenga más de uno de ellos y que se pueda agregar/organizar de acuerdo con algún concepto. Luego, puede crear una clase que represente ese concepto y hacer que sean funciones compartidas.
Dado lo anterior, nunca más veo razones para crear funciones independientes.
C++ no tiene ningún concepto de métodos. –
método == función de miembro – PSkocik
Uso las clases cuando necesito mantener el estado. Si una función no necesita acceso a información de estado mantenida, entonces prefiero una función gratuita porque facilita la prueba y la reutilización de código.
Si tengo un montón de funcionalidades relacionadas pero no necesito mantener el estado, entonces prefiero poner funciones gratuitas en un espacio de nombres.
- 1. C++ Punteros a funciones de miembros Herencia
- 2. ¿Pueden los operadores de asignación de C++ ser funciones gratuitas?
- 3. funciones estáticas vs funciones const
- 4. Operadores vs Funciones en C/C++
- 5. Scala: funciones normales vs funciones agrupadas?
- 6. Funciones de C++: signo & vs asterisco
- 7. C++ - Espacio de nombres vs. funciones estáticas
- 8. Especialización parcial de plantillas de funciones gratuitas: prácticas recomendadas
- 9. La mecánica de la extensión a través de funciones gratuitas o funciones miembro
- 10. C++ Especialización de plantillas para proporcionar funciones de miembros adicionales?
- 11. ¿Puede alinear funciones de miembros estáticos?
- 12. vs. funciones estáticas privadas en C++
- 13. PDO vs pg_ * funciones
- 14. Lisp: macros vs funciones
- 15. funciones Freemarker vs macros
- 16. F # Funciones vs. Valores
- 17. Funciones vs procedimientos almacenados
- 18. funciones vs código repetido
- 19. ¿Elegir entre métodos de instancia y funciones gratuitas?
- 20. funciones dentro de las funciones en C
- 21. Javascript - Argumentos Vs Funciones anidadas Vs Performance
- 22. funciones de Ruby vs métodos
- 23. Funciones asincrónicas en C# usando
- 24. "Las llamadas a funciones son costosas" vs. "Mantener funciones pequeñas"
- 25. Funciones vs métodos en Scala
- 26. Php (eval vs call_user_func vs funciones variables ...)
- 27. Métodos estáticos sin estado vs. funciones C en Objective-C
- 28. C funciones de prototipo
- 29. Mapa de funciones C++
- 30. ¿Cómo pedir funciones en C++?
Tenga en cuenta también que "método" es un término orientado a objetos generales. C++ no tiene "métodos", solo "funciones". El estándar C++ nunca usa el término "método". En su lugar, prefiere usar "función de miembro" o "función gratuita". –
El comentario de Brian realmente debería ser la respuesta. Eso es lo que buscan la mayoría de las personas que vienen aquí ... esta pregunta ni siquiera menciona los métodos. –
De acuerdo. Probablemente debería cambiar el título de la pregunta, de hecho es engañoso. – Ben