Buscar este blog

miércoles, 27 de abril de 2011

CONTROL DE VERSIONES (Herramientas,caracteristicas,funcionamiento,clasificacion)

Control de versiones
Una versión, revisión o edición de un producto, es el estado en el que se encuentra dicho producto en un momento dado de su desarrollo o modificación. Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los elementos de algún producto o una configuración del mismo. Los sistemas de control de versiones facilitan la administración de las distintas versiones de cada producto desarrollado, así como las posibles especializaciones realizadas (por ejemplo, para algún cliente específico).
El control de versiones se realiza principalmente en la industria informática para controlar las distintas versiones del código fuente. Sin embargo, los mismos conceptos son aplicables a otros ámbitos como documentos, imágenes, sitios web, etcétera.
Aunque un sistema de control de versiones puede realizarse de forma manual, es muy aconsejable disponer de herramientas que faciliten esta gestión (CVS, Subversion, SourceSafe, ClearCase, Darcs, Bazaar, Plastic SCM, Git, Mercurial, etc.).

 CARACTERISTICAS
Un sistema de control de versiones debe proporcionar:
  • Mecanismo de almacenamiento de los elementos que deba gestionar (ej. archivos de texto, imágenes, documentación...)
  • Posibilidad de realizar cambios sobre los elementos almacenados (ej. modificaciones parciales, añadir, borrar, renombrar o mover elementos)
  • Registro histórico de las acciones realizadas con cada elemento o conjunto de elementos (normalmente pudiendo volver o extraer un estado anterior del producto)
Aunque no es estrictamente necesario, suele ser muy útil la generación de informes con los cambios introducidos entre dos versiones, informes de estado, marcado con nombre identificativo de la versión de un conjunto de ficheros, etcétera.


 CLASIFICACION
La principal clasificación que se puede establecer está basada en el almacenamiento del código:
  • Centralizados: existe un repositorio centralizado de todo el código, del cual es responsable un único usuario (o conjunto de ellos). Se facilitan las tareas administrativas a cambio de reducir flexibilidad, pues todas las decisiones fuertes (como crear una nueva rama) necesitan la aprobación del responsable. Algunos ejemplos son CVS y Subversion
  • Distribuidos: cada usuario tiene su propio repositorio. No es necesario tomar decisiones centralizadamente. Los distintos repositorios pueden intercambiar y mezclar revisiones entre ellos. Ejemplos: Git y Mercurial

FUNCIONAMIENTO

 

Todos los sistemas de control de versiones se basan en disponer de un repositorio, que es el conjunto de información gestionada por el sistema. Este repositorio contiene el historial de versiones de todos los elementos gestionados.
Cada uno de los usuarios puede crearse una copia local duplicando el contenido del repositorio para permitir su uso. Es posible duplicar la última versión o cualquier versión almacenada en el historial. Este proceso se suele conocer como check out o desproteger. Para modificar la copia local existen dos semánticas básicas:
  • Exclusivos: para poder realizar un cambio es necesario marcar en el repositorio el elemento que se desea modificar y el sistema se encargará de impedir que otro usuario pueda modificar dicho elemento.
  • Colaborativos: en el que cada usuario se descarga la copia, la modifica, y el sistema automáticamente combina las diversas modificaciones. El principal problema es la posible aparición de conflictos que deban ser solucionados manualmente o las posibles inconsistencias que surjan al modificar el mismo fichero por varias personas no coordinadas. Además, esta semántica no es apropiada para ficheros binarios.
Tras realizar la modificación es necesario actualizar el repositorio con los cambios realizados. Habitualmente este proceso se denomina publicar, commit, check in o proteger.

Vocabulario Comun

 

La terminología empleada puede variar de sistema a sistema, pero a continuación se describen algunos términos de uso común.


