must - static functions class c++
¿Usar demasiada estática es malo o bueno? (10)
pero es bueno o malo
El primer adjetivo que viene a la mente es "innecesario". C ++ tiene funciones libres y espacios de nombres, entonces ¿por qué necesitarías hacer que sean funciones estáticas en una clase?
El uso de métodos estáticos en clases no ejecutables en C # y Java es una solución porque estos lenguajes no tienen funciones gratuitas (es decir, funciones que residen directamente en el espacio de nombres, en lugar de como parte de una clase). C ++ no tiene ese defecto. Solo usa un espacio de nombres.
Me gusta utilizar funciones estáticas en C ++ como una forma de categorizarlas, como hace C #.
Console::WriteLine("hello")
¿Esto es bueno o malo? Si las funciones se usan a menudo, supongo que no importa, pero si no, ¿ejercen presión sobre la memoria?
¿Qué hay de static const
?
Acuerde con Frank aquí, no hay ningún problema con las funciones estáticas (globales) (por supuesto, siempre que estén organizadas). Los problemas solo comienzan a aparecer cuando las personas piensan "oh, haré que el alcance de este dato un poco más ancho "... Pendiente resbaladiza :)
Para ponerlo realmente en perspectiva ... Programación funcional ;)
El problema con las funciones estáticas es que pueden conducir a un diseño que rompe la encapsulación. Por ejemplo, si te encuentras escribiendo algo así como:
public class TotalManager
{
public double getTotal(Hamburger burger)
{
return burger.getPrice() + burget.getTax();
}
}
... entonces es posible que deba replantearse su diseño. Las funciones estáticas a menudo requieren que use setters y getters que desordenan la API de una clase y complican las cosas en general. En mi ejemplo, podría ser mejor eliminar los getters de Hamburger y simplemente mover la clase getTotal () a Hamburger.
Estoy a favor de usar funciones estáticas. Esto solo tiene sentido, especialmente cuando está organizado en módulos ( static class
en C #).
Sin embargo, en el momento en que esas funciones necesiten algún tipo de datos externos (const de tiempo de no compilación), entonces esa función debe convertirse en un método de instancia y encapsularse junto con sus datos en una clase.
En pocas palabras: funciones estáticas bien, datos estáticos malos.
Para la organización, use espacios de nombres como ya se dijo.
Para datos globales, me gusta usar el patrón singleton porque ayuda con el problema del orden de inicialización desconocido de los objetos estáticos. En otras palabras, si usa el objeto como singleton, se garantiza que se inicializará cuando se use.
También asegúrese de que sus funciones estáticas sean sin estado para que sean seguras para hilos.
Una razón específica por la que los datos estáticos son malos es que C ++ no garantiza el orden de inicialización de los objetos estáticos en diferentes unidades de traducción. En la práctica, esto puede causar problemas cuando un objeto depende de otro en una unidad de traducción diferente. Scott Meyers discute esto en el Ítem 26 de su libro Más Efectivo C ++.
Use espacios de nombres para hacer una colección de funciones:
namespace Console {
void WriteLine(...) // ...
}
En cuanto a la memoria, las funciones usan la misma cantidad fuera de una función, como una función miembro estática o en un espacio de nombres. Es decir: no hay otra memoria que el código en sí.
Tiendo a hacer clases que consisten en funciones estáticas, pero algunos dicen que la "manera correcta" de hacer esto generalmente es usar espacios de nombres. (Desarrollé mis hábitos antes de que C ++ tuviera espacios de nombres).
Por cierto, si tienes una clase que consta únicamente de datos y funciones estáticas, debes declarar que el constructor es privado, por lo que nadie intentará crear una instancia. (Esta es una de las razones por las que algunos argumentan que deben usar espacios de nombres en lugar de clases).
Usualmente solo uso estadísticas en conjunto con el sistema de amigos.
Por ejemplo, tengo una clase que usa muchas funciones auxiliares internas (en línea) para calcular cosas, incluidas operaciones en datos privados.
Esto, por supuesto, aumenta la cantidad de funciones que tiene la interfaz de clase. Para deshacerme de eso, declaro una clase auxiliar en el archivo .cpp de las clases originales (y por lo tanto, no se ve en el mundo exterior), la hago amiga de la clase original y luego muevo las antiguas funciones auxiliares a miembro estático (en línea) funciones de la clase auxiliar, pasando la clase anterior por referencia además de los parámetros anteriores.
Esto mantiene la interfaz delgada y no requiere una gran lista de funciones de amigos gratis. Inline también funciona bien, así que no estoy completamente en contra de la estática. (Lo evito tanto como puedo, pero al usarlo así, me gusta hacerlo).
Aquellos que dicen que las funciones estáticas pueden ser reemplazadas por espacios de nombres son incorrectos, aquí hay un ejemplo simple:
class X
{
public:
static void f1 ()
{
...
f2 ();
}
private:
static void f2 () {}
};
Como puede ver, la función estática pública f1
llama a otra función estática, pero privada f2
.
Esto no es solo una colección de funciones, sino una colección inteligente con sus propios métodos encapsulados. Los espacios de nombres no nos darían esta funcionalidad.
Muchas personas usan el patrón "singleton" solo porque es una práctica común, pero en muchos casos necesita una clase con varios métodos estáticos y solo un miembro de datos estáticos. En este caso, no hay necesidad de un singleton en absoluto. También llamar al método instance()
es más lento que simplemente acceder directamente a las funciones / miembros estáticos.