jueves, 6 de marzo de 2014

Para los principiantes en c# lo primero que deben saber es que c# es un lenguaje de programacion orientado a objectos por lo tanto lo primero que hay que aprender son los conseptos de OOP.


La Programación Orientada a Objetos (POO)
(1)
Es un paradigma de programación que emplea objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento.
El término de Programación Orientada a Objetos se refiere más una forma de diseño y una metodología de desarrollo de software que un lenguaje de programación, ya que en realidad se puede aplicar el Diseño Orientado a Objetos (En inglés abreviado OOD, Object Oriented Design), a cualquier tipo de lenguaje de programación.
La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación.

(2)
El (OOP) no es nuevo, lenguajes clásicos como SmallTalk se basan en ella. Dado que la OOP. se basa en la idea natural de la existencia de un mundo lleno de objetos y que la resolución del problema se realiza en términos de objetos, un lenguaje se dice que está basado en objetos si soporta objetos como una característica fundamental del mismo.

(3)
La programación orientada a objetos es una “filosofía”, un modelo de programación, con su teoría y su metodología. Un lenguaje orientado a objetos es un lenguaje de programación que permite el diseño de aplicaciones orientadas a objetos.

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.

Los lenguajes orientados a objetos, como es el caso de C++ y Java, el elemento básico no es la función (programación tradicionales no orientados ), sino un ente denominado precisamente objeto. Un objeto es 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 .

(4)
La programación orientada a objeto (OOP) es un enfoque al desarrollo de software en la cual la estructura del software se basa en la interacción de objetos para lograr realizar la(s) tarea(s) requeridas. La interacción se realiza mediante el envío y recepción de mensajes entre objetos. Como respuesta a los mensajes, un objeto puede ejecutar una acción o método.

Historia.
El concepto de programación orientada a objeto comienza a concretizare a mediados de la década de los 60 con el lenguaje de programación llamado Simula y su futura evolución en los 70 llamada Smalltalk.

Características de la OOP

No existe un consenso aceptado por todo el mundo respecto a cuáles son las características que definen la POO, pero al menos todos coinciden en las siguientes  cincos:
1.           Abstracción.
2.           Encapsulación.
3.           Polimorfismo.
4.           Herencia.
5.           Agregación.

Objeto.
Es una estructura que incorpora datos y procedimientos para trabajar con dichos datos. Para actualizar o consultar los datos en el objeto, esto debe de realizarse mediante el mismo objeto.
Cabe aclarar que cada objeto tiene una identidad única.


Abstracción.
En programación, el término se refiere al énfasis en el "¿qué hace?" más que en el "¿cómo lo hace?" (característica de caja negra). El común denominador en la evolución de los   lenguajes de programación, desde los clásicos o imperativos hasta los orientados a objetos, ha sido el nivel de abstracción del que cada uno de ellos hace uso.
Los lenguajes de programación son las herramientas mediante las cuales los diseñadores de lenguajes pueden implementar los modelos abstractos. La abstracción ofrecida por los lenguajes de programación se puede dividir en dos categorías: abstracción de datos (pertenecientes a los datos) y abstracción de control (perteneciente a las estructuras de control).

Pero ¿qué es realmente la abstracción? Podemos concluir que es la habilidad de dividir o separa elementos de un todo complejo para así poder verlo de forma simple (Divides y vencerás).
La abstracción modela un problema real construyendo una representación que puede ser procesado computacionalmente.

El modelo define una vista abstracta del problema. Esto implica que el modelo solo se enfoca en la materia relativa al problema.

Cómo se piensa en objetos
Pensar en términos de objetos es parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a pensar en un carro para tratar de modelarlo en un esquema de POO. Podemos decir  que el carro es el elemento principal que tiene una serie de características, como podrían ser  el modelo, cantidad de puertas,  o la marca. Además tiene una serie de funcionalidades asociadas, como:  ponerse en marcha, parar o estacionar.
En un esquema POO el carro sería el objeto, las propiedades serían las características como el modelo, la cantidad de puertas y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar.
La programación orientada a objetos, intenta simular (modelar) el mundo real a través del significado de objetos que contiene características y funciones. Los lenguajes orientados a objetos se clasifican como lenguajes de quinta generación.
El modelo debe definir los objetos de software, identificados con sus atributos y respectivas operaciones.

El lenguaje de modelado de objetos es un conjunto estandarizado de símbolos y de modos de disponerlos para modelar (parte de) un diseño de software orientado a objetos
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.


Encapsulado (conocida como ocultamiento).
         (1)
Proceso mediante el cual se garantiza no acceder directamente a los datos. Si es requerido accesar a los datos entonces se debe de interactuar con el objeto responsable por los datos.

Si el objeto permite accesar los datos para que estos puedan ser : consultado, modificados, el mismo debe de disponer de los mecanismos ( métodos ) para realizar dichas operaciones.

El encapsulado de datos permite hace que el sistema sea mas seguro y confiable.

(2)
Se encarga de mantener ocultos los datos y procesos internos que necesita para hacer lo que se requiere, dándole al programador acceso sólo a lo necesario. Esto nos da dos  ventajas iniciales:
1.    Controlar internamente lo que el usuario hace, evitando fallas por una intervención indeseada (quieres que tú mejor amigo, que no tiene ni idea de mecánica, abra el motor de tu carro y empiece a jugar al mecánico para reparar  tu carro ?).
2.    La segunda ventaja es que, al hacer que la mayor parte del código esté oculto, puedes hacer cambios y/o mejoras sin que eso afecte el modo como los usuarios van a utilizar tu código. Sólo tienes que mantener igual la forma de acceder a él.
Polimorfismo.
         (1)
Es la habilidad de dos diferentes objetos a responder al mismo mensaje de la forma definida por cada uno de estos.

Implementación de varios métodos con el mismo nombre ( sobrecarga / overloading)

(2)
Capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación ( sobrecarga / overloading). Un objeto polimórfico es una entidad que puede contener valores de diferentes tipos durante la ejecución del programa.

Dicho de otra forma, el polimorfismo consiste en conseguir que un objeto de una clase se comporte como un objeto de cualquiera de sus subclases, dependiendo de la forma de llamar a los métodos de dicha clase o subclases.
        
Herencia.
La mayoría de los objetos son clasificados acorde a su jerarquía. Ejemplo,
Description: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTAJx3DWjV7ZAMdOiINzX2a4ce9JGJJwW8Rxu14LK3rWRUzuHBssg

Podemos clasificar todas las figuras con características con sus características comunes como: área,
        
Agregación (tiene-un).
(1)
Composición de un objeto por otros. Es una relación más débil que la que existe entre el atributo y el objeto al cual pertenece, y más fuerte que una asociación.

(2)
Es cuando un objeto consiste de una composición de otros objetos que trabajan en conjunto.

Para recordar.
Cuando se escribe un programa en un lenguaje orientado a objetos, definimos una plantilla o clase que describe las características y el comportamiento de un conjunto de objetos similares. La clase automóvil describe las características comunes de todos los automóviles: sus atributos y su comportamiento. Los atributos o propiedades se refieren a la marca o fabricante, el color, las dimensiones, si tienen dos, tres, cuatro o más puertas, la potencia, si utiliza como combustible la gasolina o gasoil, etc. El comportamiento se refiere a la posibilidad de desplazarse por una carretera, frenar, acelerar, cambiar de marcha, girar, etc.
Una clase es por tanto una plantilla implementada en software que describe un conjunto de objetos con atributos y comportamiento similares.
Una instancia u objeto de una clase es una representación concreta y específica de una clase y que reside en la memoria del ordenador.

Atributos
Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
Los atributos serán característica, cualidad, propiedad, particularidad, peculiaridad, singularidad, rasgo, marca, carácter, idiosincrasia, naturaleza o condición del objeto;

Estado.
Esta compuesto de datos o informaciones; serán uno o varios atributos a los que se habrán asignado unos valores concretos (datos).

Comportamiento
El comportamiento de los objetos de una clase se implementa mediante funciones miembro o métodos. Un método es un conjunto de instrucciones que realizan una determinada tarea y son similares a las funciones de los lenguajes estructurados.
Del mismo modo que hay variables de instancia y de clase, también hay métodos de instancia y de clase. En el primer caso, un objeto llama a un método para realizar una determinada tarea, en el segundo, el método se llama desde la propia clase.
Operaciones que se pueden realizar sobre un objeto: aunque existe gran cantidad de operaciones que se pueden realizar sobre un objeto, generalmente se dividen en tres grandes grupos:

Operaciones que manipulan los datos de alguna forma específica ( añadir, borrar, cambiar formato, …);

Operaciones que realizan un cálculo o proceso;

Operaciones que comprueban (monitorizan) un objeto frente a la ocurrencia de algún suceso de control;


Objeto de software; Dominio del objeto real, proceso de abstracción, dominio de la aplicación.;


OJO->  Identificar objetos a su alrededor y especificar los atributos más relevantes conjuntamente con su comportamiento.




Clase:
 ¿Qué es una clase?
Es la generalización de un tipo específico de objetos, pero cada objeto construido a partir de dicha clase tendrá sus propios datos.

Las propiedades y métodos de un objeto en OOP son definidas mediante una clase. Una clase es un modelo que define los atributos y comportamiento de los objetos que son creado como instancias de a clase.

Representación de una clase en UML
 

Ejemplo
Cuenta Por Cobrar
Cliente
BalanceDeudor
BalanceAcreedor
+montoPagar()




Para encontrar objetos y clases
Para encontrar clases se inicia por el proceso de abstracción definido más arriba. Este inicia con descartar los detalles que no aporta a lo que debe de hacer el objeto (se debe de prestar atención a los elementos que se quieren almacenar).
Ejemplo.
Escenario para facturar productos a una persona.
Conjunto de atributos
Atributos de interés
Cliente
Código del producto
Cantidad  de mercancía
Sexo del cliente
Fecha vencimiento del producto
Estado civil del cliente
Color del cliente
Precio del producto
Estatura del cliente
Edad de la cajera
Propaganda
Personas que lo promueven
Fecha vencimiento



Operaciones.
….. ( Discusión en el curso )



Según coad/yourdon, los objetos o sus clases pueden ser:
Cosas o eventos a recordar: Cosas que el sistema debe recordar (fecha y hora de acceso de una persona  a un edificio, operación de compra con una tarjeta de crédito, etc.)

Estructuras: Cuando del enunciado se deduce fácilmente una relación de agregación o generalización entre dos o más conceptos, posiblemente estamos ante dos o más clases candidatas.

Otros sistemas: ¿Con qué otros sistemas interactúa el sistema en desarrollo? Muchas veces dichos sistemas necesitan interacción desde nuestro sistema, y serán considerados clases.

Dispositivos: Dispositivos que nuestro sistema necesita, siempre que estos sean externos al ordenador que albergará a nuestro sistema (sensores, brazo mecánico, barrera automática, etc.).

Roles: Administrador, alumno, profesor, etc. son diferentes roles que una persona puede desempeñar cuando inicia una sesión en el campus virtual de la universidad. Aunque una misma persona física que conozca tres combinaciones correctas usuario - clave puede conectarse de tres formas diferentes (diferente interfaz, etc.), no hay una clase persona, sino una por cada rol o papel que puede desempeñar una persona según el tipo de sesión que inicie.

Unidades organizacionales: Sucursal, sede, departamento, etc. siempre que haya que guardar información específica al respecto. Es importante saber que utilizar este criterio por sistema (por ejemplo, siempre pensar en los departamentos de una empresa como clases) provoca errores en la mayoría de los casos.

Lugares, etc.: laboratorios, aulas, oficinas, etc. siempre, como antes se ha dicho, que haya que guardar información específica al respecto.

Regla de oro:
“Convertir en clase candidata todo aquel concepto del que haya que almacenar
Información en el sistema, bien a corto o a largo plazo.”

Después, en un segundo paso, se seleccionan aquellas clases que sean aplicables al dominio de nuestro problema. Para ello, una vez que hayamos seleccionado las clases candidatas, debemos escoger las que sean válidas según los siguientes criterios de filtrado:

Necesidad de recordar: Las clases deben tener información asociada. Una clase sin atributos puede existir, pero es extraño, así que se impone una reflexión al respecto.

Necesidad de comportamiento: Las clases deben tener operaciones. Una clase sin comportamiento también puede existir, pero no es común, así que se impone una reflexión al respecto.

Múltiples atributos: Las clases suelen tener más de un atributo. Las clases que sólo cuentan con un atributo son sospechosas de no ser clases, sino atributos de otras.

Más de una Objeto por Clase: Generalmente identificamos clases porque existe más de un objeto de la misma. Es posible que una clase que sólo tiene un objeto sea válida, pero no es normal. Sospechar.



Atributos y Servicios siempre aplicables: Todos los objetos de una clase deben tener los mismos atributos y operaciones. Si identificamos objetos de la misma clase con atributos y/o métodos diferentes, pueden ser que en realidad exista más de una clase, las cuales posteriormente relacionaremos mediante generalización.

Luego de encontrados los objetos y sus clases será preciso encontrar los atributos y las operaciones que actúan sobre ellos;

       Para encontrar  las operaciones se realiza un nuevo análisis gramatical de la descripción del problema  buscando y aislando los verbos del texto.

Las clases estarán definidas por los  objetos identificados con sus atributos y comportamiento comunes. El conjunto de todas las clases es un modelo OO del sistema en desarrollo.

Ejemplo de clases y atributos.
Clase
Atributos
Operaciones
Persona
Cedula
Nombre
Apellido
Fecha Nacimiento
optenerEdad()
asignarNombre()
opteberNombre()
Cuenta Contable
Código
Descripción
Origen
Balance
asignarCodigo()
asignarDescripción
calcularBalance()

Persona
-Cedula
-Nombre
-Apellido
-FechaNacimiento
+optenerEdad()
+asignarNombre()
+optenerNombre()



El proceso de para encontrar objetos y sus clases inicia con el problema de estudio en el cual se debe de prestar atención  a :
Los nombre propios,
Los nombres comunes,
Verbos
Adjetivos.
Ejemplo
Elemento gramatical
Elemento del modelo OO
Ejemplo
Nombre propios
Objeto ( Instancia )
Pedro, juan
Nombre común
Clase
Persona
Verbo
Acción
Calcular Edad
Adjetivos
Atributos
6 pies de estatura


Ejemplo completo

El señor Juan Alberto encargado del departamento de contabilidad de la tienda ABC tiene que realizar los asientos de diario por las ventas realizadas en la tienda, dichas ventas ascienden a un total de 15,000.00.

1)    Seleccionar los elementos gramaticales.
2)    Realizar una lista de los elementos gramaticales encontrados.
3)    Descartar los elementos gramaticales que no interesan  ( abstracción ),
4)    Mapear (relacionar) los elementos gramaticales con los del modelo.

(Método: Análisis del lenguaje natural)
Elementos encontrados
Elemento del modelo OO
Juan Alberto
Instancia
Encargado Departamento de Contabilidad
Clase
Tienda
Clase
ABC
Instancia
Tiene
Acción
Realizar
Acción
Asientos de diario
Clase
Tienda                                                                         
Clase
Ventas
Acción
Total
Atributo
Realizar asiento
Acción



Como asignación

1)    Para cada una de las clases identificadas crear tarjeta CRC.

Las tarjetas CRC (clase, responsabilidad y colaboración) son una metodología para el diseño de software orientado por objetos creada por Kent Beck y Ward Cunningham.

Las tarjas CRC son un método empleado para detectar, comprobar y actualizar las responsabilidades de las clases y sus colaboraciones con otras clases en un nivel conceptual.

Formato tarjeta CRC

Nombre de la clase

Responsabilidades

Clases colaboradoras



2)    Escribir cada clase en formato
NombreClase( Atributo1, Atributo2 …; Accion1, Accion2, …)

3)    Realizar representación UML de cada una de las clases.


Responsabilidades de una clase: definen el comportamiento que debe tener una clase. Esto se logra mediante la definición de los atributos y de los métodos que definirán el comportamiento de los objetos (instancias).

Dentro de las responsabilidades de una clase, lo primero es encapsular los atributos y las funciones miembros que se requieran así como su nivel de visibilidad (privado, protegido, público).




.