Repositorio
El repositorio es el lugar en el que se almacenan los datos actualizados e históricos, a menudo en un servidor. A veces se le denomina depósito o depot. Puede ser un sistema de archivos en un disco duro, un banco de datos, etc..
Módulo
Conjunto de directorios y/o archivos dentro del repositorio que pertenecen a un proyecto común.
Rotular ("tag")
Darle a alguna versión de cada uno de los ficheros del módulo en desarrollo en un momento preciso un nombre común ("etiqueta" o "rótulo") para asegurarse de reencontrar ese estado de desarrollo posteriormente bajo ese nombre. En la práctica se rotula a todos los archivos en un momento determinado. Para eso el módulo se "congela" durante el rotulado para imponer una versión coherente. Pero bajo ciertas circunstancias puede ser necesario utilizar versiones de algunos ficheros que no coinciden temporalmente con las de los otros ficheros del módulo.
Revisión ("version")
Una revisión es una versión determinada de un archivo.
Línea base ("Baseline")
Una revisión aprobada de un documento o fichero fuente, a partir del cual se pueden realizar cambios subsiguientes.
Abrir rama ("branch") o ramificar
Un módulo puede ser branched o bifurcado en un momento de tiempo de forma que, desde ese momento en adelante, dos copias de esos ficheros puedan ser desarrolladas a diferentes velocidades o de diferentes formas, de modo independiente. El módulo tiene entonces 2 (o más) "ramas".
Desplegar ("Check-out") ("checkout", "co")
Un despliegue crea una copia de trabajo local desde el repositorio. Se puede especificar una revisión concreta, y por defecto se suele obtener la última.
"Publicar" o "Enviar"("commit", "check-in", "ci", "install", "submit")
Un commit sucede cuando una copia de los cambios hechos a una copia local es escrita o integrada sobre repositorio.
Conflicto
Un conflicto ocurre en las siguientes circunstancias:
  • los usuarios X e Y despliegan versiones del archivo A en que las líneas n1 hasta n2 son comunes.
  • el usuario X envía cambios entre las líneas n1 y n2 al archivo A
  • el usuario Y no actualiza el archivo A tras el envío del usuario X
  • el usuario Y realiza cambios entre las líneas n1 y n2
  • el usuario Y intenta posteriormente enviar esos cambios al archivo A
El sistema es incapaz de fusionar los cambios. El usuario Y debe resolver el conflicto combinando los cambios, o eligiendo uno de ellos para descartar el otro.
Resolver
El acto de la intervención del usuario para atender un conflicto entre diferentes cambios al mismo documento.
Cambio ("change", "diff", "delta")
Un cambio representa una modificación específica a un documento bajo control de versiones. La granularidad de la modificación considerada un cambio varía entre diferentes sistemas de control de versiones.
Lista de cambios ("changelist", "change set", "patch")
En muchos sistemas de control de versiones con commits multi-cambio atómicos, una lista de cambios identifica el conjunto de cambios hechos en un único commit. Esto también puede representar una vista secuencial del código fuente, permitiendo que el fuente sea examinado a partir de cualquier identificador de lista de cambios particular.
Exportación ("export")
Una exportación es similar a un check-out, salvo porque crea un árbol de directorios limpio sin los metadatos de control de versiones presentes en la copia de trabajo. Se utiliza a menudo de forma previa a la publicación de los contenidos.
Importación ("import")
Una importación es la acción de copia un árbol de directorios local (que no es en ese momento una copia de trabajo) en el repositorio por primera vez.
Integración o fusión ("merge")
Una integración o fusión une dos conjuntos de cambios sobre un fichero o un conjunto de ficheros en una revisión unificada de dicho fichero o ficheros.
·         Esto puede suceder cuando un usuario, trabajando en esos ficheros, actualiza su copia local con los cambios realizados, y añadidos al repositorio, por otros usuarios. Análogamente, este mismo proceso puede ocurrir en el repositorio cuando un usuario intenta check-in sus cambios.
·         Puede suceder después de que el código haya sido branched, y un problema anterior al branching sea arreglado en una rama, y se necesite incorporar dicho arreglo en la otra.
·         Puede suceder después de que los ficheros hayan sido branched, desarrollados de forma independiente por un tiempo, y que entonces se haya requerido que fueran fundidos de nuevo en un único trunk unificado.
Integración inversa
El proceso de fundir ramas de diferentes equipos en el trunk principal del sistema de versiones.
Actualización ("sync" ó "update")
Una actualización integra los cambios que han sido hechos en el repositorio (por ejemplo por otras personas) en la copia de trabajo local.
Copia de trabajo
La copia de trabajo es la copia local de los ficheros de un repositorio, en un momento del tiempo o revisión específicos. Todo el trabajo realizado sobre los ficheros en un repositorio se realiza inicialmente sobre una copia de trabajo, de ahí su nombre. Conceptualmente, es un cajón de arena o sandbox.
Congelar
Congelar significa permitir los últimos cambios (commits) para solucionar las fallas a resolver en una entrega (release) y suspender cualquier otro cambio antes de una entrega, con el fin de obtener una versión consistente. Si no se congela el repositorio, un desarrollador podría comenzar a resolver una falla cuya resolución no esta prevista y cuya solución dé lugar a efectos colaterales imprevistos.
Herramientas
Existen actualmente en el mercado una enorme cantidad de herramientas para realizar Control De Versiones.

martes, 5 de abril de 2011

Diagrama de Clases de Uos


Clase
 
Relaciones
 
Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A
través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.).
En UML, una clase es representada por un rectángulo que posee tres divisiones:



En donde:

* Superior
 
* Intermedio
  : Contiene los métodos u operaciones, los cuales son la forma como interactúa el objeto con su
* Inferior
entorno (dependiendo de la visibilidad: private, protected o public).
Ejemplo:

Una Cuenta Corriente que posee como característica:
          Balance
