miércoles, 11 de diciembre de 2013

viernes, 6 de diciembre de 2013

Ejercicio de Aplicación

El sistema seleccionado de nuestro entorno fue un RESTAURANT, describiendo así su situación actual y procesos por el cual se desenvuelve dicho sistema, como: 
  • Compra de producto
  • Preparación de alimentos
  • Entrega de dinero
  • Pedido
  • Alimentos no procesados
Ademas se puede observar los entes que conforma este sistema como lo es el dueño, gerente, chef, mesonero, entre otros. 

A continuación se muestra el diagrama de contexto del proceso seleccionado


jueves, 28 de noviembre de 2013

Teoria de la POO

A continuación se mencionan los conceptos establecidos por varios autores sobre la programación orientada a objetos:

"Es muy importante destacar que cuando hacemos referencia a la programación orientada a objetos no estamos hablando de unas cuantas características nuevas añadidas a un lenguaje de programación. Estamos hablando de una nueva forma de pensar acerca del proceso de descomposición de problemas y de desarrollo de soluciones de programación.
La programación orientada a objetos es otra forma de descomponer problemas. Este nuevo método de descomposición es la descomposición en objetos; vamos a fijarnos no en lo que hay que hacer en el problema, sino en cuál es el escenario real del mismo, y vamos a intentar simular ese escenario en nuestro programa." (Introducción a la programación orientada a objetos, Luis R. Izquierdo).

"Para aquel que no es un programador, Orientación a Objetos significa algo bastante familiar: considerar al mundo como un conjunto de entidades u objetos que están relacionados y se comunican entre ellos. Esta es la forma en que la gente normal ve el mundo, así es que este pensamiento tiene intrínsecamente sentido. La Orientación a Objetos se basa en estas ideas: un programa es un mundo que representa un subconjunto del mundo real. La estructura del programa se simplifica en gran medida si cada una de las entidades u objetos del problema que se está modelando corresponde directamente con un objeto que se puede manipular internamente en un programa.
Para el desarrollo de sistemas, la orientación a objetos es un nivel de abstracción de computadora más allá de los procedimientos y los datos. La orientación a objetos anima al desarrollador de sistemas a concentrarse en los temas importantes e ignorar el resto a la hora de la modelación.
El hecho de que el tema central sean los objetos, aunque intuitivamente, marca una desviación significativa de los anteriores paradigmas de la programación. Una ecuación para reconocer una aproximación a la Orientación a Objetos es:

ORIENTACIÓN_OBJETOS = CLASES Y OBJETOS + HERENCIA + COMUNICACIÓN CON MENSAJES" (Programación Orientada a Objetos, Profesor Javier Jiménez Pacheco).

"Cabría aclarar, antes de nada, que prefiero la expresión Orientación-a-Objetos frente a la también muy usada Orientación-al-Objeto. Es una matización semántica en la traducción del término inglés, que pierde la riqueza contextual de la adjetivación en la traducción literal. Dicho esto, entremos en el núcleo del asunto: ¿qué demonios es la OOP (Object-Oriented Programming)? La OOP es, simplificando, un sistema de programación que utiliza objetos para la resolución de problemas, interrelacionándolos mediante mensajes. Imaginemos, por ejemplo, que queremos desarrollar una aplicación para la gestión organizativa de un despacho profesional. En la vida real nos encontraríamos con directores, secretarias, máquinas de escribir, impresoras, etc. Una posible solución en OOP sería trasladar estos objetos al espacio de programación: el objeto teléfono, al sonar, lanzaría un mensaje primero al centro de control y luego a una determinada secretaria mecanizada, la cual, en calidad de objeto, podría responder reteniendo brevemente la llamada y enviando un mensaje de aviso a la operadora correcta. 
De nuevo vemos que no nos movemos con esquemas funcionales derivativos: no existe una función general de llamada telefónica (pueden existir teléfonos digitales, centralitas, etc.). Modelamos nuestra visión del problema a través de objetos, que se relacionan entre sí por pocos canales, de forma que la comunicación de mensajes se pretende alta y clara. En definitiva se pretende que las ligazones entre distintos objetos (o entidades) sean transparentes para el observador exterior. Naturalmente esto favorece sobremanera la comunicación entre los responsables de las distintas etapas de desarrollo de software." (C++/OPP Un enfoque práctico, Ricardo Devis Botella)

