normas de desarrollo de aplicaciones para la dirección general de

Anuncio
DIRECCIÓN GENERAL
DE ORDENACIÓN DEL JUEGO
MINISTERIO DE HACIENDA Y
ADMINISTRACIONES PUBLICAS
S
U
B
D
NORMAS DE DESARROLLO DE APLICACIONES PARA LA
DIRECCIÓN GENERAL DE ORDENACIÓN DEL JUEGO:
JAVA
29/01/2013
Calle Atocha, 3
CORREO ELECTRÓNICO:
28012 MADRID
Página 1 de 17
TEL.:
FAX.:
Ministerio de Hacienda y
Página 2 de 17
Administraciones Públicas
CONTROL DE DOCUMENTACIÓN
TÍTULO DOCUMENTO:
NORMAS
DE
DESARROLLO
DE
APLICACIONES
PARA LA
DIRECCIÓN GENERAL DE ORDENACIÓN DEL JUEGO
HISTÓRICO DE VERSIONES
CÓDIGO
VERSIÓN
FECHA
AUTOR
RESUMEN DE LOS CAMBIOS PRODUCIDOS
1.0
08/01/2013 Héctor Gracia
Versión inicial
2.0
29/01/2013 Héctor Gracia
Se elimina la sección de Base de Datos y se redacta
como documento
HISTÓRICO DE CONTROL DE CALIDAD
PREPARADO
REVISADO
VERSIÓN
NOMBRE
FECHA
NOMBRE
FECHA
Ministerio de Hacienda y
Página 3 de 17
Administraciones Públicas
INDICE
Contents
Histórico de Versiones .............................................................................................. 3
Histórico de Control de Calidad ................................................................................ 3
1
Objetivo ............................................................................................................. 5
2
Introducción ....................................................................................................... 6
3
Normas de Estilo ............................................................................................... 7
4
3.1
Normas de Estilo ......................................................................................... 7
3.2
Criterios de Nomenclatura ........................................................................... 7
Normas de Codificación .................................................................................... 7
4.1
Reglas de PMD ........................................................................................... 7
4.2
Reglas de Checkstyle ................................................................................ 13
5
Inyección de Dependencias............................................................................. 16
6
Documentación del Código ............................................................................. 16
7
Duplicidad de Código ...................................................................................... 17
8
Visualización del Código ................................................................................. 17
Tabla 1- Reglas de Codificación ............................................................................. 12
Tabla 2- Reglas impuestas para la herramienta Checkstyle ................................... 16
Ministerio de Hacienda y
Página 4 de 17
Administraciones Públicas
1 Objetivo
El objetivo del presente documento es presentar las normas a seguir durante el desarrollo
de las aplicaciones informáticas que se desarrollarán para la DGOJ utilizando el lenguaje de
programación Java.
Ministerio de Hacienda y
Página 5 de 17
Administraciones Públicas
2 Introducción
Para un correcto desarrollo de aplicaciones de informáticas, así como para su
mantenimiento y puesta en producción es necesario seguir el conjunto de normas que se
detallan a continuación y que afectan a la codificación, integración e implantación de
dichos sistemas informáticos.
Ministerio de Hacienda y
Página 6 de 17
Administraciones Públicas
3 Normas de Estilo
3.1 Normas de Estilo
De base para todos los criterios de codificación se usarán las recomendaciones de Oracle
recogidos en el documento “Code Conventions for the Java Programming Language”
redactado en su momento por Sun y ahora perteneciente a Oracle. Puede consultarse en el
siguiente enlace: Code Conventions for the Java Programming Language.
Así mismo se utilizará la herramienta CHECKSTYLE para verificar que los desarrollos
cumplen con estos criterios.
3.2 Criterios de Nomenclatura
Los nombres de las tablas, clases, variables, métodos, etc. serán escritos en inglés si se
refieren a aspectos técnicos de la aplicación, y en español si se refieren a aspectos de
negocio que deben ser entendidos por el usuario final.
Los nombres de librerías deberán figurar en minúsculas y se incluirá su número de versión
dentro del fichero MANIFEST.
4 Normas de Codificación
A continuación se exponen las normas de codificación que deberán cumplir los proyectos
desarrollados para la Dirección General de Organización del Juego. Estas normas de
codificación serán chequeadas y validadas mediante las herramientas Sonar y Checkstyle.
4.1 Reglas de PMD
Las reglas de nivel 1 y 2 (errores) tendrán que ser necesariamente cumplidas en todos los
casos, no admitiéndose ninguna infracción salvo permiso expreso de la DGOJ.
Los incumplimientos de reglas de nivel 3 serán analizados por el equipo de Calidad, que
decidirá si están justificados o no.
Regla
IframeMissingSrcAttribute
Nivel
2
ReturnFromFinallyBlock
3
AvoidUsingOctalValues
3
Descripción
Escribir siempre el
elemento src en Iframes
Evitar el “return” desde
un bloque Finally
Al expresar valores
Ministerio de Hacienda y
Página 7 de 17
Administraciones Públicas
ConstructorCallsOverridableMethod
1
AccesorClassGeneration
1
EqualsNull
1
AssignmentToNonFinalStatic
2
CompareObjectsWithEqual
1
PositionLiteralFirstInComparisons
1
UnsynchronizedStaticDateFormatter
1
StringBufferInstantiationWithChar
1
NoHtmlComments
3
DuplicateJspImports
3
UseStringBufferForStringAppends
1
AvoidArrayLoops
1
decimales, no escribir
ceros precedentes, ya que
son tomados como
valores octales
Los constructores no
deben llamar a métodos
sobreescritos
No instanciar por medio
de constructores privados
desde fuera del
constructor de la clase, ya
que causa la generación
de un accesor
No usar equals() para
comparar con null
No asignar valores
variables inseguros a
campos estáticos
Comparar objetos con
equals(), no con ==.
Al hacer comparaciones
de cadenas, posicionar
siempre primero el literal
para evitar
NullPointerException
Sincronizar siempre
SimpleDateFormat a
nivel de método o bloque
Evitar instanciar
StringBuffer con un char,
ya que el char será
convertido a entero y
tomado por el constructor
como tamaño del
StringBuffer
No escribir comentarios
HTML. Los
comentarios JSP sí están
permitidos
Evitar sentencias import
duplicadas en JSPs
Usar StringBuffer y el
método append en lugar
de += para concatenar
cadenas
Usar System.arrayCopy
en lugar de copiar datos
entre dos arrays
Ministerio de Hacienda y
Página 8 de 17
Administraciones Públicas
UnnecesaryConversionTemporary
3
FinalFieldCouldBeStatic
3
CloseResource
3
InstantiationToGetClass
2
AvoidDuplicateLiterals
3
StringInstantiation
2
StringToString
2
InsufficientStringBuffer
3
EJBEntities
2
UnusedPrivateField
2
UnusedLocalVariable
2
UnusedPrivateMethod
2
UnusedFomalParameter
2
EmptyIfStmt
2
Evitar conversiones de
tipos innecesarias
Si un campo final es
asignado a una constante
en tiempo de
compilación, hacerlo
estático
Cerrar siempre los
recursos que lo requieran
(Connection,
Statement…)
No instanciar un objeto
para llamar a GetClass,
usar .class en su lugar
Evitar literales
duplicados, declarar el
String como campo
constante. Esta regla
estará justificada en
sentencias SQL.
No instanciar objetos
String a menos que sea
necesario
No llamar a .toString
desde un objeto String
Evitar en lo posible el
redimensionamiento de
StringBuffer, si se sabe el
tamaño del string
declararlo en el
constructor de
StringBuffer
No se recomienda el uso
de EJBs de entidad
No se permiten campos
privados declarados sin
usar
No se permiten variables
locales declaradas sin
usar
No se permiten métodos
privados declarados
sin usar
No se permiten
parámetros de métodos o
constructores que luego
no se utilicen
No se permiten sentencias
Ministerio de Hacienda y
Página 9 de 17
Administraciones Públicas
EmptyWhileStmt
2
EmptyCatchBlock, EmptyTryBlock,
EmptyFinallyBlock
2
EmptySwitchStatements
2
EmptySynchronizedBlock
2
EmptyStaticInitializer
2
UnconditionalIfStatements
2
EmptyStatementNotInLoop
2
MissingStaticMethodInNonInstatiatableClass
1
NoLongScripts
1
NoScriplets
2
OnlyOneReturn
3
SimplifyBooleanExpression
2
SwitchStmtsShouldHaveDefautl,
DefaultLabelNotLastInSwitchStmt
2
If sin contenido
No se permiten sentencias
While sin contenido. Para
bucles de temporización,
usar thread.Sleep
No se permiten bloques
Try, Catch ni Finally
vacíos
No se permiten sentencias
Switch vacías
No se permiten bloques
de sincronización vacíos
No se permiten
inicializadores estáticos
vacíos
No se permiten sentencias
If que siempre son
verdaderas o falsas
No se permiten sentencias
vacías (punto y coma solo
en una línea) excepto en
bucles
No se permiten clases sin
campos ni métodos
estáticos y con
constructor privado
Scripts de longitud mayor
de 10 líneas deberán
formar parte de Tag
Libraries y no páginas
JSP
Los Scriptlets deberían
estar organizados en Tag
Libreries o declaraciones
JSP, no ser parte de
páginas JSP
Sólo debe existir un único
punto de retorno de un
método (un return), y
debería ser la última
sentencia en el método
Evitar comparaciones
innecesarias en
expresiones booleanas
(sentencias complejas que
podrían simplificarse)
Las sentencias switch
siempre deben tener
Ministerio de Hacienda y
Página 10 de 17
Administraciones Públicas
NonCaseLabelInSwitchStatement
2
MissingBreakInSwitch
1
AvoidReassigningParameters
1
SwitchDensity
2
NonStaticInitializer
1
AvoidCallingFinalize
3
NoInlineStyleInformation
1
NoClassAtribute
1
NoJspForward
1
UseArrayListInsteadOfVector
2
AvoidThreadGroup
AvoidInstanceofChecksInCatchClause
2
4
PreserveStackTrace
2
implementado el caso
default, que debe ir
colocado en último lugar
No usar etiquetas no
relacionadas con switch
en sentencias switch
Debe haber al menos una
sentencia break en cada
sentencia case de switch
En los métodos, no
reasignar valores a los
parámetros
La densidad de sentencias
dentro de cada caso en un
switch no podrá exceder
de 10 líneas
No usar bloques de
código inicializadores
(que se ejecutan
previamente al
constructor)
Excepto autorización
expresa, no se podrá
utilizar el método
finalize() de los objetos
La información de estilo
estará contenida en
archivos CSS y no en
JSPs. Por tanto, no estará
permitido usar
expresiones del estilo
<B>, <FONT>…
No usar el atributo
“class” en las páginas
JSP, usar “styleclass”
para los estilos CSS
No redirigir desde
páginas JSP
No usar la colección
Vector, usar en su lugar
ArrayList
No usar ThreadGroup
Todos los tipos de
excepciones capturadas
deben ser manejadas con
su propia cláusula catch
Al disparar una excepción
Ministerio de Hacienda y
Página 11 de 17
Administraciones Públicas
AvoidCatchingThrowable
SignatureDeclareThrowException
1
1
ExceptionAsFlowControl
1
AvoidCatchingNPE,
AvoidThrowingNullPointerException
1
AvoidThrowingRawExceptionTypes
1
AvoidRethrowingException
1
NPathComplexity
2
ExcessiveMethodLength
3
ExcessiveParameterList
3
ExcessiveClassLength
3
CyclomaticComplexity
2
ExcessivePublicCount
3
desde un bloque catch,
pasar siempre la
excepción original a la
nueva para mantener el
stack trace
No usar Catch Throwable
No usar throws Exception
en la declaración de
método, usar una clase
derivada de
RuntimeException o una
excepción chequeada
No usar las excepciones
como control de flujo
No capturar excepciones
NullPointerException, ni
dispararlas
No disparar tipos de
errores o excepciones
primarias, en su lugar
lanzar subclases de ellas
No relanzar excepciones
desde bloques match
La complejidad NPath de
cada método debe ser
inferior a 300
El número máximo de
líneas permitidas por
método es 100
El número máximo de
parámetros permitidos en
un método es de 10
El tamaño máximo de un
archivo de clase es de
1000
La complejidad
ciclomática de cada
método deberá ser
inferior a 15
El número máximo de
métodos y atributos
públicos declarados en
una clase no podrá
exceder de 45
Tabla 1- Reglas de Codificación
Ministerio de Hacienda y
Página 12 de 17
Administraciones Públicas
4.2 Reglas de Checkstyle
Aparte de las reglas para chequear la existencia de Javadoc (explicadas en el apartado 3
Documentación del Código), se aplicarán una serie de reglas de Checkstyle para comprobar
que el código es mantenible.
En ningún caso se permitirá la existencia de incumplimientos de reglas de nivel Error. En los
casos de Warning, los incumplimientos serán evaluados individualmente por el
departamento de Calidad.
Las reglas aplicadas son:
Regla
AvoidInlineconditionals
AviodNestedBlocks
Nivel
Warning
Warning
BooleanExpression
Complexity
Warning
ClassDataAbstraction
Coupling
Warning
ClassFanOutComplexity
Warning
ConstantName
Error
DesignForExtension
Error
EmptyForInitializerPad
Error
EmptyForIteratorPad
Error
ExplicitInitialization
Error
FallThrough
Error
Descripción
No usar condicionales inline.
No se permiten bloques libres
en el código, por ejemplo int
whichIsWich = 0; { int
whichIsWhich = 2; }
El máximo de operadores
booleanos (&&, || y ^)
permitidos será de 4
El máximo de instancias de
otra clase en una clase dada
será de 10.
El número de clases en la que
una clase dada se apoye será
como máximo de 25.
Las constantes deberán ser
expresadas con todas las letras
en mayúsculas.
Las clases deberán ser
diseñadas para la herencia.
Seguir el principio de OOP:
open/close
Una sentencia “for” siempre
tendrá un valor inicial
Una sentencia “for‟ siempre
tendrá un valor sobre el que
itera
Cualquier clase o objeto
miembro debe estar
explícitamente inicializado al
valor por defecto de según su
tipo (nulo para referencias o
objetos, cero para numéricos y
char, y false para bolean).
Todas las sentencias de un
Ministerio de Hacienda y
Página 13 de 17
Administraciones Públicas
FinalStatic
Error
GenericIllegalRegexp
Error
HiddenField
Warning
IllegalCatch
Warning
IllegalImport
Error
IllegalTokenText
Error
IllegalType
Error
InnerAssignment
Error
switch deben tener su
sentencia de cierre (break,
return, throw o continue)
Todos los campos estáticos
deben declararse como “final‟
No se permiten las llamadas
de tipo:

System.out

System.in

System.err

System.exit
 ex.printStacktrace

Las variables locales y
parámetros de los métodos
deberán tener nombres
diferentes de los campos de la
clase a la que pertenecen.
No se permite hacer catch de
java.lang.Exception,
java.lang.Error o
java.lang.RuntimeException
No se podrán importar los
siguientes paquetes:
 Common-logging


No se permite utilizar las
cadenas:
 C:

SELECT *

LIKE
No se permite la definición de
tipos de la clase
java.sql.CallableStatement
No se pueden asignar
variables en subexpresiones,
por ejemplo String s =
Integer.toString(i = 2);
Ministerio de Hacienda y
Página 14 de 17
Administraciones Públicas
LocalHomeInterface
Warning
LocalInterface
Warning
MagicNumber
Error
MessageBean
Error
ModifiedControlVariable
Error
NestedTryDepth
Warning
OperatorWrap
Error
PackageDeclaration
Error
PackageHtml
Error
PackageName
Error
RemoteHomeInterface
Error
RemoteInterface
Error
SessionBean
Error
ThisParameter
Error
ThisReturn
Error
ThrowsCount
Warning
VisibilityModifier
Warning
Los métodos de una interfaz
local home cumplen los
requerimientos(*)
Los métodos locales no
pueden lanzar la excepción
java.rmi.RemoteException
Sólo se podrá escribir en
forma numérica el 0. El resto
de números deberán ser
declarados como constantes.
Los message beans cumplen
los requerimientos de clase (*)
No se pueden modificar las
variables de control de un
bucle dentro del bucle.
No se pueden anidar más de 2
bloques try-catch-finally.
Las sentencias con operadores
deben estar expresadas de
manera clara (paréntesis,
espacios…)
Los paquetes deben tener
declaración
Todos los paquetes deben
llevar documentación de
paquete (fichero
nombrepaquete.html para
acceder al javadoc)
Los paquetes deberán
llamarse de la forma
es.dgoj.nombrepaquete
Los métodos de una interfaz
remota home cumplen los
requerimientos(*)
Los métodos de una interfaz
remota cumplen los
requerimientos(*)
Los beans de sesión cumplen
los requerimientos de clase (*)
“this‟ no puede ser un
parámetro de métodos ni
constructores
“this‟ no puede ser un valor
de retorno
El máximo de sentencias
throw en un método es de 2
Sólo pueden ser públicos
miembros de tipo “static
Ministerio de Hacienda y
Página 15 de 17
Administraciones Públicas
final‟
Tabla 2- Reglas impuestas para la herramienta Checkstyle
(*) Para
más información de los requerimientos exigidos, consultar la web de Checkstyle (ver
http://checkstyle.sourceforge.net/config_j2ee.html).
5 Inyección de Dependencias
Para reducir de manera significativa el acoplamiento y sobre todo para poder generar
nuevas versiones de las dependencias sin tener que modificar las aplicaciones, se hará
hincapié en la aplicación del principio de inyección de dependencias para los atributos de
las clases en lugar de instanciarlos en los constructores o setters.
Para ello podrá utilizarse el framework de Spring o Weld (JSR-299: The new Java standard
for dependency injection and contextual lifecycle management).
6 Documentación del Código
El código fuente generado deberá estar debidamente documentado mediante Javadoc y
comentarios en el código, prestándose atención a los últimos, pues no se generan
mediante herramientas automáticas, pero son fundamentales para la correcta depuración
de error y mantenimiento del fuente.
Para chequear el contenido de Javadoc, se utilizará el plugin Checkstyle para Eclipse. Se
ejecutarán las siguientes comprobaciones de Checkstyle para confirmar la calidad de toda
la documentación Javadoc:
 PackageHtml: Comprueba que cada fichero java tiene su package.html
correspondiente.

JavadocType: Comprueba que todas las clases, interfaces etc tienen su Javadoc
correspondiente.

JavadocMethod: Comprueba que todos los métodos tienen su Javadoc
correspondiente. También se chequearán las excepciones.

JavadocVariable: Comprueba que todas las variables tienen su Javadoc
correspondiente.

JavadocStyle: Valida los comentarios Javadoc para asegurarse de que están bien
hechos (que no están vacíos, signos de puntuación correctos, etc.)
Ministerio de Hacienda y
Página 16 de 17
Administraciones Públicas
7 Duplicidad de Código
Se auditará el código de forma automática para asegurar que no haya código duplicado. La
herramienta a usar será el modulo CPD asociado con la librería PMD antes mencionada y
tomando como base mínima de duplicación 5 líneas de código fuente (75 tokens).
La existencia de bloques de código duplicado que superen este límite impuesto supondrá
un error que deberá ser solucionado para poder realizar la aceptación del código
entregado.
8 Visualización del Código
Para que el código sea fácilmente legible, las líneas no deben tener más de 80 caracteres
de longitud y un método de una clase no debe constar de más líneas que las que puedan
visualizarse en una pantalla (100 líneas).
Ministerio de Hacienda y
Página 17 de 17
Administraciones Públicas
Descargar