Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

viernes, 14 de junio de 2024

OOo Basic. Programación.

Definición de programación

Programar es ordenar una secuencia de pasos para conseguir el funcionamiento esperado en un ordenador. También se puede definir como la acción de crear programas o aplicaciones mediante el uso de un lenguaje de programación.


Existen múltiples lenguajes de programación, pero todos comparten características comunes, en su definición, en sus componentes y en la forma en que podemos esperar que funcionen.

Un lenguaje de programación es un lenguaje artificial que contiene signos, términos y estructuras, se rige por unas reglas sintácticas y produce unos resultados que son consecuencia del procesamiento de los datos con los que trabaja.

Los lenguajes de programación son lenguajes intermediarios entre el programador y el ordenador. Éste traduce a lo que se denomina "código máquina" las instrucciones que el programador escribe en determinado lenguaje de programación. El ordenador interpreta esas instrucciones, traduciéndolas a su lenguaje y ejecutándolas.

Lo interesante de la programación es que podemos adaptar el funcionamiento del ordenador a nuestras necesidades. Lenguajes como OOo Basic, por sus características especiales, nos permiten adaptar el funcionamiento de servicios de uso común en nuestro trabajo, como el procesador de texto, la hoja de cálculo o el programa de creación de presentaciones, para que se adapten a necesidades concretas y específicas de funcionamiento, lo que conlleva un ahorro de tiempo de trabajo.

No obstante también exige que aprendamos en qué consisten y cómo se usan esos lenguajes, lo que supone un tiempo de aprendizaje y una práctica. Pero podemos contar con la existencia de ciertas funcionalidades, como Crear macro, que nos facilitan el primer acercamiento al uso del lenguaje de programación. Gracias a ellas podemos empezar a "crear programas" sin otras exigencias de las que conlleva aprender a usar esas funcionalidades. No son suficientes para aprender a programar, pero ayudan a iniciar el camino.

Este blog está pensado para ayudar a que ese proceso de aprendizaje sea más llevadero, pero sobre todo que sea más funcional, al estar centrado en la solución de necesidades profesionales concretas. No es, por tanto, un blog para aprender a programar, ni tampoco para aprender a programar en OOo Basic; se trata (eso pretendo) de un blog para ayudar a los orientadores educativos en concreto, pero en general a los diferentes componentes de los SEO, a crear soluciones informáticas, funcionales y ajustadas a sus necesidades profesionales concretas. Y por tales entiendo el manejo de la documentación prescriptiva y la creación de la que resulta de la práctica profesional.

Otra forma de entender el para qué de este blog, es la de verlo como un recurso para el desarrollo de la competencia digital de los componentes de los SEO, la cual presenta ciertas particularidades que hace que, a mi juicio, las propuestas y los planes de la Administración educativa resulten demasiado genéricos ( o se se prefiere, poco específicos), dejando sin cubrir lo que deriva de la especificidad de estos (y otros) servicios educativos.

jueves, 14 de marzo de 2024

Modelos de programación

Programación imperativa vs. programación estructurada.

Aunque sin entrar en explicaciones teóricas complejas, sobre las que el lector puede encontrar buenos textos en la web o consultar la bibliografía especializada, me interesa para el desarrollo de nuestros conocimientos de programación, iniciar esta sección sobre los modelos de programación, hablando, aunque sea brevemente, de dos modelos básicos de programación: la lineal (o imperativa) y la estructurada (también modular). Estas denominaciones pueden no ser estrictas desde la perspectiva de la teoría y la historia de los modelos de programación, pero es útil a mi objetivo, ya que permitirá diferenciar dos estrategias básicas (las dos de mayor uso en este blog).



Las
tres estrategias básicas de la programación son la linealidad o sucesión lineal, la bifurcación y la iteración. Con ellas se construyen los algoritmos que son, en lo fundamental, combinaciones más o menos complejas y más o menos extensa de estas tres estrategias, si bien, según el modelo de programación, primarán unas u otras. Por ejemplo, en la programación imperativa es fundamental el uso de la estrategia lineal.