Historia y origen de la programación orientada a objetos (POO).
" A partir de la década de los 70 se originó la llamada Crisis del Software debido a una serie de problemas encontrados en el desarrollo de sistemas para computadoras. La crisis también se derivó de la contradicción entre el reciente desarrollo del hardware y su aprovechamiento a través del software, esto es, que se dedicó poco esfuerzo al desarrollo de metodologías para la creación del software, creando un atraso de entre una y dos generaciones entre los microprocesadores y el software que los manipula.
Las respuestas a estos problemas fueron entre otras:
  • Programación estructuradas en los lenguajes de programación.
  • Modularidad y organización de bibliotecas.

Estas mejoras no fueron suficientes para resolver el problema ya que no se consideró:
  • Recursos humanos para el mantenimiento consistente en adaptar el software a nuevos requerimientos imposibles de haber sido planificados inicialmente.
  • Errores del software, esto es, resultados erróneos.
  • Altos costos y tiempo de desarrollo muy largos.
  • El análisis era deficiente, lo cual derivaba cambios y adaptaciones.
  • Problemas de comunicación entre los diferentes módulos al momento de la unión.
  • Sistemas poco flexibles y confiables.
  • Esto ocurre cuando el sistema no cubre las necesidades del usuario final.
  • No proporciona la información que el usuario requiere.
  • Información no confiable.
  • sistema difícil de manipular.

Ante tantos problemas, los especialistas en software llegaron a la conclusión de que en cualquier técnica
que trate de resolver los problemas anteriores, el desarrollo de sistemas deberá contemplar las siguientes
características:
  • Entender el problema y dominarlo.
  • Comunicación entre personas.
  • Prever cambios continuos.
  • Reutilizar el código.

Al mismo tiempo que se da la Crisis del Software, por otro lado la Orientación a Objetos (OO) se empezó a discutir a fines de los años 60 con el desarrollo del lenguaje SIMULA67 por Nygaard y Ole-Johan Dahl en el Centro de Cálculo Noruego, en él, introdujeron los conceptos de clase, subclases y rutinas, muy parecidos los conceptos a los lenguajes orientados a objetos de hoy en día. A mitad de la década de los 70 los científicos del Centro de Investigaciones Palo Alto de XEROX (PARC) (XEROX Palo Alto Research Center) crearon el lenguaje SMALLTALK, el primer lenguaje orientado a objetos consistente y completo. En él cada elemento del lenguaje fue realizado un objeto. Este último lenguaje evolucionó a través de varios lanzamientos realizados por PARC.
A pesar de este movimiento temprano hacia los lenguajes orientados a objetos, sólo se lograron pequeñas incursiones en la comunidad de la programación general. El progreso reciente se ha acelerado debido principalmente a la disponibilidad de las extensiones orientadas a objetos para dos lenguajes populares: C y PASCAL, y a las extensiones prometidas para otros lenguajes comerciales populares como BASIC y COBOL." (Programacion Orientada a Objetos, Javier Jiménez Pacheco).

Características de la POO:
Principio de Abstracción.
           • Datos
           • Procedimientos
Encapsulamiento.
Herencia.
           • Simple
           • Múltiple
Comunicación con mensajes.
Polimorfismo.
Manejo automático de memoria.
           • Constructores
           • Destructores
Métodos virtuales.
Sobreposición de operadores.

Conceptos básicos.

