Title: XML Schema
1XML Schema
2Lenguajes de Esquemas
- Esquema definición de estructura de un conjunto
de documentos XML - Validar Chequear que un documento sigue un
esquema - Principal Ventaja Protección de errores
- Otras aplicaciones Edición, compresión, etc.
- DTDs un ejemplo de esquemas (con varias
limitaciones) - XML Schema desarrollo posterior del W3c
- Existen Otros
- RELAX-NG, Schematron, etc.
3CaracterÃsticas de DTDs
- Especifican estructura del documento
- Elementos, atributos, anidamientos, etc.
- Integridad referencial mÃnima (ID, IDREF)
- Mecanismo sencillo de abstracción
- Entidades ? Macros
- Inclusión de documentos externos
- Integrados en XML (Parte de la especificación)
- Sencillos de comprender (? Expresiones regulares)
4Limitaciones de DTDs
- La Sintaxis no es XML (difÃciles de manipular)
- No soportan Espacios de nombres
- No permiten especificar tipos de datos (por
ejemplo enteros, flotantes, fechas, etc. - No permiten especificar secuencias no ordenadas
- ((e1,e2,e3)(e1,e3,e2)(e2,e1,e3)...(e3,e2,e1))
- No hay soporte para declaraciones sensibles al
contexto Los elementos se definen todos a nivel
de documento, ejemplo, contenido con el mismo
nombre cuya estructura cambia en diferentes
contextos - Soporte limitado para Referencias cruzadas, no es
posible formar claves a partir de varios
atributos o de elementos - No son extensibles (una vez definido, no es
posible añadir nuevos vocabularios a un DTD)
5XML SchemaObjetivos de Diseño
- Sintaxis XML
- Soporte para Espacios de Nombres
- Mayor expresividad
- Restricciones numéricas
- Integridad dependientes del contexto
- Tipos de datos
- Gran cantidad de tipos de datos predefinidos
- Creación de tipos de datos por el usuario
- Extensibilidad
- Inclusión/Redefinición de esquemas
- Herencia de tipos de datos
- Soporte a Documentación
6Ejemplo
alumnos.xsd
ltxsschema xmlnsxs"http//www.w3.org/2001/XMLSch
ema" targetNamespace"http//www.uniovi
.es/alumnos" xmlns"http//www.uniovi.e
s/alumnos"gt ltxselement name"alumnos"gt
ltxscomplexTypegt ltxssequencegt ltxselement
name"alumno" minOccurs"1" maxOccurs"200"
type"TipoAlumno"/gt lt/xssequencegt
lt/xscomplexTypegt lt/xselementgt ltxscomplexType
name"TipoAlumno"gt ltxssequencegt
ltxselement name"nombre" type"xsstring"/gt
ltxselement name"apellidos" type"xsstring"/gt
ltxselement name"nacim" type"xsgYear"/gt
lt/xssequencegt ltxsattribute name"dni"
type"xsinteger"/gt lt/xscomplexTypegt lt/xsschema
gt
Elemento raÃz schema y espacio de nombres
determinado
Permite especificar rangos de inclusión
Permite especificar tipos
7Estructura del Schema
- El esquema está formado por
- Elemento raÃz schema del espacio de nombres
- http//www.w3.org/2001/XMLSchema
- Atributo targetNamespace indica el espacio de
nombres que se está definiendo - Subelementos
- Declaraciones globales de elementos y atributos
- Definiciones de tipos de elementos y atributos
- Anotaciones
ltxsschema xmlnsxs"http//www.w3.org/2001/XMLSch
ema" targetNamespace"http//www.uniovi
.es/alumnos" xmlns"http//www.uniovi.e
s/alumnos"gt ltxselement name"alumnos"gt .
. . lt/xselementgt . . . lt/xsschemagt
8Tipos Complejos vs Simples
- Pueden declararse 2 tipos
- Complejos Pueden contener sub-elementos y
atributos
Ejemplo de Tipo Complejo
ltalumno dni9873435gt ltnombregtJoselt/nombregt
ltapellidosgtBuenolt/apellidosgt lt/alumnogt
Simples No contienen sub-elementos ni
atributos Pueden aparecer dentro de elementos o
en valores de atributos
9Validación esquemas e Instancias
- Un documento XML Schema define un conjunto de
documentos con una determinada estructura - Un documento XML puede validarse contra varios
esquemas - Puede asociaciarse explÃcitamente mediante el
atributo schemaLocation - Utiliza 2 cadenas, el espacio de nombres y la URL
del documento - Si no se utiliza espacio de nombres, puede usarse
noNamespaceSchemaLocation
10Validación esquemas e instancias
alumnos.xsd
ltxsschema xmlnsxs"http//www.w3.org/2001/XMLSch
ema" targetNamespace"http//www.uniovi
.es/alumnos" xmlns"http//www.uniovi.e
s/alumnos"gt ltxselement name"alumnos"gt
ltxscomplexTypegt ltxssequencegt ltxselement
name"alumno" minOccurs"1" maxOccurs"200"
type"TipoAlumno"/gt lt/xssequencegt
lt/xscomplexTypegt lt/xselementgt ltxscomplexType
name"TipoAlumno"gt ltxssequencegt
ltxselement name"nombre" type"xsstring"/gt
ltxselement name"apellidos" type"xsstring"/gt
ltxselement name"nacim" type"xsgYear"/gt
lt/xssequencegt ltxsattribute name"dni"
type"xsinteger"/gt lt/xscomplexTypegt lt/xsschema
gt
11Tipos Anónimos vs. con nombre
ltxselement name"alumno"gt ltxssequencegt
ltxselement name"nombre" type"xsstring"/gt
ltxselement name"apellidos" type"xsstring"/gt
lt/xssequencegt lt/xselementgt
legible
ltxselement name"alumno" type"TipoAlumno"/gt
ltxsComplexType name"TipoAlumno"gt
ltxssequencegt ltxselement name"nombre"
type"xsstring"/gt ltxselement
name"apellidos" type"xsstring"/gt
lt/xssequencegt lt/xsComplexTypegt
Reutilizable
12Otra posibilidad Referencias
ltxselement name"alumno"gt ltxssequencegt
ltxselement name"nombre" type"xsstring"/gt
ltxselement name"apellidos" type"xsstring"/gt
lt/xssequencegt lt/xselementgt
ltxselement name"alumnos"gt ltxssequencegt
ltxselement ref"alumno" /gt lt/xssequencegt lt/xsel
ementgt
13Tipos complejos Creación a partir de tipos
simples
ltxselement name"precio"gt
ltxscomplexTypegt ltxssimpleContentgt
ltxsextension base"xsdecimal"gt
ltxsattribute name"moneda" type"xsstring" /gt
lt/xsextensiongt lt/xssimpleContentgt
lt/xscomplexTypegt lt/xselementgt
ltprecio monedaeuros"gt23.45lt/preciogt
14Tipos Complejos Secuencia
- Construcción básica mediante secuencia de
elementos
ltxselement namealumnogt ltxscomplexTypegt
ltxssequencegt ltxselement name"nombre"
type"xsstring"/gt ltxselement
name"apellidos" type"xsstring"/gt
ltxselement name"nacim" type"xsgYear"
minOccurs"0" maxOccurs"1"/gt
lt/xssequencegt ltxsattribute name"dni"
type"xsinteger"/gt lt/xscomplexTypegt lt/xselemen
tgt
ltalumno dni"9399390"gt ltnombregtJuanlt/nombregt
ltapellidosgtGarcÃa GarcÃalt/apellidosgt
ltnacimgt1985lt/nacimgt lt/alumnogt
15Tipos ComplejosAlternativa
- choice Representa alternativas
- OJO Es una o-exclusiva
ltxscomplexType name"Transporte"gt
ltxschoicegt ltxselement name"coche"
type"xsstring"/gt ltxselement name"tren"
type"xsstring"/gt ltxselement name"avión"
type"xsstring"/gt lt/xschoicegt
lt/xscomplexTypegt
lttransportegt ltcochegtRenault R23lt/cochegt lt/transpor
tegt
16Tipos Complejos Contenido Mixto
- El contenido Mixto permite mezclar texto con
elementos
ltxscomplexType name"TCom" mixed"true"gt
ltxschoice minOccurs"0" maxOccurs"unbounded"gt
ltxselement name"emph" type"xsstring"/gt
lt/xschoicegt lt/xscomplexTypegt ltxselement
name"comentarios" type"TCom" /gt
ltcomentariosgt Es un poco ltemphgtlistillolt/emphgt lt/
comentariosgt
17Secuencias no ordenadas
- all Todos los elementos en cualquier orden
- En DTDs requerÃa enumerar las combinaciones
- (A,B,C)(A,C,B)...(C,B,A)
ltxscomplexType name"TipoLibro"gt ltxsallgt
ltxselement name"autor" type"xsstring"/gt
ltxselement name"tÃtulo" type"xsstring"/gt
lt/xsallgt lt/xscomplexTypegt ltxselement
name"libro" type"TipoLibro" /gt
ltlibrogt ltautorgtJuanita la Localt/autorgt
lttÃtulogtNo estoy localt/tÃtulogt lt/librogt
ltlibrogt lttÃtulogtEl kigotelt/tÃtulogt
ltautorgtCerbanteslt/autorgt lt/librogt
18Agrupaciones
- Es posible nombrar agrupaciones de elementos y de
atributos para hacer referencias a ellas
ltxsgroup name"nombApell"gt ltxssequencegt
ltxselement name"nombre" type"xsstring"/gt
ltxselement name"apellidos" type"xsstring"/gt
lt/xssequencegt lt/xsgroupgt
ltxscomplexType name"TipoAlumno"gt ltxsgroup
ref"nombApell" /gt ltxselement name"carrera"
type"xsstring"/gt lt/xscomplexTypegt
19Tipos Simples
- Los tipos simples no pueden contener elementos o
atributos - Pueden ser
- Predefinidos o built-in (Definidos en la
especificación) - Primitivos
- Derivados
- Definidos por el usuario
- Restringiendo facetas de tipos predefinidos
20Tipos simples Primitivos
- string
- boolean
- number, float, double
- duration, dateTime, time, date, gYearMonth,
gYear, gMonthDay, gDay, gMonth - hexBinary, base64Binary
- anyURI
- QName Nombre cualificado con espacio de nombres
- NOTATION Notación binaria (similar a DTD)
21JerarquÃa de tipos
22Creación de nuevos tipos simplesFacetas
- Los nuevos tipos se construyen mediante
restricción de facetas - length, minlength, maxlength Longitud del tipo
de datos - pattern Restricciones sobre valores mediante
expresiones regulares - enumeration Restringe a una determinada
enumeración de valores - whitespace Define polÃtica de tratamiento de
espacios (preserve/replace, collapse) - (max/min)(in/ex)clusive LÃmites
superiores/inferiores del tipo de datos - totaldigits, fractionDigits número de dÃgitos
totales y decimales
23Enumeraciones y Restricciones
ltxssimpleType name"TipoCarrera"gt ltxsrestriction
base"xstoken"gt ltxsenumeration
value"Gestión"/gt ltxsenumeration
value"Sistemas"/gt lt/xsrestrictiongt lt/xssimpleTy
pegt
24Listas
ltxssimpleType name"ComponentesRGB"gt ltxslist
itemType"ComponenteRGB"/gt lt/xssimpleTypegt ltxss
impleType name"ComponenteRGB"gt ltxsrestriction
base"xsnonNegativeInteger"gt ltxsmaxInclusive
value"255" /gt lt/xsrestrictiongt lt/xssimpleTypegt
ltcolorgt255 255 0lt/colorgt
25Uniones
ltxssimpleType name"TipoNota"gt ltxsuniongt
ltxssimpleTypegt ltxsrestriction
base"xsfloat"gt ltxsmaxInclusive
value"10" /gt ltxsminInclusive value"0"
/gt lt/xsrestrictiongt lt/xssimpleTypegt
ltxssimpleTypegt ltxsrestriction
base"xsstring"gt ltxsenumeration value"No
presentado" /gt lt/xsrestrictiongt
lt/xssimpleTypegt lt/xsuniongt lt/xssimpleTypegt ltxs
element name"nota" type"TipoNota" /gt
ltnotagt 5.75 lt/notagt
ltnotagt No presentado lt/notagt
26Expresiones regulares
- Ejemplos de expresiones regulares
ltxssimpleType name"NIF"gt ltxsrestriction
base"xstoken"gt ltxspattern
value"\d7,8A-Z" /gt lt/xsrestrictiongt lt/xssi
mpleTypegt ltxselement name"nif" type"NIF" /gt
ltnifgt9394173Jlt/nifgt
ltnifgt11079845Mlt/nifgt
Expresión
Posibles valores
Elemento 2 b, ab, aab, aaab, xb, yb, zb b,
ab ab, aab, aaab, ax, bx, cx
Elemento \d ab xyzb a?b ab a-cx
27Expresiones Regulares
- a-cx
- 0-9x
- \Dx
- (pa)2rucha
- .abc
- (ab)x
- a1,3x
- \n
- \pLu
- \pSc
- ax, bx, cx
- Carácter ? dÃgito seguido de x
- Carácter ? dÃgito seguido de x
- paparucha
- Cualquier carácter (1) seguido de abc
- ax, bx, aax, bbx, abx, bax,...
- ax, aax, aaax
- Salto de lÃnea
- Letra mayúscula
- SÃmbolo de moneda
28Tipos Derivados por Extensión
- Similar a las subclases de POO Añadir elementos
a un tipo base
ltxscomplexType name"Figura" gt ltxsattribute
name"color" type"Color"/gt lt/xscomplexTypegt ltx
scomplexType name"Rectángulo"gt
ltxscomplexContentgt ltxsextension
base"Figura"gt ltxsattribute name"base"
type"xsfloat" /gt ltxsattribute name"altura"
type"xsfloat" /gt lt/xsextensiongt
lt/xscomplexContentgt lt/xscomplexTypegt ltxscomple
xType name"CÃrculo"gt ...similar pero incluyendo
el radio lt/xscomplexTypegt
29Tipos Derivados por Extensión
- Los tipos derivados pueden utilizarse en los
mismos sitios que la clase base
ltxselement name"figuras"gt
ltxscomplexTypegt ltxssequencegt ltxselement
name"figura" type"Figura"
maxOccurs"unbounded" /gt lt/xssequencegt
lt/xscomplexTypegt lt/xselementgt
ltfigurasgt ltfigura base"23" altura"3"
xsitype"Rectángulo" /gt ltfigura radio"3"
xsitype"CÃrculo" /gt lt/figurasgt
Es necesario especificar el tipo mediante xsitype
30Tipos Abstractos
- Mediante abstract"true" se declara un tipo como
abstracto. - Ese tipo no puede usarse directamente
ltxscomplexType name"Figura" abstract"true"gt
ltxsattribute name"color" type"Color"/gt
lt/xscomplexTypegt
También es posible limitar la derivación de
tipos final"restriction"
31Declaración de Atributos
ltxscomplexType name"CÃrculo"gt ltxsattribute
name"radio" type"xsfloat"
use"required" /gt ltxsattribute
name"color" type"Color"
default"255 0 0"/gt ltxsattribute
name"tipo" type"xsstring"
fixed"jpeg" /gt lt/xscomplexTypegt
Por defecto los atributos son opcionales. Indicar
que son obligatorios use"required"
Valor por defecto de un atributo. PodrÃa
definirse otro valor.
Valor fijo de un atributo. Si no se define, se
utiliza ése. Si se define, debe coincidir.
32Inclusión de Esquemas
- include permite incluir elementos de otros
esquemas - Los elementos deben estar en el mismo espacio de
nombres - Es como si se hubiesen tecleado todos en un mismo
fichero
33Importación de Esquemas
- import permite incluir elementos de otros
esquemas con distintos espacios de nombres
Espacio de nombres P
Espacio de nombres A
Profes.xsd
Alumnos.xsd
ltxsdschema gt ltxsdimport namespace"A"
schemaLocation"Alumnos.xsd"/gt ltxsdimport
namespace"P" schemaLocation"Profes.xsd"/gt
lt/xsdschemagt
Universidad.xsd
34Redefinición de Esquemas
- redefine es similar a include pero permite
modificar los elementos incluidos.
Alumnos.xsd
Añade el elemento nota
ltxsredefine schemaLocation"Alumnos.xsd"gt
ltxscomplexType name"TipoAlumno"gt
ltxscomplexContentgt ltxsextension
base"TipoAlumno"gt ltxssequencegt
ltxselement name"nota" type"Nota" /gt
lt/xssequencegt lt/xsextensiongt
lt/xscomplexContentgt lt/xscomplexTypegt lt/xsred
efinegt
AlumnosConNotas.xsd
35Claves y Unicidad
- Los DTDs proporcionaban el atributo ID para
marcar la unicidad (un valor ID era único en todo
el documento) - XML Schema tiene más posibilidades
- Indicar que un elemento es único (unique)
- Definir atributos únicos
- Definir combinaciones de elementos y atributos
como únicos - Distinción entre unicidad y claves (key)
- Clave además de ser único, debe existir y no
puede ser nulo. - Declarar el rango de un documento en el que algo
es único
36Claves y Unicidad
ltxscomplexType name"Alumnos"gt ltxssequencegt
ltxselement name"Alumno" type"TipoAlumno"/gt
lt/xssequencegt ltxskey name"DNI"gt
ltxsselector xpath"aalumno"/gt ltxsfield
xpath"adni"/gt lt/xskeygt lt/xscomplexTypegt
Es necesario incluir el espacio de nombres (XPath)
La clave puede formarse para atributos y elementos
37Claves y Unicidad
ltxscomplexType name"Alumnos"gt ltxssequencegt
ltxselement name"Alumno" type"TipoAlumno"/gt
lt/xssequencegt ltxsunique name"DNI"gt
ltxsselector xpath"aalumno"/gt ltxsfield
xpath"adni"/gt lt/xsuniquegt lt/xscomplexTypegt
Unique especifica que debe ser único, pero podrÃa
no existir
38Referencias a Claves
keyref especifica que debe hacer referencia a una
clave (Claves Externas)
ltxselement name"clase"gt ltxssequencegt
ltxselement name"alumnos" ... ltxselement
name"delegado" ... lt/xssequencegt ltxskey
name"DNI"gt ltxsselector xpath"aalumnos/aalumn
o"/gt ltxsfield xpath"adni"/gt lt/xskeygt ltxskey
ref name"Delegado" refer"DNI"gt ltxsselector
xpath"adelegado"/gt ltxsfield
xpath"adni"/gt lt/xskeyrefgt
39Valores Nulos
- Indicar que un elemento puede ser nulo sin estar
vacÃo. - VacÃo (Empty) Un elemento sin contenido
- Nulo (Nil) Un elemento que indica que no hay
valor
ltxsdelement name"Persona"gt ltxsdcomplexTypegt
ltxsdelement name"nombre" type"xsdNMTOKEN"/gt
ltxsdelement name"primerApell"
type"xsdNMTOKEN"/gt ltxsdelement
name"segundoApell" type"xsdNMTOKEN"
nillable"true"/gt
lt/xsdcomplexTypegt lt/xsdelementgt
ltpersonagt ltnombregtJohnlt/nombregt
ltprimerApellgtSmithlt/primerApellgt
ltsegundoApell xsinil"true"/gt lt/personagt
40Incluir cualquier contenido...
- any indica cualquier contenido de un determinado
espacio de nombres - anyAttribute cualquier atributo de un espacio de
nombres
ltxscomplexType name"Comentario"gt
ltxssequencegt ltxsany namespace"http//www.w3.o
rg/1999/xhtml" minOccurs"1"
processContents"skip" /gt lt/xssequencegt
ltxsanyAttribute namespace"http//www.w3.o
rg/1999/xhtml"/gt lt/xscomplexTypegt
ltcomentariosgt lthtmlpgtEs un
lthtmlemphgtListillolt/htmlemphgt
lt/htmlpgt lt/comentariosgt
41XML SchemaLimitaciones
- No soporta entidades. Mecanismo para crear macros
- lt!ENTITY texto "Esto texto se repite muchas
veces" gt - Es necesario seguir usando los DTDs ?
- Lenguaje de Restricciones limitado
- Ejemplo Verificar valor total suma de valores
parciales? - Sensibilidad al contexto limitada
- Por ejemplo Especificar que el contenido depende
del valor de un atributo - lttransporte tipo"coche"gt ...lt/transportegt
- lttransporte tipo"avión"gt ...lt/transportegt
- Tamaño de archivos XML Schema puede ser excesivo
- Legibilidad de las especificaciones...XML no
siempre es legible - Complejidad de la especificación
- Muchas situaciones/combinaciones excepcionales
42Esquemas XMLOtras técnicas
- Relax NG. Desarrollado por OASIS a partir de TREX
y RELAX - Soporta mayor número de restricciones y
gramáticas ambigüas - Incluye una sintaxis abreviada (no XML)
- Schematron
- Utiliza un modelo basado en reglas (en vez de
gramáticas) - Asocia reglas de validación a expresiones XPath
- Puede expresar restricciones arbitrarias
- Lenguajes para XML (Encaje de patrones con
expresiones Regulares) - XDuce, CDuce, HydroJ
43Ejercicios
- Herramientas
- xmllint Contiene la opción --schema que valida
contra un esquema - xmllint --schema alumnos.xsd alumnos.xml
- xsv (http//www.ltg.ed.ac.uk/ht/xsv-status.html)
- Herramienta desarrollada en Python
- Funcionamiento a través de Web o en lÃnea de
comandos - Salida en formato XML (difÃcil de leer al
principio)
44Diseño Vocabularios XML
45Diseño Vocabularios XML
- Separación tradicional de dos mundos
- Sistemas orientados a Datos
- Información uniforme y fuertemente estructurada
(ej. Tablas) - Mucha cantidad de información repetida
- Objetivo Procesamiento eficiente (Almacenes de
datos) - Sistemas orientados a Documentación
- Información poco uniforme y entrelazada (ej.
Libros) - No existe un patrón uniforme
- Objetivo Comunicación, Presentación (Mensajes)
- Se podrÃa añadir un tercer mundo
- Programación Orientada a Objetos
- Propuestas para añadir capacidad de programación
a documentos - XML Información semi-estructurada (Lugar
intermedio) - Estructuras jerárquicas entrelazadas
46Orientación del esquemaDatos vs. Documentos
ltfacturagt ltemisióngt23-2-2006lt/emisióngt
ltenvÃogt3-3-2006lt/envÃogt ltdireccióngt
ltnombregtLuis Carolt/nombregt ltcallegtUrÃalt/callegt
ltnumerogt2lt/numerogt ltciudadgtGijónlt/ciudadgt
ltcpgt33021lt/cpgt lt/direccióngt lttlfnogt985102012lt/t
lfnogt lt/facturagt
ltnota fecha23-2-2006gt ltdegtJuan Lopezlt/degt
ltparagtLuis Carolt/paragt ltasuntogtEncargolt/asuntogt
ltmsggt Necesito darte el encargo. Puedes
enviarme un correo a ltemailgtcaro_at_gijon.comlt/ema
ilgt o me llamas al lttlfnogt985102012lt/tlfnogt
lt/msggt lt/notagt
Orientado a Datos
Orientado a Documentos
47Diseño Vocabularios XML
- CaracterÃsticas a tener en cuenta
- Tamaño de documentos
- Facilidad de escritura
- Facilidad de procesamiento
- Flexibilidad (ej. HTML es muy flexible, Bases de
Datos menos) - Consistencia Evitar caracterÃsticas incoherentes
- Nivel de abstracción Buscar término medio en
nivel de detalle - ltfechagt10 Marzo 2003lt/fechagt
- ltfechagtltdÃagt10lt/diagtltmesgtMarzolt/mesgtltañogt2003lt/año
gtlt/fechagt - Patrones de diseño
- www.xmlpatterns.com
48Ejemplo de Discusión
Representación de propiedades
ltpizzagt ltnombregtMargarita lt/nombregt
ltpreciogt6lt/preciogt lt/pizzagt
ltpizza nombre"Margarita" precio6
/gt
49Ejemplo de Discusión
Representación de propiedades
ltpizzagt ltnombregtMargarita lt/nombregt
ltpreciogt6lt/preciogt lt/pizzagt
ltpizza nombre"Margarita" precio6
/gt
En los DTDs Pueden incluirse restricciones
sobre su valor Ej. valor si o no Pueden
definirse valores por defecto Pueden validarse
los valores ID e IDREF Pueden definirse
restricciones sobre espacios en blanco
(NMTOKENS) Ocupan menos espacio Más fáciles de
procesar (SAX y DOM) Acceso a entidades externas
(datos binarios)
Soportan valores arbitrariamente complejos y
repetidos Establecen un orden Soportan atributos
de atributos Mayor flexibilidad ante
modificaciones
50Diseño Vocabularios En resumen...
...Aparición de una nueva torre de Babel...
- Algunos Consejos
- Estudiar dominio de la Aplicación (ver estándares
ya definidos!!!) - Considerar futuras ampliaciones (extensibilidad)
- Validar antes de que sea tarde
- Usar espacios de nombres
- etc. etc.
51