Pregunta

Tengo que implementar un conjunto de 60 funciones, de acuerdo con las firmas predefinidas. Deben ser funciones globales, y no funciones miembro de algunas clases. Cuando los implemento, utilizo un conjunto de clases bien hechas proporcionadas por terceros.

Mi implementación de la mayoría de las funciones es bastante corta, alrededor de 5-10 líneas, y trata principalmente con diferentes accesos a esas clases de terceros. Para algunas funciones más complicadas, creé un par de clases nuevas que se ocupan de todas las cosas complicadas, y también las uso en las funciones. Toda la información del estado se almacena en los miembros estáticos de mis clases y las de terceros, por lo que no tengo que crear variables globales.

Pregunta: ¿Sería mejor si implemento una clase grande con 60 funciones miembro y hago toda la implementación (que ahora está en las funciones globales) allí? Y cada una de las funciones que tengo que escribir solo llamará a la función miembro correspondiente en la clase.

¿Fue útil?

Solución

  

Toda la información de estado se almacena en los miembros estáticos de mis clases y las de terceros, por lo que no tengo que crear variables globales.

Ese es el punto clave. No, definitivamente no deberían ser puestos en clases. Las clases están hechas para ser utilizadas para crear objetos. En su situación, los usaría solo como un alcance, para los datos y funciones. Pero esto es lo que los espacios de nombres ya resuelven mejor:

namespace stuff {
    ... 60 functions ...
    namespace baz {
        ... if you want, you can have nested namespaces, to ...
        ... categorize the functions ...
    }

    namespace data {
        ... you can put data into an extra namespace if you want ...
    }
}

Crear clases que consistan exclusivamente en miembros estáticos es una mala idea.

Otros consejos

¿Los usuarios de su código realmente necesitan esta gran clase?

En caso afirmativo, impleméntelo.

Si no, no pierdas tu tiempo en implementarlo y no pierdas el tiempo de otros obligados a probarlo o tratar de entender cuál es el papel exacto de esta clase más allá de la apariencia de OOP.

litb es probablemente correcto. La única razón por la que incluso consideraría incluir un class alrededor de un montón de funciones gratuitas es si necesita adjuntar algunos de sus propios datos para usarlos en sus contenedores. Lo único que me viene a la cabeza es si necesito un identificador para un archivo de registro o algo similar en los contenedores.

En una nota relacionada, ¡lucha contra la tentación de using namespace stuff;! Consulte siempre las funciones que utilizan la calificación del espacio de nombres:

#include <stuff.h>
void some_function() {
    stuff::function_wrapper();
}

en lugar de:

#include <stuff.h>
using namespace stuff;
void some_function() {
    function_wrapper();
}

El beneficio es que si alguna vez necesita convertir el namespace a una clase llena de static métodos, puede hacerlo fácilmente.

Creo que la " una responsabilidad de clase uno " la regla debería guiarte aquí. Las 60 funciones probablemente se pueden dividir en diferentes responsabilidades, y cada una de ellas merece una clase. Esto también proporcionará una interfaz más OO a los clientes de la API que no están limitados por la necesidad de funciones globales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top