En efecto, la programación imperativa, que yo voy a asimilar al concepto de linealidad (de ahí lo de programación lineal), es el modelo de programación más antiguo, según el cual un programa es una secuencia de instrucciones sucesivas. Integra también el uso de ciclos o bucles y condicionales, pero se caracteriza por el uso (a veces profusamente) de la instrucción GoTo.

Mediante GoTo (también GOTO) se redirige el programa a una posición determinada de la secuencia de instrucciones, en función de determinadas condiciones. Este modo de proceder es fuente de que lo que en principio se enuncia como simple, termine por convertirse en complejo, y sobre todo dificulta el seguimiento del programa.

Es el modelo de programación que subyace a los lenguajes Basic iniciales y hoy en día no se practica como tal modelo, debido a las dificultades de gestión y mantenimiento que genera el uso de GoTo y por requerir largas secuencias de instrucciones.

Como alternativa, surgió el modelo de programación estructurada (década de 1960), una de cuyas evoluciones a posteriori fue el modelo de programación modular.

Al contrario de la programación imperativa, en la programación estructurada no se hace uso de la sentencia GoTo, optando por el uso de subrutinas ejecutadas (eso sí) secuencialmente, y privilegiando el uso de las estructuras de control (condicionales, ciclos e iteraciones o ciclos con condición inicial)

Una evolución (según algunos autores) de la programación estructurada es la programación modular que se caracteriza por subdividir un programa en módulos o subprogramas a los que se recurre en función del desarrollo del algoritmo, lo que la diferencia de la programación estructurada, que mantiene el principio de linealidad en es uso de las subrutinas. Una ventaja añadida del modelo modular es la posibilidad de reutilizar código (módulos) en función de necesidades, lo que reduce la extensión del programa final.

Después de esta breve introducción, me interesa justificar su utilidad de cara a que entendamos el proceso de diferenciación que paulatinamente vamos a ver desarrollada cuando nos iniciemos, por ejemplo, en el conocimiento de los procedimientos de trabajo que vamos a desarrollar sobre OOo Basic.

También será de interés a la hora de analizar cómo trabajar de forma más funcional con el código que genera Grabar macro y nuestra conversión del mismo en subrutinas o en funciones diferenciadas.

Lo que no voy a hacer, en este caso, es ejemplificar en PSeInt estos dos (a grandes rasgos) modelos de programación: lineal vs. estructurada-modular (que es la diferenciación que realmente nos interesa) porque nos aporta poco desde esta perspectiva y porque lo tendremos que trabajar con cierta profundidad en los contextos que antes señalé.

miércoles, 13 de marzo de 2024

Presentación.

La programación como recurso para los SEO

Queda mucho para que la programación informática se considere parte de la competencia digital de los SEO; el estado actual de esta competencia está muy lejos de este objetivo, en mentalidad y en conocimientos, por lo que no se puede esperar que los orientadores asuman que el pensamiento computacional forma parte de su perfil competencial. 

La Administración educativa asume que esta competencia tiene carácter genérico, lo que, en la práctica, implica suponer que viene "de serie", con lo que no parece dispuesta a exigirla ni a considerarla específicamente como parte de la formación que ofrece. Y por lo visto, en la práctica, tampoco a dar ejemplo de su aplicación.

Por si éramos pocos, las muchas veces simplemente falsas promesas de la IA hacen aun más difícil que se plantee siquiera ese objetivo: ¿para qué aprender a programar si ya lo hace la IA?.

Nada de esto es cierto, al menos no en la forma simplista en que lo expreso, pero me temo que sea el planteamiento más frecuente, y no sólo en nuestro colectivo profesional. Sin duda la IA puede aportar mucho (menos de lo que pretende, posiblemente), pero no va a ser ninguna panacea, salvo que alguien interesado en el tema cree una IA específicamente diseñada para resolver estas nuestras necesidades. Mientras tanto, como tantas veces, podemos esperar sentados... o aprender a programar.