Objeto: un objeto no es más que un conjunto de variables (o datos) y métodos (o funciones) relacionados entre sí. Los objetos en programación se usan para modelar objetos o entidades del mundo real (el objeto hijo, madre, o farmacéutica, por ejemplo). Un objeto es, por tanto, la representación en un programa de un concepto, y contiene toda la información necesaria para abstraerlo: datos que describen sus atributos y operaciones que pueden realizarse sobre los mismos.
Clase: una clase es una plantilla que define las variables y los métodos que son comunes para todos los objetos de un cierto tipo. Una clase consta de métodos y datos que resumen las características comunes de los objetos, incluyendo una descripción de cómo crear un nuevo objeto de la clase. En otras palabras, las clases contienen los anteproyectos para crear objetos.
Método: consiste en la implementación en una clase de un protocolo de respuesta a los mensajes dirigidos a los objetos de la misma. La respuesta a tales mensajes puede incluir el envío por el método de mensajes al propio objeto y aun a otros, también como el cambio del estado interno del objeto. Los métodos están implementados como DEFINICIONES de funciones miembro de una clase, representando el conjunto de mensajes al que los objetos de tal clase pueden responder.
Atributo: es una especificación que define una propiedad de un Objeto, elemento o archivo. También puede referirse o establecer el valor específico para una instancia determinada de los mismos.
Mensaje: representa una acción a tomar por un determinado objeto.un mensaje equivale al PROTOTIPO de una función miembro en la descripción de una clase.
Encapsulamiento: Se refiere al hecho de que ningún programador ni de ninguna otra parte de un programa se pueda tener acceso a los datos de un objeto en forma directa, sino a través de los procedimientos del objeto. Se refiere a la capacidad de agrupar y condensar en un entorno con límites bien-definidos distintos elementos.
Herencia: La herencia es un mecanismo para expresar similaridad entre clases, simplificando definiciones de las clases similares previamente definidas. La herencia permite crear nuevas clases llamadas subclases agregando solamente las diferencias con la clase. En otras palabras la herencia es una partición en subclases más especializadas. El principio en que se basa este concepto es de que las clases que se derivan de otras clase, comparten las características comunes de la clase de la que descienden.
La OOP promueve en gran medida que las relaciones entre objetos se basen en construcciones jerárquicas. Esto es, las clases pueden heredar diferencialmente de otras clases (denominadas "superclases") determinadas características, mientras que, a la vez, pueden definir las suyas propias. Tales clases pasan, así, a denominarse "subclases" de aquéllas. En un esquema simplista basado en grafos de árbol, las clases con las características más generales ocuparían la base de la estructura, mientras que las subclases más especializadas florecerían en los nodos terminales. 
En C++ la herencia se implementa mediante un mecanismo que se denomina derivación de clases: las superclases pasan a llamarse clases base, mientras que las subclases se constituyen en clases derivadas. El mecanismo de herencia está fuertemente entroncado con la reutilización del código en OOP.
Polimorfismo: Por polimorfismo entendemos aquella cualidad que poseen los objetos para responder de distinto modo ante el mismo mensaje. En programación tradicional, debemos crear un nombre distinto para la acción de pintarse, si se trata de un texto o de un marco; en OOP el mismo nombre nos sirve para todas las clases creadas si así lo queremos, lo que suele ser habitual. El mismo nombre suele usarse para realizar acciones similares en clases diferentes. El polimorfismo nos facilita el trabajo, ya que gracias a él, el número de nombres de métodos que tenemos que recordar disminuye ostensiblemente. La mayor ventaja la obtendremos en métodos con igual nombre aplicados a las clases que se encuentran próximas a la raíz del árbol de clases, ya que estos métodos afectarán a todas las clases que de ellas se deriven.

