09.05.2013 Views

Haga un click aquí

Haga un click aquí

Haga un click aquí

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Metodología de la Programación Estructurada y Orientada a Objetos<br />

Leobardo LÓPEZ ROMÁN<br />

Departamento de Ingeniería Industrial y de Sistemas, Universidad de Sonora<br />

Hermosillo, Sonora, 83000, México<br />

llopez@industrial.uson.mx<br />

RESUMEN<br />

Con la aparición del lenguaje Java y la penetración que<br />

ha tenido como el primer lenguaje que muchos<br />

estudiantes están aprendiendo, y debido a la falta de <strong>un</strong>a<br />

metodología apropiada, se está cayendo en el error de<br />

enseñar a programar directamente con el lenguaje Java,<br />

dejando de lado el desarrollo de la lógica, y se están<br />

formando programadores sin lógica.<br />

Este autor tiene la convicción de que los estudiantes<br />

deben aprender <strong>un</strong> lenguaje orientado a objetos como<br />

Java u otro, pero antes, deben desarrollar la lógica de la<br />

programación estructurada como base para el aprendizaje<br />

de la lógica de la programación orientada a objetos.<br />

En este trabajo se presenta <strong>un</strong>a metodología desarrollada<br />

para conducir el proceso enseñanza aprendizaje de la<br />

lógica de la programación, dividida en dos partes: en la<br />

primera parte, se plantea la metodología de la<br />

programación estructurada usando Top Down Design y<br />

seudocódigo; y en la seg<strong>un</strong>da parte, se presenta la<br />

evolución de la programación estructurada a la orientada<br />

a objetos, usando el diagrama de clases de UML<br />

integrado con la lógica de la programación estructurada<br />

en seudocódigo y con los conceptos de objetos, clases y<br />

encapsulación de la programación orientada a objetos.<br />

Palabras Claves: Metodología, Programación,<br />

Estructurada, Objetos, Orientada a Objetos.<br />

1. INTRODUCCIÓN<br />

A la com<strong>un</strong>idad académica le llevó muchos años<br />

consolidar <strong>un</strong>a forma apropiada como los estudiantes<br />

deben aprender a programar computadoras. Primero,<br />

deben aprender la metodología de la programación,<br />

usando técnicas de diseño algorítmicas o seudolenguajes;<br />

y después, deben aprender como implementarla usando<br />

<strong>un</strong> lenguaje de programación, todo esto con <strong>un</strong> enfoque<br />

estructurado, y después, sobre lo anterior, aprender la<br />

programación orientada a objetos en Java u otro lenguaje.<br />

En la actualidad muchos estudiantes de la programación<br />

de computadoras han estado aprendiendo Java como<br />

primer lenguaje, que es <strong>un</strong> lenguaje orientado a objetos,<br />

sin embargo, muchos de ellos, no están aprendiendo a<br />

programar orientado a objetos, porque se les está<br />

enseñando prácticamente en forma directa con el lenguaje<br />

Java, y no se les está enseñando a “pensar”, es decir, no<br />

están desarrollando la lógica de la programación<br />

orientada a objetos.<br />

La idea de este autor es que lo f<strong>un</strong>damental al aprender a<br />

programar computadoras es desarrollar la lógica<br />

necesaria para solucionar problemas en forma<br />

algorítmica, independientemente de algún lenguaje de<br />

programación; esto es, aprender a diseñar algoritmos o<br />

programas usando <strong>un</strong> seudolenguaje, y no hacerlo<br />

directamente con <strong>un</strong> lenguaje.<br />

Programación estructurada y orientada a objetos, es <strong>un</strong>a<br />

metodología que este autor ha desarrollado, la cual viene<br />

a coadyuvar en la solución de <strong>un</strong>a necesidad largamente<br />

experimentada por la com<strong>un</strong>idad académica de la<br />

programación de computadoras, contar con <strong>un</strong> método<br />

que permita conducir la enseñanza aprendizaje de la<br />

programación, mediante el uso de <strong>un</strong> seudolenguaje de<br />

diseño de algoritmos o programas estructurados y<br />