Saber programar supone un salto cualitativo fundamental para que los SEO sean competentes a la hora de crear las herramientas de trabajo  que necesitan, bien para automatizar la gestión de la documentación profesional, bien para crear herramientas que se ajusten a nuestras necesidades.

No es un proceso sencillo, ya que se requiere conocimiento y práctica, por lo que lleva tiempo. Pero tampoco es tan difícil en sus formas básicas pero suficientes para producir recursos que respondan satisfactoriamente a lo que necesitamos. Y para muestra el botón que ejemplifica el uso de los lenguajes de macros (script) basados y desarrollados sobre los propios documentos y pensados para automatizar su elaboración.

Con el objetivo de fundamentar el desarrollo de esta competencia (programar), he creído necesario empezar por el conocimiento de los elementos básicos del lenguaje OOo Basic. Estos conocimientos, además de necesarios para manejarse con este lenguaje, son en gran medida compartidos por todos los lenguajes de programación, con lo que sirve para futuros procesos de aprendizaje. Puedes encontrar estos conocimientos introductorios en la sección OOo Basic.

sábado, 15 de julio de 2023

OOo Basic. Script

Macros. Programación modular

Además de utilizar las macros como resultado de la ejecución de Grabar macro también podemos utilizarlas como elementos discretos a modo de subrutinas. Este enfoque se encuentra a medio camino entre la creación de macros y la escritura de script o programación. Ambos procedimientos pueden ser, además, complementarios. En todo caso remite a [lo que expuse] sobre la programación lineal o imperativa y la programación modular.



Es importante remarcar esa idea de complementariedad, ya que en informática (también) las cuestiones pueden se resolver de diferentes maneras (aunque unas pueden ser mejores que otras), así que lo que no sepamos resolver mediante un script, podemos abordarlo mediante una macro.

Pues bien, si en la [entrada anterior] aprendimos a identificar el contenido de una macro secuencial y a diferenciar diferentes funciones, en esta entrada vamos a profundizar en el modo de trabajo que podemos llamar programación modular que podemos caracterizar por el uso de secuencias de acciones (macros unitarias o de función única) combinadas. 

Este modo de trabajo admite la combinación entre macros unitarias y script, combinación que permite desarrollar programas de cierta complejidad. Algunos ejemplos de ello podemos verlos en [aquí]

Para el correcto desarrollo de un docap basado en este tipo de macros es necesario posicionar correctamente las variables básicas de toda macro, así como crear una macro específica en la que dichas variables se asocien a sus contenidos. Esta macro deberá ser llamada desde las macros individuales, permitiendo así su reutilización, con el consiguiente ahorro de tiempo.

A parte de esto, es importante crear colecciones de macros individuales, necesariamente asociadas al servicio-soporte, las cuales pueden ser aplicadas modularmente cuando sea necesario.

Aunque puede considerarse que es este un modo un tanto rudimentario de "programar", podemos decir que es similar al enfoque funcional y que algunos programas de cierta complejidad (FileMaker, por ejemplo) disponen de recursos de "programación" que, en síntesis, no son otra cosa que una colección amplia de funcionalidades, algo similar en filosofía a lo que aquí se plantea.


jueves, 2 de febrero de 2023

Contenidos. Modelos de programación.

POO. Conceptos básicos.

Para empezar, desde la perspectiva con la que estamos trabajando, podemos decir que la programación orientada a objetos (POO) es un desarrollo de la programación funcional en la que "empaquetamos" juntos (en una clase) una serie de variables que contienen datos relevantes sobre ese algo con el que queremos trabajar (atributos) y una serie de funciones, que ahora llamamos métodos y que representa el comportamiento típico e igualmente relevante de ese algo. Ese algo es la concreción de la clase y se llama objeto, que no es otra cosa que una instancia de la clase.


