Estoy trabajando en un proyecto de C ++ donde tengo un montón de funciones matemáticas que inicialmente escribí para usar como parte de una clase. Sin embargo, a medida que escribía más código, me di cuenta de que necesitaba estas funciones matemáticas en todas partes.
¿Dónde está el mejor lugar para ponerlos? Digamos que tengo esto:
class A{
public:
int math_function1(int);
...
}
Y cuando escribo otra clase, no puedo (o al menos no sé cómo) usar eso math_function1
en esa otra clase. Además, me he dado cuenta de que algunas de estas funciones no están realmente relacionadas con la clase A. Parecían estar al principio, pero ahora puedo ver cómo son solo funciones matemáticas.
¿Qué es una buena práctica en esta situación? En este momento los he copiado y pegado en las nuevas clases, lo que estoy seguro es la peor práctica.
static
palabra clave?Respuestas:
C ++ puede tener funciones que no sean de método bien, si no pertenecen a una clase, no las coloque en una clase, solo colóquelas en el ámbito global u otro espacio de nombres
fuente
math_function1(42)
podría llamar a un miembro de la clase actual;special_math_functions::math_function1(42)
claramente llama a una función independiente). Dicho esto,::math_function(42)
proporciona la misma desambiguación.// optional
. Sazone según el gusto.Depende de cómo esté organizado el proyecto y qué tipo de patrones de diseño está utilizando, suponiendo que este sea estrictamente un código de utilidad, tiene las siguientes opciones:
Tenga en cuenta que la primera opción será la mejor apuesta y las tres siguientes son de utilidad limitada. Sin embargo, dicho esto, es posible que se encuentre solo debido a que los programadores de C # o Java realizan algún trabajo en C ++ o si alguna vez trabaja en código C # o Java donde el uso de clases es obligatorio.
fuente
Como ya dijo, copiar y pegar el código es la peor forma de reutilización de código. Si tiene funciones que no pertenecen a ninguna de sus clases o que se pueden usar para varios escenarios, el mejor lugar para ubicarlas sería una clase auxiliar o de utilidad. Si no usan ningún dato de instancia, pueden volverse estáticos, por lo que no necesita crear una instancia de la clase de utilidad para usarlo.
Vea aquí una discusión sobre las funciones miembro estáticas en C ++ nativo y aquí para clases estáticas en C ++ administrado. Entonces podría usar esta clase de utilidad donde hubiera pegado su código.
En .NET, por ejemplo, cosas como
Min()
yMax()
se proporcionan como miembros estáticos en laSystem.Math
clase .Si todas sus funciones están relacionadas con las matemáticas y, de lo contrario, tendría una
Math
clase gigantesca , es posible que desee desglosarla más y tener clases comoTrigonometryUtilities
,EucledianGeometryUtilities
y así sucesivamente.Otra opción sería poner la funcionalidad compartida en una clase base de las clases que requieren dicha funcionalidad. Esto funciona bien, cuando las funciones en las preguntas deben operar en datos de instancia, sin embargo, este enfoque también es menos flexible si desea evitar la herencia múltiple y solo se adhiere a una clase base, porque estaría "usando" su base única clase solo para obtener acceso a alguna funcionalidad compartida.
fuente
Desambigua el término "función auxiliar". Una definición es una función de conveniencia que usa todo el tiempo solo para hacer un trabajo. Esos pueden vivir en el espacio de nombres principal y tener sus propios encabezados, etc. La otra definición de función auxiliar es una función de utilidad para una sola clase o familia de clases.
Ahora
isPrinter
está disponible para cualquier código, incluido su encabezado, peroprint_alignment_page
requiere unausing namespace printer_utils::Xerox;
directiva. También se puede referirlo comopara ser más claro
El STL de C ++ tiene el
std::
espacio de nombres que cubre casi todas sus clases y funciones, pero las divide categóricamente en más de 17 encabezados diferentes para permitir que el codificador elimine los nombres de clase, nombres de funciones, etc. si quieren escribir los suyosDe hecho, NO se recomienda usar
using namespace std;
en un archivo de encabezado o, como se hace a menudo, como la primera línea dentromain()
.std::
es de 5 letras y, a menudo, parece una tarea rutinaria para introducir la función que uno quiere usar (¡especialmentestd::cout
ystd::endl
!) pero tiene un propósito.El nuevo C ++ 11 tiene algunos espacios de nombres secundarios para servicios especiales como
que se puede traer para su uso.
Una técnica útil es la composición del espacio de nombres . Uno define un espacio de nombres personalizado para contener los espacios de nombres que necesita para su
.cpp
archivo en particular y usarlo en lugar de un conjunto deusing
declaraciones para cada cosa en un espacio de nombres que pueda necesitar.Esta técnica limita la exposición al conjunto
std:: namespace
(¡ es grande! ) Y permite escribir código más limpio para las líneas de código más comunes que las personas escriben con más frecuencia.fuente
Es posible que desee ponerlo en una función de plantilla para que esté disponible para diferentes tipos de enteros y / o flotantes:
También podría crear tipos personalizados limpios que representen, por ejemplo, números enormes o números complejos al sobrecargar operadores relevantes para su tipo personalizado para que sean amigables con las plantillas.
fuente