orientados a objetos.<br />

La metodología contiene en forma natural los conceptos,<br />

estructuras y filosofía que se han generado hasta estos<br />

tiempos en que la programación orientada a objetos y el<br />

lenguaje Java marcan la pauta de la programación de<br />

computadoras.<br />

Esta metodología es el resultado de la integración y<br />

adaptación de varias técnicas, como son: la programación<br />

estructurada en seudocódigo; los conceptos y estructuras<br />

de la programación orientada a objetos: objetos, clases y<br />

encapsulación; el diagrama de clases de UML (Unified<br />

Modeling Language, desarrollado por G. Booch, I.<br />

Jacobson y J. Rumbaugh) [1]; la arquitectura modelovista-controlador;<br />

y alg<strong>un</strong>os conceptos introducidos por<br />

el lenguaje Java. Dicha metodología permite diseñar<br />

algoritmos o programas estructurados y orientados a<br />

objetos, bien estructurados, bien documentados, eficaces,<br />

eficientes y fáciles de darles mantenimiento. En este<br />

artículo se presenta <strong>un</strong> resumen de la metodología<br />

original, la cual está escrita con todo detalle en el libro<br />

“Programación estructurada y orientada a objetos” [2];<br />

publicado por la editorial Alfaomega


(www.alfaomega.com.mx). 2011. México. Y es<br />

distribuido en los países de habla hispana.<br />

2. ESTADO DEL ARTE<br />

La actividad de programar computadoras ha tenido varias<br />

crisis, provocadas por el permanente aumento en la<br />

complejidad de las aplicaciones que deben enfrentarse, lo<br />

que provoca que las técnicas y estructuras que resultan<br />

adecuadas en <strong>un</strong> momento, con el paso del tiempo se<br />

vuelvan inadecuadas. Esta problemática ha dado origen a<br />

dos revoluciones: la primera, a la que se le llamó<br />

Programación Estructurada, permitió evolucionar desde<br />

programar de <strong>un</strong>a forma “tradicional”, casi artesanal, a<br />

programar de <strong>un</strong>a mejor forma, que aportó las bases para<br />

sustentar la seg<strong>un</strong>da revolución en la evolución de los<br />

paradigmas de programación, a lo que hoy se conoce<br />

como programación orientada a objetos.<br />

2.1 Programación tradicional<br />

En la década de los cincuentas y principios de los<br />

sesentas se programaba en forma “tradicional”, en esos<br />

tiempos sólo existían las estructuras lógicas:<br />

Secuenciación, If y For (que se conocía como Do en<br />

Fortran), y se utilizaban los diagramas de flujo como<br />

técnica de diseño de algoritmos o programas. Al<br />

aumentar la complejidad de las aplicaciones que se<br />

enfrentaban, esa forma de programar tuvo <strong>un</strong>a severa<br />

crisis. La arquitectura general de <strong>un</strong> programa consistía<br />

de <strong>un</strong> solo módulo o bloque de instrucciones.<br />

2.2 Programación estructurada<br />

A finales de la década de los sesentas, surge <strong>un</strong><br />

movimiento llamado programación estructurada que vino<br />

a añadir nuevas estructuras, técnicas y conceptos a la<br />

programación: se añadieron las estructuras lógicas DO-<br />

UNTIL, DOWHILE y se formalizaron el IF-THEN, IF-<br />

THEN-ELSE y CASE. Se inventó el módulo, la f<strong>un</strong>ción<br />

y el concepto de parámetros. Se desarrollaron nuevas<br />

técnicas de diseño de algoritmos o programas:<br />

seudocódigo, diagramas Warnier, diagramas Chapin,<br />

Jackson, Diseño estructurado de Yourdon, Top Down<br />

Design (Diseño descendente), entre otras; que vinieron a<br />

desplazar a la tradicional técnica de diagramas de flujo.<br />

Fueron apareciendo nuevos lenguajes: Pascal, C, Cobol<br />

estructurado, Basic estructurado. Se estableció que se<br />

debe aprender a programar utilizando <strong>un</strong> seudolenguaje,<br />

