1.
Cuál Cuál es la dif difere erenci ncia a entre entre pro progr gram amac ación ión estruc estructur turad ada a y pro progr gram amaci ación ón orie orient ntada ada a objetos
Programación Estructurada La programación estructurada estructurada nació como solución a los problemas que presentaba la programación no estructurada, la cual se empleó durante mucho empo antes de la invención de la programación estructurada. Un programa no estructurado es un programa procedimental: las instrucciones se ejecutan en el mismo orden en que han sido escritas. Sin embargo, este po de programación emplea la instrucción goto. Una instrucción goto permite pasar el control a cualquier otra parte del programa. !uando se ejecuta una instrucción goto la secuencia de ejecución del programa conn"a a parr de la instrucción indicada por goto. #e esta $orma, para comprender como $unciona un programa es necesario simular su ejecución. Esto quiere decir que en la ma%or&a de los casos es mu% di'cil comprender la lógica de un programa de este po. (lgunos compiladores compiladores crean re$erencias cru)adas a las instrucciones apuntadas apuntadas por los goto, posibilitando una navegación r*pida a trav+s del código $uente. Sin embargo, es algo com"n en muchos lenguajes de programación el empleo de una variable en asociación con el desno del goto, no permiendo la creación autom*ca de tablas de re$erencias cru)adas. Eisten problemas similares en algunos lenguajes de programación estructurada, estructurada, por ejemplo cómo implementar las vistas en di$erentes idiomas, de $orma que varias personas puedan visuali)ar la misma in$ormación, pero cada una en su idioma. Esto se opone a la idea de uli)ar alg"n po de abstracción que permita comprender cómo $unciona realmente realmente un programa, que es lo que hace la programación programación estructurada. Lo que pod&amos llamar programación tradicional, tradicional, por ejemplo la que se uli)aba -uli)a en la con$ección de programas para los primivos P!s bajo /S0#1S, o en los actuales 2in034 bajo una ventana #1S, es un concepto un tanto ambiguo, pero podemos intentar una de5nición diciendo que se basa en algunas premisas % caracter&scas bastante de5nidas. Estas caracter&scas pueden coeisr juntas o $altar alguna, pero en general se dan simult*neamente. La programación estructurada es una t+cnica para escribir programas -programación de computadora de manera clara. Para ello se uli)an "nicamente tres estructuras: secuencia, selección e iteración6 siendo innecesario el uso de la instrucción o instrucciones de trans$erencia incondicional -7181, E98 ;UE8U><. ?o% en d&a las aplicaciones in$orm*cas son mucho m*s ambiciosas que las necesidades de programación programación eistentes en los a@os ABCD, principalmente principalmente debido a las aplicaciones gr*5cas, por lo que las t+cnicas de programación estructurada estructurada no son su5cientes. su5cientes. Ello ha llevado al desarrollo de nuevas t+cnicas, tales como la programación orientada a objetos % el desarrollo de entornos de programación que $acilitan la programación de grandes aplicaciones.
Programación orientada a objetos La programación orientada orientada a objetos o P11 -11P seg"n sus siglas en ingl+s es un paradigma de programación que usa objetos % sus interacciones, para dise@ar aplicaciones % programas in$orm*cos. Est* basado en varias t+cnicas, inclu%endo herencia, abstracción, polimor5smo % encapsulamiento. encapsulamiento. Su uso se populari)ó a principios de la d+cada de los a@os ABBD. En la actualidad, eiste variedad de lenguajes de programación programación que soportan la orientación a objetos.
Los objetos son endades que enen un determinado estado, comportamiento -m+todo e idendad: El estado est* compuesto de datos, ser* uno o varios atributos a los que se habr*n asignado unos valores concretos -datos. El comportamiento est* de5nido de5nido por los m+todos o mensajes a los que sabe responder dicho objeto, es decir, qu+ operaciones se pueden reali)ar con +l. La idendad es una propiedad de un objeto que lo di$erencia del resto, dicho con otras palabras, es su iden5cador -concepto an*logo al de iden5cador de una variable o una constante. Un objeto conene toda la in$ormación que permite de5nirlo e iden5carlo $rente a otros objetos pertenecientes pertenecientes a otras clases e incluso $rente a objetos de una misma clase, al poder tener valores bien di$erenciados en sus atributos. ( su ve), los objetos disponen de mecanismos de interacción llamados m+todos, que $avorecen la comunicación entre ellos. Esta comunicación $avorece a su ve) el cambio de estado en los propios objetos. Esta caracter&sca lleva a tratarlos como unidades indivisibles, en las que no se separa el estado % el comportamiento. Los m+todos -comportamiento % atributos -estado est*n estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de m+todos para poder tratar los atributos con los que cuenta. El programador debe pensar indisntamente en ambos conceptos, conceptos, sin separar ni darle ma%or importancia a alguno de ellos. ?acerlo podr&a producir el h*bito erróneo de crear clases contenedoras de in$ormación por un lado % clases con m+todos que manejen a las primeras por el otro. #e esta manera se estar&a reali)ando una programación programación estructurada camuada en un lenguaje de programación programación orientado a objetos. La P11 di5ere de la programación estructurada estructurada tradicional, en la que los datos % los procedimientos est*n separados % sin relación, %a que lo "nico que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada estructurada anima al programador a pensar sobre todo en t+rminos de procedimientos procedimientos o $unciones, % en segundo lugar en las estructuras de datos que esos procedimientos procedimientos manejan.
En la programación estructurada sólo se escriben $unciones que procesan datos. Los programadores que emplean P11, en cambio, primero de5nen objetos para luego enviarles mensajes solicit*ndoles que realicen sus m+todos por s& mismos. 2.
Ventajas y desventajas de la programación orientada a objetos
Las ventajas de POO
La primera ventaja del concepto de objetos es que todo el código que ene algo que ver con las naves espaciales se encuentra en un solo lugar. 1tra ventaja es que los objetos pueden poseer atributos inherentes de la clase a la que pertenecen, por ejemplo, naves espaciales % asteroides podr&an tener ambos una posición 9F porque todos los objetos que pertenecen a la clase de los objetos en movimiento ene una posición 9F. Escribir códigos es m*s $*cil porque se pueden conceptuali)ar como algo que le sucede a un objeto. 1tra ventaja es que P11 hace que los programas grandes sean m*s manejables. Si todas las ventanas pertenecen a una jerarqu&a de clases de ventanas % todo el código que se re5ere a una ventana parcular est* dentro de esa ventana, todas las manipulaciones de ventana se pueden escribir como una sencilla trans$erencia de mensajes.
Las desventajas de POO
!inta"is para de#nir variables en $ava !inta"is para imprimir en consola en $ava !inta"is para comentar en $ava !inta"is de los operadores lógicos y relacionales
(.
)e#na Clase* instancia de clase* atributo* comportamiento* iden+dad* constructor e iden+#cadores.
,tributos
Los atributos son las caracter&scas individuales que di$erencian un objeto de otro % determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, % cada objeto parcular puede tener valores disntos para estas variables. Las variables de instancia tambi+n denominados miembros dato, son declaradas en la clase pero sus valores son 5jados % cambiados en el objeto. (dem*s de las variables de instancia ha% variables de clase, las cuales se aplican a la clase % a todas sus instancias. Por ejemplo, el n"mero de ruedas de un automóvil es el mismo cuatro, para todos los automóviles. Comportamiento
El comportamiento de los objetos de una clase se implementa mediante $unciones miembro o m+todos. Un m+todo es un conjunto de instrucciones que reali)an una determinada tarea % son similares a las $unciones de los lenguajes estructurados. #el mismo modo que ha% variables de instancia % de clase, tambi+n ha% m+todos de instancia % de clase. En el primer caso, un objeto llama a un m+todo para reali)ar una determinada tarea, en el segundo, el m+todo se llama desde la propia clase. -l proyecto
El pro%ecto consta de dos archivos, el primero conene la clase >ectangulo que se guarda en el archivo >ectangulo.java % no ene el m+todo main. La "lma casilla del asistente de creación de clases ectangulo(ppA % se guarda en el archivo >ectangulo(ppA.java, esta clase ene que tener el m+todo main, por lo tanto, la "lma casilla del asistente de creación de clases
Para crear una clase se uli)a la palabra reservada class % a connuación el nombre de la clase. La de5nición de la clase se pone entre las llaves de apertura % cierre. El nombre de la clase empie)a por letra ma%"scula.
class >ectanguloI JJmiembros dato JJ$unciones miembro K Los miembros dato Los valores de los atributos se guardan en los miembros dato o variables de instancia. Los nombres de dichas variables comien)an por letra min"scula. amos a crear una clase denominada >ectangulo, que describa las caracter&scas comunes a estas 5guras planas que son las siguientes: El origen del rect*ngulo: el origen o posición de la esquina superior i)quierda del rect*ngulo en el plano determinado por dos n"meros enteros e %. Las dimensiones del rect*ngulo: ancho % alto, otros dos n"meros enteros. rectangulo.gi$ -BMC b%tes class >ectanguloI int 6 int %6 int ancho6 int alto6 JJ$altan las $unciones miembro K Las funciones miembro
En el lenguaje !NN las $unciones miembro se declaran, se de5nen % se llaman. En el lenguaje Hava las $unciones miembro o m+todos solamente se de5nen % se llaman. El nombre de las $unciones miembro o m+todos comie)a por letra min"scula % deben sugerir acciones -mover, calcular, etc.. La de5nición de una $unción ene el siguiente $ormato: po nombre;uncion-po parmA, po parm4, po parm3I JJ...sentencias
K Entre las llaves de apertura % cierre se coloca la de5nición de la $unción. po indica el po de dato que puede ser prede5nido int, double, etc, o de5nido por el usuario, una clase cualquiera. Para llamar a un $unción miembro o m+todo se escribe retornoOobjeto.nombre;uncion-argA, arg4, arg36 !uando se llama a la $unción, los argumentos argA, arg4, arg3 se copian en los par*metros parmA, parm4, parm3 % se ejecutan las sentencias dentro de la $unción. La $unción 5nali)a cuando se llega al 5nal de su bloque de de5nición o cuando encuentra una sentencia return. !uando se llama a la $unción, el valor devuelto mediante la sentencia return se asigna a la variable retorno. !uando una $unción no devuelve nada se dice de po void. Para llamar a la $unción, se escribe objeto.nombre;uncion-argA, arg4, arg36 Estudiaremos m*s adelante con m*s detalle como se de5nen las $unciones. Una $unción suele 5nali)ar cuando llega al 5nal del bloque de su de5nición void $uncion-....I JJsentencias... K Una $unción puede 5nali)ar antes del llegar al 5nal de su de5nición void $uncion-....I JJsentencias... i$-condicion return6 JJsentencias.. K Una $unción puede devolver un valor -un po de dato primivo o un objeto.
double $uncion-....I double sumaOD.D6
JJsentencias... return suma6 K !ualquier variable declarada dentro de la $unción ene una vida temporal, eisendo en memoria, mientras la $unción est+ acva. Se trata de variables locales a la $unción. Por ejemplo: void nombre;uncion-int parmI JJ... int iOM6 JJ... K La variable parm, eiste desde el comien)o hasta el 5nal de la $unción. La variable local i, eiste desde el punto de su declaración hasta el 5nal del bloque de la $unción. Se ha de tener en cuenta que las $unciones miembro enen acceso a los miembros dato, por tanto, es importante en el dise@o de una clase decidir qu+ variables son miembros dato, qu+ variables son locales a las $unciones miembro, % qu+ valores les pasamos a dichas $unciones. Los ejemplos nos a%udar*n a entender esta disnción. ?emos de5nido los atributos o miembros dato de la clase >ectangulo, ahora le vamos a@adir un comportamiento: los objetos de la clase >ectangulo o rect*ngulos sabr*n calcular su *rea, tendr*n capacidad para trasladarse a otro punto del plano, sabr*n si conenen en su interior un punto determinado del plano. La $unción que calcula el *rea reali)ar* la siguiente tarea, calcular* el producto del ancho por el alto del rect*ngulo % devolver* el resultado. La $unción devuelve un entero es por tanto, de po int. ectanguloI int 6 int %6 int ancho6 int alto6
int calcular(rea-I return -anchoalto6 K K ( la $unción que despla)a el rect*ngulo hori)ontalmente en d, % vercalmente en d%, le pasamos dichos despla)amientos, % a parr de estos datos actuali)ar* los valores que guardan sus miembros dato e %. La $unción no devuelve nada es de po void. class >ectanguloI int 6 int %6 int ancho6 int alto6 void despla)ar-int d, int d%I NOd6 %NOd%6 K K La $unción que determina si un punto est* o no en el interior del rect*ngulo, devolver* true si el punto se encuentra en el interior del rect*ngulo % devolver* $alse si no se encuentra, es decir, ser* una $unción del po boolean. La $unción necesitar* conocer las coordenadas de dicho punto. Para que un punto de coordenadas A e %A est+ dentro de un rect*ngulo cu%o origen es e %, % cu%as dimensiones son ancho % alto, se deber* cumplir a la ve) cuatro condiciones AQ % a la ve) ARNancho
8ambi+n se debe cumplir %AQ% % a la ve) %AR%Nalto !omo se enen que cumplir las cuatro condiciones a la ve), se unen mediante el operador lógico (<# simboli)ado por .
class >ectanguloI int 6 int %6 int ancho6 int alto6 boolean esta#entro-int A, int %AI i$--AQ-ARNancho-%AQ%-%AR%NanchoI return true6 K return $alse6 K K En el lenguaje Hava, si la primera condición es $alsa no se eval"an las restantes epresiones %a que el resultado es $alse. (hora bien, si la primera es verdadera true, se pasa a evaluar la segunda, si +sta el $alsa el resultado es $alse, % as& sucesivamente. Los constructores
Un objeto de una clase se crea llamando a una $unción especial denominada constructor de la clase. El constructor se llama de $orma autom*ca cuando se crea un objeto, para situarlo en memoria e iniciali)ar los miembros dato declarados en la clase. El constructor ene el mismo nombre que la clase. Lo espec&5co del constructor es que no ene po de retorno. class >ectanguloI int 6 int %6 int ancho6 int alto6 >ectangulo-int A, int %A, int G, int hI OA6
%O%A6 anchoOG6 altoOh6 K K El constructor recibe cuatro n"meros que guardan los par*metros A, %A, G % h, % con ellos iniciali)a los miembros dato , %, ancho % alto. Una clase puede tener m*s de un constructor. Por ejemplo, el siguiente constructor crea un rect*ngulo cu%o origen est* en el punto -D, D. class >ectanguloI int 6 int %6 int ancho6 int alto6 >ectangulo-int G, int hI OD6 %OD6 anchoOG6 altoOh6 K K Este constructor crea un rect*ngulo de dimensiones nulas situado en el punto -D, D, class >ectanguloI int 6 int %6 int ancho6
int alto6 >ectangulo-I OD6 %OD6 anchoOD6 altoOD6 K K !on estas porciones de código de5nimos la clase, % la guardamos en un archivo que tenga el mismo nombre que la clase >ectangulo % con etensión .java. public class >ectangulo I int 6 int %6 int ancho6 int alto6 public >ectangulo- I
OD6
%OD6
anchoOD6
altoOD6 K public >ectangulo-int A, int %A, int G, int h I
OA6
%O%A6
anchoOG6
altoOh6
K public >ectangulo-int G, int h I
OD6
%OD6
anchoOG6
altoOh6 K int calcular(rea-I return -anchoalto6 K void despla)ar-int d, int d%I NOd6 %NOd%6 K boolean esta#entro-int A, int %AI i$--AQ-ARNancho-%AQ%-%AR%NanchoI return true6 K return $alse6 K
K Los objetos
Para crear un objeto de una clase se usa la palabra reservada neG. Por ejemplo, >ectangulo rectAOneG >ectangulo-AD, 4D, TD, D6
neG reserva espacio en memoria para los miembros dato % devuelve una re$erencia que se guarda en la variable rectA del po >ectangulo que denominamos ahora objeto. #icha sentencia, crea un objeto denominado rectA de la clase >ectangulo llamando al segundo constructor en el listado. El rect*ngulo estar* situado en el punto de coordenadas OAD, %O4D6 tendr* una anchura de anchoOTD % una altura de altoOD. >ectangulo rect4OneG >ectangulo-TD, D6 !rea un objeto denominado rect4 de la clase >ectangulo llamando al tercer constructor, dicho rect*ngulo estar* situado en el punto de coordenadas OD, %OD6 % tendr* una anchura de anchoOTD % una altura de altoOD. >ectangulo rect3OneG >ectangulo-6 !rea un objeto denominado rect3 de la clase >ectangulo llamando al primer constructor, dicho rect*ngulo estar* situado en el punto de coordenadas OD, %OD6 % tendr* una anchura de anchoOD % una altura de altoOD.
,cceso a los miembros
#esde un objeto se puede acceder a los miembros mediante la siguiente sintais
objeto.miembro6
Por ejemplo, podemos acceder al miembro dato ancho, para cambiar la anchura de un objeto rect*ngulo. rectA.anchoOADD6 El rect*ngulo rectA que ten&a inicialmente una anchura de TD, mediante esta sentencia se la cambiamos a ADD. #esde un objeto llamamos a las $unciones miembro para reali)ar una determinada tarea. Por ejemplo, desde el rect*ngulo rectA llamamos a la $unción calcular(rea para calcular el *rea de dicho rect*ngulo. rectA.calcular(rea-6 La $unción miembro area devuelve un entero, que guardaremos en una variable entera medida(rea, para luego usar este dato. int medida(reaOrectA.calcular(rea-6
S%stem.out.println-El *rea del rect*ngulo es Nmedida(rea6 Para despla)ar el rect*ngulo rect4, AD unidades hacia la derecha % 4D hacia abajo, escribiremos
rect4.despla)ar-AD, 4D6 Podemos veri5car mediante el siguiente código si el punto -4D, 3D est* en el interior del rect*ngulo rectA. i$-rectA.esta#entro-4D,3DI S%stem.out.println-El punto est* dentro del rect*ngulo6 KelseI S%stem.out.println-El punto est* $uera del rect*ngulo6 K rectA.dentro- devuelve true si el punto -4D, 3D que se le pasa a dicha $unción miembro est* en el interior del rect*ngulo rectA, ejecut*ndose la primera sentencia, en caso contrario se ejecuta la segunda. !omo veremos m*s adelante no siempre es posible acceder a los miembros, si establecemos controles de acceso a los mismos. public class >ectangulo(ppA I public stac void main-StringVW args I >ectangulo rectAOneG >ectangulo-AD, 4D, TD, D6 >ectangulo rect4OneG >ectangulo-TD, D6 >ectangulo rect3OneG >ectangulo-6 int medida(reaOrectA.calcular(rea-6 S%stem.out.println-El *rea del rect*ngulo es Nmedida(rea6 rect4.despla)ar-AD, 4D6
i$-rectA.esta#entro-4D,3DI S%stem.out.println-El punto est* dentro del rect*ngulo6
KelseI
S%stem.out.println-El punto est* $uera del rect*ngulo6 K K K La vida de un objeto
En el lenguaje !NN, los objetos que se crean con neG se han de eliminar con delete. neG reserva espacio en memoria para el objeto % delete libera dicha memoria. En el lenguaje Hava no es necesario liberar la memoria reservada, el recolector de basura -garbage collector se encarga de hacerlo por nosotros, liberando al programador de una de las tareas que m*s quebraderos de cabe)a le producen, olvidarse de liberar la memoria reservada. eamos un ejemplo public class Una!lase I public stac void main-StringVW args I mage granmagenOcreamagen-6 mostrar-gramagen6 Ghile-condicionI calcular-6 K K K El objeto granmagen, connua en memoria hasta que se alcan)a el 5nal de la $unción main, aunque solamente es necesario hasta el bucle Ghile. En ! o en !NN eliminariamos dicho objeto liberando la memoria que ocupa mediante delete. El equivalente en Hava es el de asignar al objeto granmagen el valor null. public class Una!lase I public stac void main-StringVW args I mage granmagenOcreamagen-6 mostrar-gramagen6
granmagenOnull6 Ghile-condicionI calcular-6 K K K ( parr de la sentencia marcada en letra negrita el recolector de basura se encargar* de liberar la memoria ocupada por dicha imagen. (s& pues, se asignar* el valor null a las re$erencias a objetos temporales que ocupen mucha memoria tan pronto como no sean necesarios. !reamos dos objetos de la clase rect*ngulo, del mismo modo que en el apartado anterior >ectangulo rectAOneG >ectangulo-AD, 4D, TD, D6 >ectangulo rect3OneG >ectangulo-6 Si escribimos rect3OrectA6 En rect3 se guarda la re$erencia al objeto rectA. La re$erencia al objeto rect3 se pierde. El recolector se encarga de liberar el espacio en memoria ocupado por el objeto rect3. La destrucción de un objeto es una tarea -thread de baja prioridad que lleva a cabo la /*quina irtual Hava -H/. Por tanto, nunca podemos saber cuando se va a destruir un objeto. Puede haber situaciones en las que es necesario reali)ar ciertas operaciones que no puede reali)ar el recolector de basura -garbage collector cuando se destru%e un objeto. Por ejemplo, se han abierto varios archivos durante la vida de un objeto, % se desea que los archivos est+n cerrados cuando dicho objeto desaparece. Se puede de5nir en la clase un m+todo denominado 5nali)e que realice esta tarea. Este m+todo es llamado por el recolector de basura inmeditamente antes de que el objeto sea destru&do. den+#cadores
!ómo se escriben los nombres de la variables, de las clases, de las $unciones, etc., es un asunto mu% importante de cara a la comprensión % el mantenimiento de código. En la introducción a los $undamentos del lenguaje Hava hemos tratado %a de los iden5cadores.
El código debe de ser tanto m*s $*cil de leer % de entender como sea posible. (lguien que lea el código, incluso despu+s de cierto empo, debe ser capa) de entender lo que hace a primera vista, aunque los detalles internos, es decir, cómo lo hace, precise un estudio detallado. emos primero un ejemplo que muestra un código poco legible % por tanto, mu% di'cil de mantener public class !uenI private int ba6
!uen-int baI this.baOba6 K public void dep-int iI baNOi6 K public boolean ret-int iI i$-baQOiI ba0Oi6 return true6 K return $alse6 K public int get-I return ba6 K K Las abreviaciones empleadas solamente enen signi5cado para el programador en el momento de escribir el código, %a que puede olvidarse de su signi5cado con el empo. 1tros