La clase es una abstracción y el objeto es su concreción. Como tal abstracción, la clase contiene la definición de las característica relevantes que se concretarán en casa objeto que instanciemos, además de las acciones o funciones potencialmente relevantes (para nuestro algoritmo) que después desarrollarán (o no y cuando resulte pertinente) los objetos que instanciemos.

La POO se acerca al modo en que funcionan las cosas en la realidad, lo que facilita el desarrollo de programas sostenibles y fáciles de mantener, compuesto por piezas simples y reutilizables que interaccionan entre si.

Además, al igual que sucede con la programación funcional, son pertinentes los conceptos de abstracción y encapsulamiento, ambos complementarios entre sí. Esta pertinencia refuerza la idea de que la POO está emparentada con la programación funcional:

  • Abstracción: Es posible utilizar una clase sin conocer cómo está implementada, siempre que sepamos cómo hacerla funcionar, lo que consigue mediante un contrato o conjunto de instrucciones.
  • Encapsulamiento: Este desconocimiento hace que la clase funciones como una caja negra, de modo que ignorar cómo está constituida no afecta a nuestra capacidad de utilizarla.
Basado en Alberto Cuevas(2016. img pag 185) 

Gracias a la aplicación de estos conceptos, es factible evitar el acceso no deseado a la configuración de las clases en el uso de los objetos instanciados, evitando alteraciones en su funcionamiento.

Otros dos conceptos fundamentales en la POO son la herencia y el polimorfismo:

  • Por herencia entendemos que una clase puede provenir de una super clase (clase o nivel de abstracción superior) o ser base para la creación de clases derivadas, secundarias o subclases. Entre la superclase, la clase y las subclases existe una relación que denominamos herencia por la cual las clases derivadas heredan las características de las clases de las que proceden.
  •  Finalmente, el polimorfismo (múltiples formas) permite que una característica (definida en la superclase) se concrete de forma diferente en cada una de las clases derivadas.
Para una mejor comprensión de los conceptos anteriores te propongo  este vídeo de BitBoss en You Tube.

jueves, 26 de enero de 2023

Modelos de programación

Programación funcional. Conceptos básicos

Hemos estado hablando de forma reiterada de funciones y es momento para detenernos brevemente en lo que implica su uso y el basarnos en ellas para desarrollar un algoritmo.




Trabajar con funciones consiste, en esencia, en subdividir un problema general en partes y afrontar cada una de esas partes de modo independiente. Reconstruir el todo consiste en desarrollar procedimientos para interrelacionar las partes dando respuesta al interrogante que inicialmente constituyó el todo.

Aunque esto pueda parecer muy abstracto, en realidad es una forma muy común de proceder cuando nos encontramos con problemas complejos. El famoso "vamos por partes..." no es más que la vulgarización de esta filosofía de trabajo.

Desde el punto de vista de la programación (que es lo que nos ocupa), el siguiente esquema representa el procedimiento de trabajo que supone aplicar el modelo o paradigma funcional.


A partir de un problema planteado genéricamente, vamos identificando sucesivamente las diferentes partes en que se puede ir descomponiendo, ideándolas como funciones, hasta llegar a la función más simple que ya no es necesario o no es posible descompones. Este procedimiento se denomina diseño de arriba a abajo y consiste en aplicar un proceso de refinamiento gradual o por etapas.

En esto consistiría la primera fase del desarrollo del proyecto, siendo la segunda el desarrollo de cada una de las funciones y su implementación en la estructura de relaciones que hemos representado esquemáticamente en la imagen anterior. Este segundo proceso se puede desarrollar, a su vez, mediante dos estrategias básicas:
  • De arriba a abajo
  • de abajo a arriba
Las ventajas de este modo de trabajar se pueden sintetizar como sigue:
  • Simplifica la resolución de problemas complejos.
  • Facilita la comprensión del algoritmo
  • Simplifica la realización de pruebas y la depuración del código
  • Permite reutilizar código
  • Reduce el tiempo de escritura del programa
  • Genera programas más fáciles de mantener y de modificar
  • Facilita trabajar en grupo y la propia organización de este modo de trabajo.