es decir, no enseñar directamente con <strong>un</strong> lenguaje. Y se<br />

estableció que se debe usar <strong>un</strong> estilo de programación que<br />

haga más entendible el algoritmo y el programa.<br />

Nuevamente al aumentar la complejidad de las<br />

aplicaciones que se enfrentaban, esa forma de programar<br />

tuvo <strong>un</strong>a severa crisis. Esto llevó a que siguiera<br />

evolucionando y se generaron los conceptos de<br />

programación modular, y luego el concepto de<br />

abstracción de datos, para dar paso al desarrollo de la<br />

programación orientada a objetos. La arquitectura general<br />

de <strong>un</strong> programa cambió, y ahora consistía de <strong>un</strong> conj<strong>un</strong>to<br />

de f<strong>un</strong>ciones o módulos jerarquizados, cada <strong>un</strong>o formado<br />

por <strong>un</strong> conj<strong>un</strong>to de instrucciones.<br />

2.3 Programación orientada a objetos<br />

A<strong>un</strong>que la programación orientada a objetos (POO)<br />

aparece muchos años antes, es a mediados de los<br />

noventas cuando se generaliza su uso. La POO añade a la<br />

programación <strong>un</strong>a nueva estructura: el objeto, con sus<br />

conceptos; objetos, clases, encapsulación, herencia y<br />

polimorfismo. Aparecen nuevas técnicas de diseño:<br />

Booch, Rumbaugh, Jacobson, Yourdon, UML (Unified<br />

Modeling Language), entre otras. Se desarrollan nuevos<br />

lenguajes: C++, Java, C#, etcétera. La arquitectura<br />

general de <strong>un</strong> programa cambió, y ahora consiste de <strong>un</strong><br />

conj<strong>un</strong>to de objetos, cada <strong>un</strong>o formado por datos y <strong>un</strong><br />

conj<strong>un</strong>to de métodos, equivalentes a módulos o f<strong>un</strong>ciones<br />

en la programación estructurada, y a su vez, cada método<br />

formado por <strong>un</strong> conj<strong>un</strong>to de instrucciones.<br />

3. PROBLEMÁTICA DE LA ENSEÑANZA<br />

APRENDIZAJE DE LA PROGRAMACIÓN<br />

En este p<strong>un</strong>to se describe la problemática de la enseñanza<br />

aprendizaje de la programación estructurada y orientada a<br />

objetos, de acuerdo con la experiencia, el enfoque y p<strong>un</strong>to<br />

de vista de este autor, observada en el contexto donde me<br />

desenvuelvo en México y en alg<strong>un</strong>os otros países de<br />

habla hispana.<br />

3. 1 Problemática de la enseñanza aprendizaje de la<br />

programación estructurada<br />

En muchas instituciones de educación incurren en alg<strong>un</strong>o<br />

de éstos errores:<br />

1. Enseñan a programar directamente con <strong>un</strong> lenguaje<br />

como C o C++. No es bueno enseñar directamente<br />

con <strong>un</strong> lenguaje, porque realmente se enseña a operar<br />

el lenguaje, y no se desarrolla la lógica necesaria<br />

para programar computadoras.<br />

2. Enseñan la lógica con diagramas de flujo. Los cuales<br />

resultan obsoletos porque no soportan todas las<br />

estructuras lógicas de control de la programación en<br />

forma natural.<br />

3. Enseñan la lógica en seudocódigos que utilizan las<br />

estructuras lógicas de control en forma<br />

castellanizada. En lugar de IF-THEN-ELSE utilizan<br />

SI-ENTONCES-SINO, en lugar de FOR utilizan<br />

PARA, en lugar de DOWHILE utilizan MIENTRAS;<br />

he usado éstos conceptos y he comprobado que no es<br />

buena idea. Las estructuras lógicas de la<br />

programación tienen sus palabras reservadas<br />

originales y no deben ser cambiadas, porque causan<br />

mucha confusión al estudiar los lenguajes de<br />

programación. Además, el tratamiento que se le da,


no favorece la segmentación de los programas en<br />