Lenguajes de POO usados en la actualidad
Los lenguajes de programación orientados a objetos tratan a los programas como conjuntos de objetos que se ayudan entre ellos para realizar acciones. Entendiendo como objeto al entidades que contienen datos. Permitiendo que los programas sean más fáciles de escribir, mantener y reutilizar. Los objetos tienen toda la información (atributos) que los diferencia de otros pertenecientes a otra clase. Por medio de unos métodos se comunican los objetos de una misma o diferente clase produciendo el cambio de estado de los objetos. Esto hace que a los objetos se les trate como unidades indivisibles en las que no se separan la información ni los métodos usados en su tratamiento. Los lenguajes de programación orientados a objetos tienen su origen en un lenguaje que fue diseñado por los profesores Ole-Johan Dahl y Kristen Nygaard en Noruega. Este lenguaje de programación orientado a objetos fue el “Simula 67” que fue un lenguaje creado para hacer simulaciones de naves. Los lenguajes de programación orientadas a objetos son lenguajes dinámicos en los que estos objetos se pueden crear y modificar sobre la marcha. Esta programación orientada a objetos (POO) tomo auge a mediados de los años ochenta debido a la propagación de las interfaces gráficas de usuarios, para lo que los lenguajes de programación orientados a objetos están especialmente dotados.
Los principales lenguajes de programación orientados a objetos son:
Ada, C++, C#, VB.NET, Clarion, Delphi, Eiffel, Java, Lexico (en castellano), Objective-C, Ocaml, Oz, PHP, PowerBuilder, Python, Ruby y Smalltalk. (http://www.larevistainformatica.com/lenguajes-programacion-orientada-objetos.htm)
UML
Lenguaje Unificado de Modelado (LUM o UML, por sus siglas en inglés, Unified Modeling Language) es el lenguaje de modelado de sistemas de software más conocido y utilizado en la actualidad; está respaldado por el OMG (Object Management Group). Es un lenguaje gráfico para visualizar, especificar, construir y documentar un sistema. UML ofrece un estándar para describir un "plano" del sistema (modelo), incluyendo aspectos conceptuales tales como procesos de negocio, funciones del sistema, y aspectos concretos como expresiones de lenguajes de programación, esquemas de bases de datos y compuestos reciclados.
Es importante remarcar que UML es un "lenguaje de modelado" para especificar o para describir métodos o procesos. Se utiliza para definir un sistema, para detallar los artefactos en el sistema y para documentar y construir. En otras palabras, es el lenguaje en el que está descrito el modelo. (http://es.wikipedia.org/wiki/Lenguaje_Unificado_de_Modelado).

Herramientas UML

Listas de herramientas disponibles en esta página según su categoría :
  • Herramientas UML generales
  • Herramientas UML textuales
  • Herramientas compatibles con Eclipse UML2
  • Herramientas open source
  • Herramientas para UML ejecutable
  • Herramientas para el modelado UML en la web
  • Herramientas para MACs
  • Herramientas para dispositivos móbiles
  • Herramientas UML para python
  • Herramientas UML para Ruby
  • Herramientas UML para perl
  • He encontrado también las cuentas de twitter para algunas herramientas . Una forma fácil de estar al día de nuevas releases.
Herramientas UML textuales
Podemos encontrar diversas herramientas que permiten la especificación textual de modelos UML (y que automáticamente dibujan el diagrama UML correspondiente). Pueden ser una solución útil en algunos casos. Lista de herramientas de este tipo:
  • yUML es un servicio online para crear diagramas de clase y de casos de uso. Este servicio puede llamarse desde un blog o página web (pasando la descripción textual del modelo a mostrar como parte de la URL) para visualizar automáticamente el modelo indicado.Ahora podemos también generar modelos UML desde otras herramientas UML.
  •  UML Graph dibuja automáticamente diagramas de clase y de secuencia. Para los de clase utiliza la sintaxis Java con anotaciones que después la herramienta convierte a specifications Graphviz. Para los diagramas de secuencia se utiliza un enfoque diferente (y esto es lo que no me gusta de la herramienta, en el fondo son dos distintas): se usan pic macros para definir el diagrama y después el programa pic2plot convierte las macros en archivos gráficos.
  • TextUML Toolkit es otra herramienta reciente. Es un editor open-source que utiliza com visor de UML el proyecto EclipseGraphviz. Soporta básicamente diagramas de clase y un subconjunto de los diagramas de actividades.
  • MetaUML es una librería para visualizar diagramas UML en archivos LaTeX, definidos utilizando una notación textual simple. Soporta diagramas de clase, de actividad y de casos de uso y máquinas de estado.
  • USE también utiliza una notación textual pero en este caso su objetivo es animar el modelo permitiendo la creación de snapshots que sirvan para validar las restricciones OCL que se hayan definido.
  • PlantUML soporta diagramas de clase, de casos de uso y de actividad, aunque no tengo claro si es un proyecto aún activo. Ver también esta descripción más detallada en el blog
  • Simple DSL for sequence diagrams basado en UMLGraph . Utiliza el TXL Programming Language para pasar del DSL a UMLGraph
  • (sólo para fans acérrimos de Latex) Macros de Latex macros para dibujar UML Sequence diagrams , el nombre lo dice todo
  • metaDepth : Herramienta para la definición textual de modelos multi-nivel (es decir, la herramienta no se limita a modelos UML ni está restringida a la arquitectura modelo/metamodelo/metametamodelo típica. Mi resumen aquí ).
  • EasyUML Editor : soporta casi todos los tipos de diagramas UML. Los diagramas se pueden exportar a PDF, PNG o SVG. Se ejecuta como una aplicación web
  • Umple puede también usarse como herramienta de modelado textual para UML
  • Microsoft ha publicado un código de ejemplo para Visual Studio que permite la descripción textual de diagramas de clase, casos de uso y actividades
  • Finite State Machine Diagram Generator: una sintaxis XML muy simple para la definición textual de UML state machines. La herramienta de dibujo está implementada como un servicio web gratuito. La herramienta también permite la generación de código  (Java, C++ and C#) a partir de esos mismos diagramas.
  • seqdiag – generador the imágenes representando diagramas de secuencia a partir de archivos .diag, similares a los .dot (graphviz’s)).

Herramientas UML para Eclipse
Además, también es útil echar un vistazo a la lista de herramientas compatibles con el plug-in Eclipse UML 2 . Como ya comentamos aquí , la amplia adopción de las herramientas para Eclipse podría convertir el formato XMI que usan en un estandar de facto para todas las otras herramientas UML.

Herramientas UML libres y/o Open source:
Finalmente, quiero mencionar también un par de listas de herramientas UML open source (aunque no están completas, por ejemplo UMLet , Moskitt y DiagramDesigner ) no se mencionan)

  • StarUML
  • ArgoUML
  • BOUML
  • Frame UML
  • Tiny UML
