El objetivo de la asignatura es el de aprender a programar empleando el paradigma de la Programación Orientada a Objetos (POO), así como fortalecer y complementar los conocimientos y habilidades adquiridas en la materia prerrequisito (SIS100).
Si bien el enfoque de la asignatura se centra en la Programación Orientada a Objetos (POO), en la misma se emplean también los principios de la Programación Estructurada (PE) estudiandas en la materia prerrequisito, porque aún son de mucha utilidad en el desarrollo de software. Iguamente se estudiarán y aplicarán, algunos de los principios de la Programación Funcional (FS), por ser una de las metodologías que mayor desarrollo y aplicación ha tenido en los últimos años.
Al concluir la asignatura los estudiantes deberán haber adquirido los conocimientos, habilidades y capacidades para resolver problemas prácticos simples, aplicando correcta y eficientemente los principios de la Programación Estructurada, de la Programación Orientada a Objetos y de la Programación Funcional.
Existe una amplia oferta de lenguajes que pueden ser empleados en la enseñanza y resolución práctica de problemas.
De esa amplia oferta, se ha elegido JavaScript, porque es un lenguaje que soporta todos los paradigmas de programación que se estudiarán en la asignatura, porque todos sus elementos son objetos (y el enfoque principal de la asignatura está en la POO) y porque se emplea extensamente en la programación de aplicaciones WEB, que son las aplicaciones de mayor demanda hoy en día.
Si bien el lenguaje de programación elegido es JavaScript, para su aplicación práctica (para crear aplicaciones WEB) se requiere de otros dos lenguajes HTML y CSS, que no son lenguajes de programación, sino (el primero) es un lenguaje de marcas de hipertexto y (el segundo) un lenguaje de hojas de estilo en cascada. El primero (HTML) permite crear la estructura de la página (títulos, párrafos, imágenes, formularios, enlaces, etc.) y el segundo (CSS) permite dar formato visual a esa estructura (colores, fuentes, tamaño, bordes, espaciados, alineación, animación, etc.).
En la POO, un objetos es la representación simplificada (la abstracción) de una "cosa" (algo o alguien). Esa "cosa" puede ser cualquier objeto de la vida real, o cualquier concepto simple o complejo.
En analogía con los objetos de la vida real, como un perro por ejemplo, que tiene un nombre, algunas características como raza, color, sexo, etc. y algunos comportamientos como caminar, correr, ladrar, saltar, etc., los objetos de la POO, tienen un nombre, datos (atributos) y funciones (métodos) y esos datos y funciones están en una sola estructura: el objeto.
Los datos (los atributos) de la POO, son el equivalente a las variables de la PE y al conjunto de valores que estos datos tienen, en un momento dado, se conoce como el estado del objeto.
Tanto la Programacion Estructurada, como la Programación Orientada a Objetos, son paradigmas, es decir formas de abordar la solución de problemas.
En la PE, cuando se aborda la solución de un problema, se piensa, por un lado, en las funciones que se requieren para resolver el problema y por otro, en los datos que son necesarios para que esas funciones hagan su trabajo.
En la POO, cuando se aborda la solución de un problema, se piensa en los objetos que son necesarios para resolver el problema, luego, para cada objeto, se piensa en los métodos que el objeto requiere para realizar su trabajo, así como en los atributos que son necesarios para esos métodos.
Por ejemplo, supongamos que el problema consiste en calcular el área y el perímetro de un rectángulo.
En la PE, se piensa en las funciones que se requieren para resolver el problema. En este caso, al ser un problema sencillo, se identifica fácilmente que se requieren dos funciones: Una para calcular el área: areaRectangulo y otra para calcular el perímetro: perimetroRectangulo. También se identifican fácilmente los datos necesarios para que las funciones devuelvan los resultados: la longitud de uno de los lados: lado1 y la longitud del otro lado: lado2. Al ser datos simples (números sencillos) no es necesario crear una estructura de datos para los mismos.
En consecuencia, en la PE, el problema se resuelve programando las funciones identificadas (areaRectangulo y perimetroRectangulo), las cuales reciben los datos requeridos (lado1 y lado2) y devuelven el área y el perímetro del rectángulo, es decir:
Solución que puede ser probada llamando a las funciones con algunos valores de prueba, por ejemplo para calcular el área y el perímetro de dos rectángulos, uno de 10 cm por 20 cm y otro de 35 cm por 25 cm:
Dado que los datos están en cm, el valor devuelto por areaRectangulo estará en cm2 y el devuelto por perimetroArea estará en cm.
Desde el punto de vista de la POO, para resolver el problema, sólo se requiere de un objeto, el objeto rectangulo.
Como es un objeto tendrá tanto los datos (los atributos) como las funciones (los métodos). En este caso, los atributos serán:
En JavaScript, a diferencia de la mayoría de los lenguajes de programación, un objeto puede ser creado directamente (sin necesidad de declarar previamente una clase). Para ello simplemente se escriben, entre llaves, los atributos (los datos) y los métodos (las funciones) separados con comas, este tipo de objetos, creados directamente (sin declarar una clase), se denominan Objetos Literales.
La solución del problema, empleando un objeto literal, es la siguiente:
En este ejemplo, se les asigna un valor inicial (0) a los atributos (lado1 y lado2), porque en un objeto literal los atributos deben tener un valor inicial.
Por otro lado, los métodos (las funciones) se declaran sin escribir la palabra function y no reciben ningún dato (a diferencia de la solución de la PE, donde reciben los lados: lado1 y lado2). Se procede así con los objetos, porque, como se dijo, los métodos tienen acceso a los atributos (a los datos) del objeto.
Como se puede ver, para acceder a los atributos se debe escribir this. delante del nombre del atributo. La palabra this, es el alias (el nombre) que JavaScript da al objeto desde el cual se llama al método. En este caso, por ejemplo, this es equivalente a rectangulo.
En general (en JavaScript) para acceder a un atributo o a un método de un objeto, se debe escribir el nombre del objeto, un punto y luego el nombre del atributo o método. Además, en el caso de los métodos, se deben añadir paréntesis (porque los métodos son funciones y toda función debe tener paréntesis después de su nombre).
Probando la solución POO, con los mismos valores que la solución PE, se obtienen los mismos resultados:
El inconveniente de resolver un problema con un objeto literal, es que (como se puede ver) es necesario cambiar (desde afuera del objeto) sus atributos (sus datos) y esa práctica es contraria a uno de los fundamentos de la POO: La encapsulación, la cual, en esencia, dice que sólo se deben recuperar y modificar los atributos, a través de los métodos del mismo objeto (no directamente como se ha hecho en el ejemplo).
Para que se cumpla el fundamento de la encapsulación, es necesario crear los objetos mediante una clase.
Las clases en la POO, son los moldes/planos con los cuales se fabrican/construyen los objetos. En una clase se programan los métodos y se declaran los atributos, pero usualmente no se les asignan valores iniciales.
Todos los objetos que se crean a partir de una clase, pueden utilizar (pueden llamar) a los métodos de esa clase y cuando lo hacen los métodos trabaja con los atributos (con los datos) de ese objeto (gracias a this).
Para que al crear un objeto, sea posible asignar valores iniciales a sus atributos, algo que generalmente es necesario (o por lo menos conveniente), se debe programar el método especial constructor. Este método se ejecuta automáticamente cuando se crea el objeto y generalmente se emplea para recibir valores y asignarlos a los atributos del objeto.
Las clases se crean con la palabra reservada class y la solución del problema empleando una clase es:
En este caso, el constructor recibe los dos lados (lado1 y lado2) y los asigna a los atributos privados #lado1 y #lado2.
Con la cual podemos crear, empleando el operador new, dos objetos (rectangulo1 y rectangulo2) y probarlos con los mismos valores que en los casos anteriores:
Y como era de esperar, se obtienen los mismos resultados que en los casos anteriores.
En este ejemplo, para que los atributos no puedan ser modificados o leídos desde fuera de los objetos, han sido declarados como atributos privados. Como se puede ver en el ejemplo, para que un atributo sea privado, debe ser declarado escribiendo el símbolo # delante del nombre de la propiedad.
Como en JavaScript no es posible volver a declarar una misma variable y como todas las variables declaradas en la calculadora, corresponden a una misma sesión, si se comete un error al crear una clase, para corregirlo (sin que se genere un error por volver a declarar una variable), se debe cambiar class Rectangulo por Rectangulo = class.
¿Cuál es la diferencia fundamental en la forma de abordar un problema entre la Programación Estructurada (PE) y la Programación Orientada a Objetos (POO)?
¿Qué elementos componen un objeto en la POO y a qué conceptos de la Programación Estructurada equivalen?
¿Por qué se eligió JavaScript como el lenguaje de programación para esta asignatura? Menciona al menos tres razones.
¿Por qué son indispensables HTML y CSS para la aplicación práctica de JavaScript en la creación de aplicaciones WEB?
¿Qué es un objeto en la POO?
¿Qué es un "Objeto Literal" en JavaScript y en qué se diferencia de un objeto creado a partir de una clase?
¿Qué significan y para qué se utilizan los símbolos this y # en el contexto de una clase en JavaScript?
En los siguientes ejercicios, resuelva los problemas aplicando la PE, la POO con objetos literales y la POO con clases. En todos los casos pruebe las soluciones con por lo menos dos conjuntos de valores.
Se necesita calcular el perímetro y área de un cuadrado.
Se necesita calcular el perímetro y área de un círculo.
Se necesita calcular la hipotenusa, el perímetro y el área de un triángulo rectángulo.
Se necesita construir una cadena con el nombre completo del estudiante en base a sus nombres y apellidos, así como una cadena compuesta por el nombre de la carrera y el número del carnet universitario.
Se necesita construir una cadena con la marca y el modelo de un televisor, así como la cadena con el tipo y el tamaño de la pantalla.
Se necesita construir una cadena con el nombre, precio unitario, cantidad y precio total de una compra.