módulos o f<strong>un</strong>ciones.<br />

4. En las materias en las que se aplica la programación<br />

como programación II y estructura de datos, los<br />

maestros hacen énfasis en el código del programa y<br />

no en el diseño del mismo. Lo cual es esencial en la<br />

programación estructurada y orientada a objetos.<br />

3.2 Problemática de la enseñanza aprendizaje de la<br />

programación orientada a objetos<br />

En los últimos años se ha insistido y ejercido <strong>un</strong>a gran<br />

presión para que Java sea el primer y único lenguaje que<br />

los estudiantes deben aprender. En consecuencia, muchas<br />

instituciones educativas, están enseñando Java como<br />

primer lenguaje, eliminando <strong>un</strong>a formación previa que<br />

permita el desarrollo de la lógica de la programación.<br />

Alg<strong>un</strong>a gente dice que al estudiar el lenguaje Java va<br />

implícito el desarrollo de la lógica, y que la programación<br />

es mucho más fácil, rápida, agradable y avanzada en Java<br />

que lo que anteriormente era la programación.<br />

Alg<strong>un</strong>a gente dice que cualquier persona que no sepa<br />

nada de programación, puede entender fácilmente los<br />

conceptos de la programación orientada a objetos, y estoy<br />

de acuerdo en parte, porque en <strong>un</strong> nivel abstracto<br />

cualquiera puede comprenderlos. Pero en el momento en<br />

que se debe implementar los objetos en instrucciones en<br />

<strong>un</strong> lenguaje de programación como Java, es donde se dan<br />

cuenta que algo falta. Porque <strong>un</strong> programa orientado a<br />

objetos, se compone por <strong>un</strong> conj<strong>un</strong>to de objetos, y cada<br />

objeto, por <strong>un</strong> conj<strong>un</strong>to de métodos que implementan las<br />

f<strong>un</strong>ciones del objeto, a alg<strong>un</strong>os de esos métodos hay que<br />

enviarles datos a través de parámetros, para que<br />

establezcan y accedan los datos, y otros métodos realizan<br />

cálculos. De manera que ese algo que falta es la lógica<br />

básica de la programación; que consiste en: tipos de<br />

datos; entero, real, cadena, arreglos, etcétera; las<br />

estructuras de control secuenciación, if-then, if-then-else,<br />

switch, do-while, for, while; métodos (módulos y<br />

f<strong>un</strong>ciones definidas por el usuario); paso de parámetros<br />

por valor y por referencia. Es por ello que digo que esos<br />

elementos y estructuras son la base de la programación<br />

orientada a objetos, y que <strong>un</strong>a persona que no desarrolle<br />

esas bases, jamás podrá comprender cómo implementar<br />

los métodos de objetos que procesan datos.<br />

Por lo anterior, pienso que la programación orientada a<br />

objetos no se está enseñando adecuadamente en las<br />

instituciones de educación. ¿Cuál es la causa? Que en la<br />

bibliografía existente sobre programación orientada a<br />

objetos, está ausente la metodología de la programación<br />

orientada a objetos enfocada a estudiantes principiantes.<br />

En otras palabras, existen muchos libros sobre POO y<br />

UML, pero no están enfocados para niveles básicos de<br />

aprendizaje. Los libros que están enfocados para niveles<br />

básicos de aprendizaje son los libros de Java, que son<br />

excelentes manuales del lenguaje Java, pero no conducen<br />

el aprendizaje de la lógica básica de la programación<br />

inmersa en la programación orientada a objetos. Llevando<br />

a que los estudiantes “aprendan a programar” sin<br />

desarrollar lógica. Esto significa que los estudiantes<br />

realmente están aprendiendo a codificar usando el<br />

lenguaje Java, que es <strong>un</strong> lenguaje orientado a objetos,<br />

pero no están aprendiendo a programar orientado a<br />

objetos usando el lenguaje Java, que sería lo correcto.<br />

Porque programar es <strong>un</strong> proceso que implica diseñar el<br />

programa antes de codificarlo. Además, sabemos que si<br />

<strong>un</strong> estudiante aprende a programar directamente con el<br />