La programación funcional hace uso intensivo de dos conceptos que podemos considerar interrelacionados: abstracción y encapsulamiento.

Aplicándola a la programación funcional, entendemos por abstracción la cualidad que posee una función de poder diferenciar su definición de su uso. Definir una función implica saber cómo es su funcionamiento interno. La abstracción nos permite desconocer dicho funcionamiento sin que ello afecte al uso de la función, siempre que respetemos su forma de funcionar. 

Desde esta perspectiva, la función se comporta como una caja negra (encapsulamiento), de modo que desconocer su código no nos impide beneficiarnos de su funcionalidad. Si la función es mejorada, seguiremos ajenos a su conocimiento, pero nos beneficiaremos de esta mejora igualmente. Esto tiene muchas ventajas (ver el listado anterior), siendo posible, por ejemplo, diferenciar el trabajo de los diferentes creadores del código, y el de estos del que precisa un usuario. También hace posible realizar mejoras parciales sin afectar al funcionamiento general del programa.

Para finalizar esta breve incursión por la programación funcional, decir que existen funciones recursivas que son especialmente interesantes por simplificar procesos de programación que, de realizar de modo lineal, supondría aplicar complejos procesos iterativas. Una función recursiva es sencillamente aquella que se llama a si misma. Veamos un sencillo ejemplo realizado en Python:

def factorial(n):
    if n==0:
        return 1
    else:
        return n * factorial(n-1) # En este punto se produce la reutilización de la función
   dentro de la misma función (recursividad)

def main():
    n=eval(input("Introduce un entero positivo para calcular su factorial: "))
    print("El factorial de ", n , " es ", factorial(n))

main()  

lunes, 7 de noviembre de 2022

Contenidos. Programación.

Programación modular

Cuando un programa, una aplicación o como sea pertinente o preferible llamarlo, es de cierta complejidad, ésta se refleja en su extensión en número de líneas, pero y también, en su complejidad. Dentro de estos dos parámetros podemos incluir la repetición de una serie de líneas de código con funcionalidad específica que se pueden identificar como unidades de acción.




Cuando tomamos estas unidades de acción como objeto de análisis y trabajo, y las aislamos del desarrollo del script principal y los llamamos desde éste, pasamos de trabajar siguiendo un modelo lineal de programación a un modelo modular. Este modelo supone una simplificación de los procedimientos de trabajo y una economía de tiempo, y es posible porque estos segmentos de código pueden ser llamados desde el algoritmo principal tantas veces como sea necesario, ahorrando así su repetición.

El modelo modular no rompe la lógica del modelo lineal, simplemente hace más eficiente nuestro algoritmo, más sostenible y más robusto. Además, esos segmentos pueden ser reutilizados en otros programas o aplicaciones, lo que incrementa nuestra eficiencia a la hora de desarrollar proyectos.

En líneas generales, el comportamiento de estos módulos que llamaremos funciones, en sentido general, por cumplir una función específica, presentan estos comportamientos:

  • En este esquema he representado el script principal y dos funciones que son empleadas por dicho script. La fecha verde representa el discurrir del algoritmo, que, como se puede ver, sigue un proceso lineal (de arriba abajo), tal y como representan esas flechas .
  • La función Secundario A toma el control del flujo en el momento en que es llamada (en ese momento es A quien determina qué hace nuestro algoritmo), finaliza su cometido y devuelve (por decirlo de alguna manera) el control al script principal, que reanuda el control del desarrollo del algoritmo
  • La función Secundario B es llamada (utilizada) por el script principal, se ejecuta y devuelve al script principal el resultado de su propio procesamiento, pero no toma el control del desarrollo del algoritmo, que sigue siendo responsabilidad del script principal.
Esta simplificación nos permite apreciar el modo en que funciona la relación entre el programa principal y sus auxiliares; también nos muestra que existen diferentes formas de concretarse el papel de estos auxiliares, aunque depende del lenguaje de programación que estemos empleando.