Herramientas para UML ejecutable: 
  • Executable UML (leed los nuevos estándares para Executable UML: fuml and Alf) busca definir los modelos UML con suficiente precisión como para permitir su ejecución directa. En su estado más puro, elimina incluso la necesidad de programar. Disponemos ya de varias herramientas para UML ejecutable. Podéis consultar la lista que hemos recopilado hasta el momento aquí.
Herramientas UML específicas para MAC:
  • MacA&D con soporte para los principales diagramas de UML 2.2. y funcionalidades de generación de código para SQL, C++, Objective-C, Java, PHP and REALbasic
  • CanvasUML : para dibujar diagramas de clase
  • Otras herramientas como MagicDraw, VisualParadigm and QuickUML tienen también versión para MAC
Herramientas para dispositivos móbiles:
  • Lucidchart tiene una versión para iPad capaz de reconozer figuras hechas a mano.
  • Draw UML: una herramienta de dibujo UML para el iPad.
  • MagicDraw Reader iPhone Edition . Permite a los usuarios visualizar modelos hechos con MagicDraw desde su iPhone o iPod Touch.
  • Mock4U UML : Como usar Balsamiq para crear mock-ups de modelos UML en el iPhone usando sus templates para iPhone –>
  • iUML : NO es realmente una herramienta de modelado sinó una guía de referencia para llevar en el iPhone y consultar la documentación mientras dibujamos modelos UML.
  • UML Process Aid es otra herramienta para consultar documentación sobre UML en el iPhone.
  • AndyUML: una herramienta Android para el dibujo de diagramas UML
  • astah* UML pad permite la creación de diagramas de clase UML en vuestro iPad. Además, se pueden exportar los modelos para completarlos más tarde utilizando otras de las herramientas de modelado de la misma marca.
Herramientas UML para Python:
  • PyUML es un plug-in de Eclipse open source para la generación (y la ingeniería inversa) de código python a partir de diagramas de clase UML.
  • Epydoc : Genera documentación UML a partir de código python (última actualización en 2008)
  • PyNSource : Ingeniería inversa de código python. El diagrama de clase UML generado se puede mostrar como un diagrama textual ASCII o como gráfico.
  • Lumpy . Módulo Python para generar diagramas UML (actualmente object y class diagrams) a partir de un programa Python en ejecución. Se puede ver como un debugger gráfico que usa UML para mostrar el estado del programa.
  • ObjectDomain : herramienta comercial con soporte para generación de código y ingeniería inversa para Python.
  • argoUML-python parece (parecía?) ir en la misma dirección pero todavía está lejos de ese punto.
  • GraphModels (django-command-extensions) 
  • crea un archivo GraphViz dot “UML-LIKE” para la aplicación seleccionada
  • Pyreverse incluida en Pylint (herramienta para el análisis de la calidad del código python) crea diagramas UML a partir de código
  • pywebuml utiliza graphviz para crear el diagrama de clases UML correspondiente a tu código python (y también funciona con Java y C#).
Herramientas UML para Ruby:
  • RailRoady genera diagramas UML para los modelos y controladores de Rails. Los modelos se muestran como .svg files o con el lenguaje dot . RailRoady se basa en el original RailRoad diagram generator .
  • yUMLMeRails combina RailRoad y yUML para crear diagramas UML online a partir del código RoR
  • Umple (un tipo de herramienta UML textual ) genera código Ruby para las clases del modelo
  • Umlify es un proyecto open source que genera diagramas de clase a partir del código fuente Ruby. Como yUMLMeRails utiliza yUML para visualizar los diagramas.
  • Dentro de las herramientas comerciales Visual Paradigm for UML ofrece generación de código para Ruby
  • Otras iniciativas, como ruby-uml parecen ya abandonadas o tan sólo una declaración de intenciones (como argoUML-ruby).
Herramientas UML para Perl:

UMMF es una implementación hecha en Perl del metamodelo UML capaz de generar también código Perl para un modelo UML dado.