Estandares de Desarrollo de Software Smart Analitycs PDF
Estandares de Desarrollo de Software Smart Analitycs PDF
Estandares de Desarrollo de Software Smart Analitycs PDF
Los estándares son lineamientos, directrices y protocolos que se establecen con el propósito de
normalizar la escritura del código que conforma un desarrollo de software, procurando la
consistencia y reusabilidad del mismo. Emplear un lenguaje claro al definir cada uno de los
elementos de software a través de convenciones permite mantener el código de manera eficaz y
eficiente, así mismo agiliza el proceso de detección de errores toda vez que los estándares sean
claros y se apliquen cabalmente.
Es necesario mencionar que cada desarrollo de software que se ha llevado a cabo sin aplicar ningún
estándar en su construcción, requiere una dedicación especial de recurso humano y de tiempo
debido a que se cuenta solamente con los conceptos aplicados arbitrariamente por el desarrollador
a cargo; este comportamiento constituye una mala práctica en cuanto a construcción de software
debido a que se limita la escalabilidad del sistema y su reusabilidad que son conceptos ampliamente
utilizados al considerar aspectos como calidad y desempeño del software.
1.3. Selección del sistema de notación
Uno de los aspectos más relevantes en la definición del estándar de programación es la selección
del sistema de notación, debido a que este lineamiento rige directamente la escritura del código
fuente del aplicativo. A través de sistema de notación se define la nomenclatura y las convenciones
para cada uno de los elementos de software como son los tipos de datos, funciones, formularios y
demás componentes que conforman un aplicativo.
Notaciones como Reddick, Pascal Casing y Camel Casing son las mas usadas actualmente al construir
soluciones de software; cada una de ellas tiene aspectos particulares pero a través del análisis y
estudio realizado a cada una de ellas se logró concluir que la mas óptima para ser implementada es
la Camel Casing.
La notación Camel Casing presenta características sobresalientes como son: altamente descriptiva,
eficiente, fácil de mantener y muy consistente que se adaptan a las necesidades de la entidad,
considerando que muchos de los desarrollos de software pueden ser empleados de manera
transversal para varias dependencias.
La notación Camel Casing proporciona claridad a través de prefijos del tipo de dato y del contexto
del elemento a definir, esta característica contribuye a entender el código fuente de una manera
más intuitiva sin entrar en el detalle de hacer un seguimiento exhaustivo al código fuente.
Asignar erróneamente un tipo de dato constituye una mala práctica y debe ser corregida para
optimizar los bloques de código que se ejecuten. Esta directriz hace parte de la optimización del
código que busca mejorar la aplicación del estándar.
• Comentarios de inicio.
• Sentencia de paquete.
• Sentencias de importación.
Declaraciones de clases e interfaces.
• Comentarios de inicio
Todo archivo fuente debe comenzar con un comentario que incluya el nombre de la clase,
información sobre la versión del código, la fecha y el copyright. El copyright indica la propiedad legal
del código, el ámbito de distribución, el uso para el que fue desarrollado y su modificación, se debe
especificar que la propiedad del código es Smart Analitycs.
Dentro de estos comentarios iniciales podrían incluirse adicionalmente comentarios sobre los
cambios efectuados sobre dicho archivo (mejora, incidencia, error, etc.). Estos comentarios son
opcionales si los archivos están bajo un sistema de control de versiones bien documentado del cual
se deberá presentar las evidencias necesarias, en caso contrario se recomienda su uso. Estos
comentarios constituyen el historial de cambios del archivo. Este historial es único para cada archivo
y permitirá conocer rápidamente el estado y la evolución que ha tenido el archivo desde su origen.
/*
* @(#)JceSecurity.java 1.50 04/14/2015
*
* Copyright 2020 Smart Analitycs. Todos los derechos reservados.
* SUN PROPRIETARY/CONFIDENTIAL.
*/
/**
* Esta clase crea una instancia de las clases de motores de…
* Registrado en la clase java.security.Security object.
''' <summary>
''' Insertar los datos de la ubicación física para un expediente dado.
''' </summary>
''' <returns></returns>
''' <remarks>
''' '11/01/2011 Modificado Juan Perez
''' </remarks>
• Sentencias de paquete
La primera línea no comentada de un archivo fuente debe ser la sentencia de paquete, que indica
el paquete (Namespace) al que pertenece(n) la(s) clase(s) incluida (s) en el archivo fuente. Por ejemplo
para JAVA
Para JAVA
package javax.crypto;
Para .NET
namespace System.Numerics
• Sentencias de importación
Tras la declaración del paquete se incluirán las sentencias de importación de los paquetes
necesarios. Esta importación de paquetes obligatorios seguirá el siguiente orden:
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import es.provincia.organismo.corporativas.atlas.vo.AgendaVO;
import es.provincia.organismo.atlas.vo.AnuncioVO; import
es.provincia.organismo.atlas.vo.OrganigramaVO;
2.1.2. Declaraciones de clases e interfaces
La siguiente tabla describe los elementos que componen la declaración de una clase o interfaz, así
como el orden en el que deben estar situados.
2.2. Sangría
Como norma general se establecen 4 caracteres como unidad de sangría. Los entornos de desarrollo
integrado (IDE) más populares, tales como Eclipse, NetBeans o Visual Studio .Net, incluyen
facilidades para formatear código Java.
Como norma general se establecen 4 caracteres como unidad de sangría. Los entornos de desarrollo
integrado (IDE) más populares, tales como Eclipse, NetBeans o Visual Studio .Net, incluyen
facilidades para formatear código Java o .Net (C#).
Ejemplos:
unMetodo();
• Comentarios de bloque:
En JAVA
/*
* Esto es un comentario
* de bloque
*/
Para .NET
''' <summary>
''' Selecciona todos los datos de un expediente
''' con base en su codigo de base de datos.
''' </summary>
''' <param name="IdExpediente"></param>
''' <returns></returns>
''' <remarks>
''' Modificado 03/01/2012 Juan Perez
''' Modificado 08/08/2014 Juan Perez
''' </remarks>
• Comentarios de línea:
Son comentarios cortos localizados en una sola línea y tabulados al mismo nivel que el código que
describen. Si ocupa más de una línea se utilizará un comentario de bloque. Deben estar precedidos
por una línea en blanco.
En JAVA
En JAVA
En .NET
2.4. Declaraciones
2.4.1. Una declaración por línea
Se recomienda el uso de una declaración por línea, promoviendo así el uso de comentarios. Ejemplo,
Para JAVA
Para .NET
Dim li_peso(15) As Integer
2.4.2. Inicialización
Toda variable local tendrá que ser inicializada en el momento de su declaración, salvo que su valor
inicial dependa de algún valor que tenga que ser calculado previamente.
Para JAVA
int idUnidad = 1;
Para .NET
2.4.3. Localización
Las declaraciones deben situarse al principio de cada bloque principal en el que se utilicen, y nunca
en el momento de su uso.
La única excepción a esta regla son los índices de los bucles "for", ya que, en Java, pueden incluirse
dentro de la propia sentencia "for".
Para JAVA
Para .NET
For i As Integer = 0 To 14
li_suma += CInt(strNit.Substring(i, 1)) * li_peso(i)
Next
Se debe evitar el uso de declaraciones que oculten a otras declaraciones de ámbito superior.
int variable1;
int variable2;
public ClaseEjemplo() {
variable1 = 0;
variable2 = 1;
}
...
}
Para .NET
Durante el desarrollo de clases / interfaces se deben seguir las siguientes reglas de
formateo:
• No incluir ningún espacio entre el nombre del método y el paréntesis inicial del
listado de parámetros.
• La frase de cierre (End Function) debe quedar al mismo nivel de la frase de inicio
(Public Function) por ejemplo.
….
…..
End Function
2.5. Sentencias
Las sentencias pertenecientes a un bloque de código estarán tabuladas un nivel más a la derecha
con respecto a la sentencia que las contiene.
El carácter inicio de bloque "{" debe situarse al final de la línea que inicia el bloque. El carácter final
de bloque "}" debe situarse en una nueva línea tras la última línea del bloque y alineada con respecto
al primer carácter de dicho bloque.
Todas la sentencias de un bloque deben encerrarse entre llaves "{ ... }", aunque el bloque conste de
una única sentencia. Esta práctica permite añadir código sin cometer errores accidentalmente al
olvidar añadir las llaves. Ejemplo,
Para JAVA
if (condicion) {
variable++;
}
Para .NET
….
End If
Para JAVA
try {
sentencias;
} catch (ClaseException e)
{ sentencias;
Para .NET
Try
For i As Integer = 0 To 14
….
Next
If digito_chequeo >= 2 Then
…
End If
Catch ex As Exception
Entre una palabra clave y un paréntesis. Esto permite que se distingan las llamadas a métodos de
las palabras clave. Por ejemplo:
while (true) {
...
}
Tras cada coma en un listado de argumentos. Por ejemplo:
objeto.unMetodo(a, b, c);
Para separar un operador binario de sus operandos, excepto en el caso del operador ("."). Nunca se
utilizarán espacios entre los operadores unarios (p.e., "++" o "--") y sus operandos. Por ejemplo:
a += b + c;
a = (a + b) / (c + d);
contador++;
Un buen nombre da mucha más información que cualquier otra cosa. Para conseguir buenos
nombres hay que usar nombres descriptivos y claros. Deben ser legibles y evitar codificaciones
complejas.
2.7.1. Paquetes
Se escribirán siempre en letras minúsculas para evitar que entren en conflicto con los nombres de
clases o interfaces. El prefijo del paquete siempre corresponderá a un nombre de dominio de primer
nivel, tal como: es, eu, org, com, net, etc.
Ejemplos:
terabyte.transunion.legalcheck.formateador
java.util.ArrayList
java.util.Date
java.util.Properties
javax.servlet.http.HttpServletRequest
javax.servlet.http.HttpServletResponse
Los nombres serán simples y descriptivos. Debe evitarse el uso de acrónimos o abreviaturas, salvo
en aquellos casos en los que dicha abreviatura sea más utilizada que la palabra que representa (URL,
HTTP, etc.).
Las interfaces se nombrarán siguiendo los mismos criterios que los indicados para las clases. Como
norma general toda interfaz se nombrará con el prefijo "I" para diferenciarla de la clase que la
implementa (que tendrá el mismo nombre sin el prefijo "I").
class Ciudadano
class OrganigramaDAO
class AgendaService
class IAgendaService
2.7.3. Métodos
Los métodos deben ser verbos escritos en minúsculas. Cuando el método esté compuesto por varias
palabras cada una de ellas tendrá la primera letra en mayúsculas.
Los métodos deben ser cortos, hacer una única cosa y mantenerse dentro del mismo nivel de
abstracción. Se deberá reducir al mínimo el número de argumentos y se deberá eliminar toda la
duplicidad. Ejemplos:
2.7.4. Variables
Las variables se escribirán siempre en minúsculas. Las variables compuestas tendrán la primera letra
de cada palabra componente en mayúsculas.
Las variables nunca podrán comenzar con el carácter "_" o "$". Los nombres de variables deben ser
cortos y sus significados tienen que expresar con suficiente claridad la función que desempeñan en
el código (deben ser descriptivos). Debe evitarse el uso de nombres de variables con un sólo
carácter, excepto para variables temporales, deben ser legibles y evitar codificaciones complejas
Unidad unidad;
Agenda agenda;
Tramite tramite;
2.7.5. Constantes
Todos los nombres de constantes tendrán que escribirse en mayúsculas. Cuando los nombres de
constantes sean compuestos las palabras se separarán entre sí mediante el carácter de subrayado
"_".
int LONGITUD_MAXIMA;
int LONGITUD_MINIMA;
El acceso a los atributos de una clase se realizará por medio de los métodos "get" y "set"
correspondientes (propiedades), incluso cuando el acceso a dichos atributos se realice en los
métodos miembros de la clase.
...
}
2.8.3. Constantes
Los valores constantes (literales) nunca aparecerán directamente en el código. Para designar dichos
valores se utilizarán constantes escritas en mayúsculas y se declararán, según su ámbito de uso, o
bien en una Clase de constantes creada para tal efecto, o bien en la clase donde sean utilizadas.
// Uso incorrecto
codigoErrorUsuarioNoEncontrado = 1;
...
switch (error) {
case codigoErrorUsuarioNoEncontrado:
...
}
// Uso correcto
public final int CODIGOERROR_USUARIONOENCONTRADO = 1;
...
switch (error) {
case CODIDOGERROR_USUARIONOENCONTRADO:
...
}
int a = b = c = 2; // Evitar
No utilizar el operador de asignación en aquellos lugares donde sea susceptible de confusión con
el operador de igualdad. Por ejemplo:
// INCORRECTO
if ((c = d++) == 0) { }
// CORRECTO
c = d++;
if (c == 0) { }
c = (c = 3) + 4 + d; // Evitar
Debería escribirse
c = 3;
c = c + 4 + d;
3. Paréntesis
Es una buena práctica el uso de paréntesis en expresiones que incluyan distintos tipos de operadores
para evitar problemas de precedencia de operadores. Aunque la precedencia de operadores nos
pueda parecer clara, debemos asumir que otros programadores no tengan un conocimiento
exhaustivo sobre las reglas de precedencia.
if (w == x && y == z) // INCORRECTO
Los valores de retorno tendrán que ser simples y comprensibles, de acuerdo al propósito y
comportamiento del objeto en el que se utilicen.
// INCORRECTO
public boolean esProgramador(Empleado emp) {
if (emp.getRol().equals(ROL_PROGRAMADOR)) {
return true;
}
else {
return false;
}
}
// CORRECTO
public boolean esProgramador(Empleado emp) {
boolean esUnProgramador = false;
if (emp.getRol().equals(ROL_PROGRAMADOR)) {
esUnProgramador = true;
}
return esUnProgramador;
}
Toda expresión compuesta, por uno o más operadores binarios, situada en la parte condicional del
operador ternario deberá ir entre paréntesis. Ejemplo:
(x >= y) ? x : y;
TODO para comentar posibles mejoras de código, como puedan ser las debidas a optimizaciones,
actualizaciones o refactorizaciones.
5. DOCUMENTACIÓN
Se aconseja, como buena práctica de programación, incluir en la entrega de la aplicación la
documentación de los ficheros fuente de todas las clases. Dicha documentación será generada por
la herramienta "javadoc" ó “NDoc”.
Dentro de los comentarios "javadoc" podremos incluir código html y etiquetas especiales de
documentación. Estas etiquetas de documentación comienzan con el símbolo "@", se sitúan al inicio
de línea del comentario y nos permiten incluir información específica de nuestra aplicación de una
forma estándar.
@author Nombre
@version InformacionVersion
@return Descripción
Inserta la descripción indicada en la sección "Returns:" de la documentación del método. Este tag
debe aparecer en los comentarios de documentación de todos los métodos, salvo en los
constructores y en aquellos que no devuelvan ningún valor (void).
@throws NombreClase Descripción
@see Referencia
@deprecated Explicación
Esta etiqueta indica que la clase, interfaz, método o campo está obsoleto y que no debe utilizarse,
y que dicho elemento posiblemente desaparecerá en futuras versiones. "javadoc" añade el
comentario "Deprecated" en la documentación e incluye el texto explicativo indicado tras la
etiqueta. Dicho texto debería incluir una sugerencia o referencia sobre la clase o método sustituto
del elemento "deprecado".
@since Version
Se utiliza para especificar cuándo se ha añadido a la API la clase, interfaz, método o campo.
Debería incluirse el número de versión u otro tipo de información.
/**
* UnidadOrganizativa.java:
*
* Clase que muestra ejemplos de comentarios de documentación de código.
*
* @author jlflorido
* @version 1.0, 05/08/2008
* @see documento "Normas de programación v1.0"
* @since jdk 5.0
*/
public class UnidadOrganizativa extends PoolDAO {
/**
* Inserta la unidad organizativa en el sistema.
*
* @param unidad Unidad organizativa a insertar
* @throws Exception Excepción elevada durante el proceso de inserción
*/
public void insertarUnidad(UnidadOrganizativa unidad) throws Exception{
try {
conn = this.dameConexion();
pstmt = conn.prepareStatement(sqlSb.toString());
pstmt.setInt(1, unidad.getId());
pstmt.setString(2, unidad.getNombre());
pstmt.executeUpdate();
} catch (Exception e) {
throw e;
} finally {
}
}
}
La documentación generada por "javadoc" será la siguiente: