Hola y bienvenidos nuevamente. En esta lección continuaremos presentando los conceptos de diagramas de clase. Al finalizar esta lección, podrás modelar diagramas de clase básicos, incluyendo tipos de datos definidos por enumeraciones y modelar el comportamiento de los objetos a través de los métodos de una clase. Anteriormente vimos que podÃamos representar atributos utilizando tipos de datos primitivos, enteros, reales, cadenas de caracteres. Ahora veremos lo que son las enumeraciones. En algunas ocasiones necesitamos crear atributos con diferentes categorÃas y para los que no nos servirÃa simplemente utilizar los tipos de datos que ya conocemos. Por ejemplo, los estudiantes podrÃan pertenecer a un programa de pregrado, posgrado o ser de extensión. Esto es lo que llamamos el dominio de un atributo. Y para esto vamos a definir un tipo de dato cuyos valores son trece, en este caso. Diremos que estamos definiendo una enumeración. Las enumeraciones son tipos de datos que el usuario define; su rango de valores son un conjunto de constantes enteras, cada una con un nombre propio. En UML las enumeraciones se representan en su propio rectángulo y arriba de su nombre ponemos una anotación o un estereotipo, "enumeration", y su contenido son los nombres de cada una de las constantes que hacen parte de la misma. Por convención, el nombre de la enumeración comienza con su primera letra en mayúscula y usa también "CamelCase". Por otro lado, cada uno de los elementos de la enumeración se debe nombrar con mayúscula sostenida y, en caso de tener varias palabras compuestas, estas van separadas por guiones bajos. Cuando luego usamos las enumeraciones como tipo de un atributo, el tipo justamente va a ser el nombre de la enumeración. En nuestro ejemplo, con la clase de "Estudiante" podrÃamos tener una enumeración que represente si el estudiante es de pregrado, de posgrado o de extensión. Tendremos entonces un atributo de tipo "Tipo Programa" para que identifique a qué programa pertenece. ¿Cómo lo usamos cuando creamos objetos? Tenemos a nuestros estudiantes que tendrán un atributo que representa al programa al que pertenecen. ¿Qué valor puede tomar? Pregrado, posgrado o extensión. Entonces "e1", Juan, podrÃa ser un estudiante de pregrado y MarÃa, "e2", una estudiante de posgrado. Recordemos que esos, junto con la extensión, son los únicos valores que puede tomar el atributo "Programa". Ahora hablemos de los métodos. Los métodos son operaciones que están asociadas con la clase y que cada objeto de la clase podrá realizar. Podemos pensarlos como servicios que proveen los diferentes objetos y que van a modelar el comportamiento de los objetos. Los métodos en UML van en nuestro tercer compartimento del diagrama y al igual que los atributos, tendrán una visibilidad, un tipo de retorno que ahora puede no existir para los métodos que no van a devolver un valor y un nombre. Un ejemplo clásico son los métodos que retornan o dan el valor de cada uno de los atributos de un objeto, llamados "getters" en inglés y que, en español, por convención los nombramos con el verbo "dar" seguido del nombre del atributo; y los que permiten modificar dichos atributos, llamados "setters" en inglés y que, en español, por convención nombramos con el verbo "cambiar" seguido del nombre del atributo. En nuestro ejemplo tendremos, por ejemplo, el método "dar Nombre" que es público, es decir, se indica con el sÃmbolo más y que retorna un valor de tipo "string". Para ser coherentes, cuando implementamos el método, éste dará el valor del atributo "nombre". Adicionalmente, un método puede tener uno o una lista de parámetros necesarios para realizar su operación. Pensemos en el método "setter" que cambia el valor de un atributo por otro nuevo. Este nuevo valor debe venir de alguna parte y, por lo tanto, el método lo requiere como un parámetro para funcionar. Por convención, los nombres de los métodos comienzan siempre con minúscula y cuando tienen varias palabras usan también "CamelCase". Vamos a crear los métodos que nos retornan y nos cambian los valores de cada uno de los atributos de la clase de "Estudiante". Cuando usamos un lenguaje de programación orientada a objetos, por ejemplo Java, e instanciamos nuestras clases como objetos, podemos invocar nuestros métodos sobre cada uno. Estas serán las operaciones, algoritmos o procedimientos que hacen parte del comportamiento y tienen sentido dentro del contexto de cada objeto diferente. AsÃ, tus objetos pueden invocar al mismo método, pero su resultado será diferente porque usará los valores propios de cada uno. Por ejemplo, si tenemos dos objetos estudiantes, "e1" y "e2", sobre cada uno invocamos el método "dar Nombre", cada uno nos dirá un valor diferente. "e1" nos dirá que se llama Juan y "e2" nos dirá que se llama MarÃa. Para finalizar esta lección, es posible que te estés preguntando: ¿cómo sabemos qué clase debe hacer qué? Eso es todo un tema que se llama asignación de responsabilidades y que podemos ver en otros cursos. Por ahora vamos a usar una regla muy simple: quién posea la información es quien deberá manipularla, informarla o modificarla. Más aún, en este curso modelaremos nuestros problemas usando encapsulamiento. Cada objeto oculta sus atributos, es decir, que se definen como privados y solo a través de los métodos permitimos a otros objetos de otras clases conocerlos, usarlos y/o modificarlos.