lenguaje que esta de moda, su mente queda “casada” con<br />

ese lenguaje, y cuando el lenguaje que esta de moda<br />

cambie, la formación que se le dio con el anterior<br />

lenguaje se convierte en deformación.<br />

Por lo anterior, podemos inferir que la programación no<br />

se está enseñando adecuadamente en muchas<br />

instituciones de educación.<br />

3.3 Reivindicación de la programación estructurada<br />

En los últimos años se ha observado que muchas<br />

instituciones de educación que antes iniciaban la<br />

enseñanza de la programación con la programación<br />

estructurada en C o C++, que cambiaron a enseñar la<br />

programación orientada a objetos con Java, y cayeron en<br />

la problemática explicada en el p<strong>un</strong>to anterior, están<br />

regresando a enseñar como lo hacían antes, primero la<br />

programación estructurada en C o C++ y después la<br />

programación orientada a objetos en Java u otro. Esto<br />

está reivindicando a la programación estructurada como<br />

la base de la programación orientada a objetos.<br />

4. METODOLOGÍA DE LA PROGRAMACIÓN<br />

ESTRUCTURADA Y ORIENTADA A OBJETOS<br />

Con el objetivo de llenar ese vacío que ha dejado la<br />

bibliografía y con el propósito de coadyuvar en el<br />

mejoramiento de la enseñanza aprendizaje de la<br />

programación de computadoras, he desarrollado esta<br />

metodología de la programación estructurada y orientada<br />

a objetos.<br />

La metodología se divide en dos partes: en la primera<br />

parte, que abarca del capítulo <strong>un</strong>o al nueve, se presenta<br />

la metodología de la programación estructurada usando la<br />

técnica Top Down Design y seudocódigo. En esta<br />

primera parte se da énfasis al desarrollo de la lógica<br />

básica de la programación usando seudocódigo. Se<br />

estudian los tipos de datos, identificadores, operaciones<br />

de entrada, cálculo y salida.<br />

Las estructuras de control: la secuenciación; la selección<br />

simple (if then), doble (if then else) y múltiple (switch);


la repetición do…while, la repetición for y la repetición<br />

while. Los arreglos <strong>un</strong>idimensionales, bidimensionales,<br />

tridimensionales y tetradimensionales. Y por último de<br />

esta primera parte, se estudia cómo usar más de <strong>un</strong>a<br />

f<strong>un</strong>ción, en problemas que involucran a más de <strong>un</strong>a tarea<br />

o f<strong>un</strong>ción; f<strong>un</strong>ciones que no regresan valor, f<strong>un</strong>ciones que<br />

regresan valor, parámetros por valor y por referencia;<br />

registros y archivos.<br />

A continuación se presenta <strong>un</strong> ejemplo, para mostrar <strong>un</strong>a<br />

idea general de cómo se usa la primera parte de la<br />

metodología en la solución de <strong>un</strong>a aplicación.<br />

Problema 1:<br />

Elaborar <strong>un</strong> algoritmo que permita leer <strong>un</strong> vector de diez<br />

números en <strong>un</strong> arreglo de 10 elementos; que lo imprima e<br />

imprima la media. Leer el vector en <strong>un</strong>a f<strong>un</strong>ción; calcular<br />

la media en otra f<strong>un</strong>ción; e imprimir el vector en otra<br />

f<strong>un</strong>ción. Utilizando parámetros.<br />

A continuación se diseña el diagrama general de la<br />

solución usando Top Down Design:<br />

F<strong>un</strong>ción<br />

leerVector()<br />

Algoritmo<br />

MEDIA CON FUNCIONES<br />

F<strong>un</strong>ción principal()<br />

F<strong>un</strong>ción<br />

calcularMedia()<br />

Ahora se diseña el algoritmo en seudocódigo:<br />

Algoritmo MEDIA CON FUNCIONES<br />

1. F<strong>un</strong>ción principal()<br />

a. Declarar<br />

Variables<br />

vector: Arreglo[10] Real<br />

promedio: Real<br />

b. leerVector(vector)<br />

