|
|
Bueno, en vista de que muchas personas estan muy avidas de ver mis codigos para criticarme, pues aprovechare para explicar el uso del IF simplificado. Este IF es el unico operador ternario en C++, y su sintaxis es: CONDICION ? expresion-del-then : expresion-del-else
Nos devuelve el valor de la expresion a la que entre segun la condicion, y por lo tanto es muy utilizado en asignaciones.
I.e: A = B > 0 ? B : 0;
Aunque como veremos en este ejemplo, puede utilizarce con funciones, operaciones e incluso una combinacion de ambas o una serie de asignaciones o funciones con el operador COMA.
I.e: A = !m_pSet->IsEOF() ? m_pSet->m_valor : m_pSet->MoveFirst(), m_pSet->m_valor;
El siguiente codigo, es algo muy usual al trabajar con bases de datos. Hacemos una consulta en el registro y si no existen datos, pues "activamos" las ALTAS, en caso contrario, activamos las BAJAS y los CAMBIOS. Se asigna el valor que regresa la funcion de apertura o requery, para en caso de que no lo pueda hacer, indique el error y se salga del programa.
// Asignamos la busqueda al Recordset
m_pSet->m_strFilter.Format("alumno = %ld", clave);
// Realizamos la apertura del Recordset
BOOL flag;
if (m_pSet->IsOpen())
flag = m_pSet->Requery();
else
flag = m_pSet->Open();
// Si algo salio mal, detenemos el programa
if (!flag) {
AfxMessageBox("Error Inesperado en la base de datos, al abrir.");
ExitProcess(1);
return;
}
// Si no existe registro habilitamos las ALTAS
if (m_pSet->IsEOF()) {
Alta = TRUE;
Baja = Camb = FALSE;
}
// Si existe registro habilitamos BAJAS y CAMBIOS
else {
Alta = FALSE;
Baja = Camb = TRUE;
} |
En este otro codigo, hacemos exactamente los mismo, pero omitiendo los IF's inecesarios y utilizando el IF simplificado.
// Asignamos la busqueda al Recordset
m_pSet->m_strFilter.Format("alumno = %ld", clave);
// Realizamos la apertura del Recordset
if (!(m_pSet->IsOpen() ? m_pSet->Requery() : m_pSet->Open())) {
// Si algo salio mal, detenemos el programa
AfxMessageBox("Error Inesperado en la base de datos, al abrir.");
ExitProcess(1);
return;
}
// Si existe registro habilitamos
// BAJAS y CAMBIOS, sino, las ALTAS
Baja = Camb = !(Alta = m_pSet->IsEOF());
|
Observese como el IF simplificado, nos evita la declaracion de la variable FLAG, ya que el valor devuelto por el, sera el que devuelva la funcion Requery u Open, segun sea el caso.
El if de la asignacion de variables, es inecesario completamente, ya que si sabemos la correcta aplicacion de los operadores, no daremos cuenta que el IsEOF, devuelve un tipo BOOL (en caso de que sean bool nuestras variables de ALTA, BAJA y CAMBIO, solo se debera hacer un cast de tipo bool a la funcion), y que la asignacion de ALTA, devolvera el valor de la variable, por lo cual unos parentesis nos ayudaran a NEGAR su valor (ya que las otras variables siempre son lo contrario a alta) para asignar el valor correcto a ALTA y CAMBIO.
Bueno, realmente espero que les haya servido este ejemplo sencillo, el cual realmente ahorra tiempo al momento de programar, le da un toque de abstraccion a nuestro codigo, simplificando su analisis, y por ultimo, reduce tiempos de procesador (aunque muchos diran que con los nuevos procesadores, este tiempo es irrelevante, y tienen razon, pero yo soy un nostalgico de las optimizaciones).
Sin duda mi codigo es a la programacion, lo que "La Persistencia del Tiempo" a la pintura, asi que espero un sin numero de criticas.
Gente en contra del sistema: 1.
Agregado en el expediente de: Son Programatikon
Este wey dijo: Victor Ivan Mendez Castillo |
|