c++ - tipos - ¿Cuál es el razonamiento detrás de poner constantes en las declaraciones si primero?
que es una constante en programacion (8)
Estaba viendo un ejemplo de código C ++ para una interfaz de hardware con la que estoy trabajando y noté muchas declaraciones en las siguientes líneas:
if ( NULL == pMsg ) return rv;
Estoy seguro de que escuché a la gente decir que poner la constante primero es una buena idea, pero ¿por qué? ¿Es solo así que si tienes una declaración grande, puedes ver rápidamente con qué estás comparando o hay algo más?
Cuando la constante es la primera, el compilador le advertirá si escribe accidentalmente =
lugar de ==
ya que es ilegal asignar un valor a una constante.
Detiene el error single = assignment.
P.ej,
if ( NULL = pMsg ) return rv;
no compilará, donde como
if ( pMsg = NULL) return rv;
compilará y le dará dolores de cabeza
Dijeron, "para evitar la mezcla de asignación y comparación".
En realidad, creo que es una tontería: si eres tan disciplinado que no te olvidas de poner constante en el lado izquierdo, definitivamente no mezclarás ''='' con ''=='', ¿o sí? ;)
Los compiladores que emiten advertencias son buenos, pero algunos de nosotros en el mundo real no podemos permitirnos tratar las advertencias como errores. Invertir el orden de variable y constante significa que este simple deslizamiento siempre aparece como un error y evita la compilación. Te acostumbras a este patrón muy rápidamente, y el error contra el que protege es sutil, que a menudo es difícil de encontrar una vez introducido.
Me olvidé del artículo, pero la cita fue algo así como: "Evidentemente, es más fácil recordar poner la constante primero, que recordar el uso ==";))
Para aclarar lo que escribí en algunos de los comentarios, aquí hay una razón para no hacer esto en el código C ++.
Alguien escribe, digamos, una clase de cadena y decide agregar un operador de const char*
a const char*
:
class BadString
{
public:
BadString(const char* s) : mStr(s) { }
operator const char*() const { return mStr.c_str(); }
bool operator==(const BadString& s) { return mStr == s.mStr; }
// Other stuff...
private:
std::string mStr;
};
Ahora alguien aplica ciegamente el patrón de programación "defensiva" constant == variable
:
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
Esto es, IMO, un problema más insidioso que la asignación accidental porque no se puede decir desde el sitio de llamadas que algo está obviamente mal.
Por supuesto, las lecciones reales son:
- No escriba sus propias clases de cuerdas.
- Evite operadores de conversión implícitos, especialmente al hacer (1).
Pero a veces estás lidiando con API de terceros que no puedes controlar. Por ejemplo, la clase de cadena _bstr_t
común en la programación COM de Windows adolece de este defecto.
Para evitar que escribas:
if ( pMsg = NULL ) return rv;
por error. Sin embargo, un buen compilador le advertirá sobre esto, por lo que la mayoría de las personas no usan la forma "constante primero", ya que les resulta difícil de leer.
Para que no mezcle la comparación (==) con la asignación (=).
Como sabes, no puedes asignar a una constante. Si lo intenta, el compliler le dará un error.
Básicamente, es una de las técnicas de programación defensiva. Para protegerte de ti mismo.