c. promedio = calcularMedia(vector)<br />

d. imprimirVector(vector)<br />

e. Imprimir promedio<br />

f. Fin F<strong>un</strong>ción principal<br />

F<strong>un</strong>ción<br />

imprimirVector()<br />

2. F<strong>un</strong>ción leerVector(Ref vec: Arreglo[10] Real)<br />

a. Declarar<br />

Variables<br />

n: Entero<br />

b. for n=0; n


como Top Down Design, y en la programación orientada<br />

a objetos se usan técnicas como el diagrama de clases.<br />

A continuación se presenta <strong>un</strong> ejemplo, para mostrar <strong>un</strong>a<br />

idea general de cómo se usa la seg<strong>un</strong>da parte de la<br />

metodología en la solución de <strong>un</strong>a aplicación.<br />

Problema 2:<br />

En cierta empresa manufacturera de mesas se tienen<br />

varios obreros; por cada obrero se tiene su nombre y la<br />

cantidad de <strong>un</strong>idades producidas por cada <strong>un</strong>o de los seis<br />

días en que laboró. Elaborar <strong>un</strong> algoritmo que permita<br />

leer los datos de los obreros e imprima <strong>un</strong> reporte de<br />

producción.<br />

A continuación se tiene la solución en dos partes: en la<br />

primera, se diseña el diagrama de clases, que contiene la<br />

estructura general del algoritmo o programa, y después,<br />

en la seg<strong>un</strong>da parte, se diseña el algoritmo que contiene la<br />

lógica que soluciona el problema usando seudocódigo.<br />

Diagrama de clases<br />

nombreObr<br />

produccion<br />

sueldo<br />

Obrero3<br />

establecerNombreObr()<br />

establecerProduccion()<br />

calcularSueldo()<br />

obtenerNombreObr()<br />

obtenerProduccion()<br />

obtenerSueldo()<br />

Algoritmo CALCULA LA PRODUCCION DE OBREROS<br />

Clase Obrero3<br />

1. Declarar<br />

Datos<br />

nombreObr: Cadena<br />

produccion: Entero<br />

sueldo: Real<br />

2. Método establecerNombreObr(nom: Cadena)<br />

a. nombreObr = nom<br />

b. Fin Método establecerNombreObr<br />

3. Método establecerProduccion(prod: Entero)<br />

a. produccion = prod<br />

b. Fin Método establecerProduccion<br />

4. Método calcularSueldo()<br />

a. if produccion 500)AND (produccion 800 then<br />

1. sueldo = producción * 30.00<br />

f. endif<br />

g. Fin Método calcularSueldo<br />

5. Método obtenerNombreObr() Cadena<br />

a. return nombreObr<br />

b. Fin Método obtenerNombreObr<br />

6. Método obtenerProduccion() Real<br />

a. return produccion<br />

b. Fin Método obtenerProduccion<br />

7. Método obtenerSueldo() Real<br />

a. return sueldo<br />

b. Fin Método obtenerSueldo<br />

Fin Clase Obrero3<br />

Clase EjecutaObrero3<br />

1. Método principal()<br />

a. Declarar<br />

Variables<br />

nombre, obrMayor, obrMenor: Cadena<br />

dia, proDia, totProdObr, totProd,<br />

totObreros, mayorProd, menorProd: Entero<br />

totSueldos: Real<br />

desea: Carácter<br />

b. Imprimir encabezado<br />

c. totObreros = 0<br />

totProd = 0<br />

totSuedos = 0<br />

mayorProd = 0<br />

menorProd = 10000<br />

d. do<br />

1. Declarar, crear e iniciar objeto<br />

Obrero3 objObrero = new Obrero3()<br />

2. Solicitar Nombre<br />

3. Leer nombre<br />

4. totProdObr = 0<br />

5. for dia=1; dia


10. if objObrero.obtenerProduccion()>mayorProd<br />

then<br />

a. mayorProd = objObrero.obtenerProduccion()<br />

b. obrMayor = objObrero.obtenerNombreObr()<br />

11. endif<br />

12. if objObrero.obtenerProduccion()

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!