Puede realizar las operaciones de:
          Depositar
          Girar
          y Balance
El diseño asociado es:
* Atributos:

Los atributos o características de una Clase pueden ser de tres tipos, los que definen el grado de comunicación y visibilidad de ellos con el entorno, estos son:
public :accsesible desde todos lados. 
private lo pueden accesar)
protected accesado por métodos de la clase además de las subclases que se deriven (ver herencia).

Los métodos u operaciones de una clase son la forma en como ésta interactúa con su entorno, éstos pueden
tener las características:

public : accsesible desde todos lados.
private  de la clase lo pueden accesar).
protected 
accesado por métodos de la clase además de métodos de las subclases que se deriven (ver herencia).
Indica que el método será visible tanto dentro como fuera de la clase, es decir, es : Indica que el método sólo será accesible desde dentro de la clase (sólo otros métodos : Indica que el método no será accesible desde fuera de la clase, pero si podrá ser
Métodos:

Indica que el atributo será visible tanto dentro como fuera de la clase, es decir, es : Indica que el atributo sólo será accesible desde dentro de la clase (sólo sus métodos : Indica que el atributo no será accesible desde fuera de la clase, pero si podrá ser
Atributos y Métodos:


Relaciones entre Clases:
Ahora ya definido el concepto de Clase, es necesario explicar como se pueden interrelacionar dos o más clases (cada uno con características y objetivos diferentes).
Antes es necesario explicar el concepto de cardinalidad de relaciones: En UML, la cardinalidad de las relaciones
indica el grado y nivel de dependencia, se anotan en cada extremo de la relación y éstas pueden ser:
* uno o muchos
*1..* (1..n)
* 0 o muchos
* número fijo
 
Herencia (Especialización/Generalización)




Agregación
  : Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta (el Objeto base se contruye a partir del objeto incluido, es decir, es "parte/todo").
* Por Valor
condicionado por el tiempo de vida del que lo incluye. Este tipo de relación es comunmente llamada

Composición
   Es un tipo de relación dinámica, en donde el tiempo de vida del objeto incluido esAgregación (el objeto 
Por Referencia
independiente del que lo incluye. Este tipo de relación es comunmente llamada
base utiliza al incluido para su funcionamiento).

Un Ejemplo es el siguiente:
En donde se destaca que:

* Un Almacen posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias).

* Cuando se destruye el Objeto Almacen también son destruidos los objetos Cuenta asociados, en
cambio no son afectados los objetos Cliente asociados.

* La composición (por Valor) se destaca por un rombo relleno.

* La agregación (por Referencia) se destaca por un rombo transparente.

La flecha en este tipo de relación indica la navegabilidad del objeto refereniado. Cuando no existe este tipo
de particularidad la flecha se elimina.

Asociacion: 
La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre si. Cabe
destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro.

Ejemplo:
Un cliente puede tener asociadas muchas Ordenes de Compra, en cambio una orden de compra solo puede
tener asociado un cliente.
Dependencia o Instanciación (uso)
Representa un tipo de relación muy particular, en la que una clase es instanciada (su instanciación es
dependiente de otro objeto/clase). Se denota por una flecha punteada.

El uso más particular de este tipo de relación es para denotar la dependencia que tiene una clase de otra,
como por ejemplo una aplicación grafica que instancia una ventana (la creación del Objeto Ventana esta
condicionado a la instanciación proveniente desde el objeto Aplicacion):
Cabe destacar que el objeto creado (en este caso la Ventana gráfica) no se almacena dentro del objeto que lo crea (en este caso la Aplicación).

Casos Particulares
* Clase Abstracta
Una clase abstracta se denota con el nombre de la clase y de los métodos con letra "itálica". Esto indica que
la clase definida no puede ser instanciada pues posee métodos abstractos (aún no han sido definidos, es decir, sin implementación). La única forma de utilizarla es definiendo subclases, que implementan los métodos abstractos definidos.

Clase parametrizada:

Una clase parametrizada se denota con un subcuadro en el extremo superior de la clase, en donde se
especifican los parámetros que deben ser pasados a la clase para que esta pueda ser instanciada. El ejemplo
más típico es el caso de un Diccionario en donde una llave o palabra tiene asociado un significado, pero en
este caso las llaves y elementos pueden ser genéricos. La genericidad puede venir dada de un Template
(como en el caso de C++) o bien de alguna estructura predefinida (especialización a través de clases).

En el ejemplo no se especificaron los atributos del Diccionario, pues ellos dependerán exclusivamente de la
implementación que se le quiera dar.
Ejemplo

 
::
:
Para modelar objetos complejos, n bastan los tipos de datos básicos que proveen los lenguajes: enteros, reales y secuencias de caracteres. Cuando se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicación, tenemos dos posibilidades:

0..* (0..n)