Errores que hay evitar al redactar especificaciones
===================================================
(***) En la especificación se habla del QUÉ
SI==> /// Ordena el vector \c "V[]" de dimensión \c "n"
void Sort( unsigned n, T V[] );
(***) Es un error hablar del CÓMO en la especificación
NO==> /// Intercambia los valores hasta que ya no están desordenados
void Sort( unsigned n, T V[] );
(***) En la especificación no se habla del Rep
NO==> /// Agrega el nodo al final
void list::push_back( const T& v );
(***) Es un error hablar del Rep cuando se redacta la especificación
NO==> /// Si m_last!=0
borra el nodo del frente
void list::pop_front();
SI==> /// Elimina el primer valor del contenedor
/// \pre !empty()
void list::pop_front();
(***) Si la clase "lista" contiene "nodos" en su parte privada es incorrecto
hablar de "nodos" en la especificación.
(***) Si la clase "lista" usa "punteros" en su parte privada es incorrecto
hablar de "punteros" en la especificación.
(***) Es un error hablar de la implementación cuando se redacta la especificación
NO==> /// Usa cirugía de punteros para poner al último nodo de primero
void list::z_splice();
SI==> /// Traslada el último valor de \c "*this" y lo coloca de primero
/// \remark No copia el valor
/// \pre !empty()
void list::z_splice();
(***) Es incorrecto omitir información que el programador cliente necesita
para poder usar la clase, método o función.
(***) Debe incluir suficiente información para que el programador cliente
pueda usar la clase, método o función.
NO==> /// Esta función traslada valores de la lista
/// void z_splice();
SI==> /// Traslada el último valor de \c "*this" y lo coloca de primero
/// \remark No copia el valor
/// \pre !empty()
void list::z_splice();
(***) Es incorrecto mencionar los campos privados del Rep de una clase
en la especificación de cualquiera de sus métodos.
NO==> /// Si m_first!=0
borra el nodo del frente
void list::pop_front();
SI==> /// Elimina el primer valor del contenedor
/// \pre !empty()
void list::pop_front();
(***) Es un error omitir los parámetros al hacer la especificación
NO==> /// Agrega valores a la lista
void push_back( list& L, T v );
(***) Es obligatorio incluir los parámetros en la especificación
SI==> /// Agrega una copia del valor \c "v" al final de \c "L"
void push_back( list& L, const T& v );
(***) Es un error omitir el prototipo al hacer la especificación
(***) Es obligatorio incluir el prototipo en la especificación
NO==> /// Agrega una copia del valor \c "v" al final de \c "L"
SI==> /// Agrega una copia del valor \c "v" al final de \c "L"
void push_back( list& L, const T& v );
(***) Es un error confundir métodos y funciones
NO==> /// \remark push_back() es una función...
void list::push_back( const T& v );
SI==> /// \remark push_back() es un método...
void list::push_back( const T& v );
NO==> /// \remark push_back() es un método...
void push_back( list& L, const T& v );
SI==> /// \remark push_back() es una función...
void push_back( list& L, const T& v );
(***) Las funciones no son métodos porque no tienen un parámetro "this"
(***) Los métodos no son funciones porque si tienen su parámetro "this"
(***) En las especificaciones sí es conveniente incluir un ejemplo de uso
/** Calcula el Máximo Común Divisor de los números \c "x" y \c "y".
- mcd(x,y) >= 1
siempre.
- MCD <==> GCD: Greatest Common Divisor .
\pre
(y != 0)
\remark
Se usa el algoritmo de Euclides para hacer el cálculo.
\par Ejemplo:
\code
2*3*5 == mcd( 2*2*2*2 * 3*3 * 5*5, 2*3*5 )
30 == mcd( 3600, 30 )
\endcode
*/
long mcd(long x, long y);