Un ingeniero de software debe entender los conceptos de calidad, las características, los valores y su aplicación al software que se está desarrollando o manteniendo. El concepto importante es que los requisitos del software definen los atributos de calidad requeridos del software. Los requisitos del software influyen en los métodos de medición y los criterios de aceptación para evaluar el grado en que el software y la documentación relacionada alcanzan los niveles de calidad deseados.
Paradigmas de Programación. (s. f.). https://ele.chaco.gob.ar/pluginfile.php/1072964/mod_resource/content/1/Programaci%C3%B3n%20Imperativo%20y%20Declarativo.pdf
De acuerdo a la definición de Alonso Amo, F. Martínez Normand, L. y Segovia Pérez, J. (2005). "Un paradigma de programación es un modelo básico de construcción de programas. Un modelo que permite producir programas conforme con unas directrices específicas, tales como diseñar un programa mediante una secuencia de instrucciones que operan sobre unos datos de entrada y producen un resultado de salida, etc."
Un paradigma de programación indica un método de realizar cómputos y la manera en que se deben estructurar y organizar las tareas que debe llevar a cabo un programa.
Programar es mucho más complejo que definir una serie de instrucciones para ser
ejecutadas por una computadora. La programación generalmente es tan diversa como
uno se lo pueda imaginar. A esta diversidad en el mundo de la programación se le conoce
como paradigmas o estilos de programación. Las características de un lenguaje de
programación dictaminan el paradigma al cual pertenece.
Segun Ambler (1992), determina que un "Paradigma de Programación es, pues, una colección de modelos conceptuales que juntos modelan el proceso de construcción de un programa y determinan, al final, su estructura"
Elaboración propia
Los paradigmas de programación los podemos dividir en Paradigma
Imperativo, Paradigma declarativo, Paradigma Funcional y Paradigma Orientado a Objetos.
Se basa en dar instrucciones a la computadora de cómo hacer las cosas en forma de algoritmos. En este paradigma se expresa como debe solucionarse un problema especificando una secuencia de acciones a realizar a través de uno o más procedimientos denominados subrutinas o funciones.
Elaboración propia
PROGRAMACIÓN PROCEDIMENTAL
Divide las tareas de las que se debe ocupar un programa en tareas parciales más pequeñas que se describen en el código por separado. Estos se denominan como procedimientos, dependiendo del lenguaje de programación, o también como subprogramas, rutinas o funciones. El sentido y el propósito de esta distribución es hacer que el código de programa sea más claro y evitar las repeticiones innecesarias de código. De esta forma, se crean principios básicos de programación que también se pueden reutilizar en otros programas.
Elaboración propia
Esta basado en el concepto de "llamado de procedimientos", tambien conocido como rutinas, subrutinas, metodos o funciones que contienen una serie de pasos computacionales. Cualquier procedimiento puede ser llamado en cualquiero punto durante la ejecución del programa, incluyendo otros procedimientos o el mismo.
LENGUAJES DE PROGRAMACIÓN POR PROCEDIMIENTOS
C
Basic
COBOL
Matlab
Pascal
PROGRAMACIÓN MODULAR
La programación modular es la técnica de programación basada en la filosofía del diseño descendente, que consiste en
dividir el problema original en diversos subproblemas (y estos a su vez en otros más pequeños, obteniendo una
estructura jerárquica o en árbol) que se pueden resolver por separado, para después recomponer los resultados y obtener
la solución al problema. Un subproblema se denomina módulo y es una parte del problema que se puede resolver de
manera independiente
Cada uno de los componentes de programa se diseña, desarrollan y prueban con total
independencia los unos de los otros. El código fuente se divide específicamente en
bloques parciales lógicos independientes los unos de los otros para proporcionar
más transparencia y facilitar el proceso de debugging (resolución de errores). Los bloques
parciales individuales, denominados módulos, se pueden probar por separado antes de
vincularlos posteriormente a una aplicación conjunta.
Un módulo es una colección estática de declaraciones definidas
en un ámbito de visibilidad particular y oculto al resto del
programa con el que se comunica por una sección de interfaz
donde se incluyen la lista de exportaciones. Usando módulos
se construyen las unidades en que se ha de descomponer
cualquier programa mínimamente importante. Los módulos
se conectan entre sí dando lugar a una estructura modular en
árbol que permite resolver el problema de programación
planteado.
Un módulo actúa como una caja negra con la cual el resto del
programa interactúa a través de una sección de interfaz. La
interfaz (o vista pública) es una colección de declaraciones de
constantes, tipos, variables, procedimientos, funciones, etc. La
otra sección principal de un módulo es la implementación (o vista privada) que incluye el código de los procedimientos y demás elementos constitutivos de la parte ejecutable del
módulo.
A medida que un programa aumenta de tamaño, aumenta a su vez la complejidad para
leerlo, su tiempo de desarrollo, de mantenimiento y disminuye su calidad si no se tiene un
correcto orden y estructura del programa.
Es por esto que surgió un paradigma de programación llamado programación
estructurada, que consiste en mejorar la claridad, calidad y acelerar el tiempo de
desarrollo, utilizando únicamente subrutinas y 3 estructuras de control: Secuencial, de
Selección (IF y SWITCH) y de Iteración (ciclos FOR y WHILE).
La programación estructurada es una teoría de programación que consiste en construir
programas de fácil comprensión, es especialmente útil, cuando se necesitan realizar
correcciones o modificaciones después de haber concluido un programa o aplicación. Al
utilizar la programación estructurada, es mucho más sencillo entender la codificación del
programa, que se habrá hecho en diferentes secciones.
Se basa en una metodología de desarrollo de programas llamada refinamiento sucesivos:
Se plantea una operación como un todo y se divide en segmentos más sencillos o de
menor complejidad, una vez terminado todos los segmentos del programa, se procede a
unificar las aplicaciones realizadas por el grupo de programadores. Si se ha utilizado
adecuadamente la programación estructurada, esta integración debe ser sencilla y no
presentar problemas al integrar la misma, y de presentar algún problema, será
rápidamente detectable para su corrección.
La representación gráfica de la programación estructurada se realiza a través de
diagramas de flujo, el cual representa el programa con sus entradas, procesos y salidas.
La programación estructurada propone segregar los procesos en estructuras lo más simple
posibles, las cuales se conocen como secuencia, selección e interacción, que están
disponibles en todos los lenguajes modernos de programación imperativa en forma de
sentencias, combinando esquemas sencillos se pueden llegar a construir sistemas amplios
y complejos pero de fácil entendimiento.
Para la solución de un problema en particular, se inicia considerando las funciones que
tiene que cumplir el programa en general y después se va desmembrando estas funciones
en subfunciones más pequeñas hasta llegar al caso último o más particular y que ya no se
pueda subdividir en casos más pequeños. Una vez que ya se tiene el programa
desmembrado de lo general a lo particular, se empieza a programar estas funciones
pequeñas, particulares o módulos, de esta manera, siempre podremos construir nuevos módulos o unidades insertando el nombre del módulo donde corresponda y
desarrollándolo a parte.
La modificación de los módulos es más fácil y se pueden referenciar cuantas veces se
requiera, con lo que se ahorra tiempo en la programación, un programa tiene un diseño
estructurado si cumple las dos siguientes condiciones:
El teorema de Estructura
Está debidamente documentado
El teorema de Estructura dice que “un programa cumple el teorema de estructura si y sólo
(ó) si es propio y contiene únicamente las tres estructuras básicas de control” que son la
secuencial, la alternativa y la repetitiva, un programa es propio si y sólo si cumple: que
tenga un solo punto de entrada y un solo punto de salida y que entre dos puntos de
control del programa exista al menos un camino.
La programación estructurada es un estilo con el cual él se busca que el programador
elabore programas sencillos y fáciles de entender, la programación estructurada hace uso
de tres estructuras básicas de control que son: Estructura Secuencial, Estructura Selectiva
y la Estructura Repetitiva (ó Iterativa)
La programación estructurada se basa un teorema fundamental, el cual afirma que
cualquier programa, no importa el tipo de trabajo que ejecute, puede ser elaborado
utilizando únicamente las tres estructuras básicas.
Estructura Secuencial: Indica que las instrucciones de un programa se ejecutan una
después de la otra, en el mismo orden en el cual aparecen en el programa. Se representa
gráficamente como una caja después de otra, ambas con una sola entrada y una única
salida.
Estructura Selectiva: También conocida como la estructura: verdadero - falso, plantea
la selección entre dos alternativas con base en el resultado de la evaluación de una
condición; equivale a la instrucción IF de todos los lenguajes de programación
Estructura Repetitiva (Iterativa): También llamada la estructura hacer – mientras - que,
corresponde a la ejecución repetida de una instrucción mientras que se cumple una
determinada condición.
PARADIGMA DECLARATIVO
La programación declarativa un programa se describe en términos de proposiciones y
afirmaciones que son declaradas para describir el problema, sin especificar los pasos para
resolverlo; en este tipo de programas, el estado no puede ser modificado ya que todos los
tipos de datos son inmutables.
Consiste en decirle a un programa lo qué tiene que hacer en lugar de decirle cómo debería
hacerlo.
En este tipo de paradigmas, un programa se construye mediante hechos, reglas, restricciones, ecuaciones, transformaciones y otras propiedades derivadas del con- junto de valores que configuran la solución. A partir de esta información, el sistema informático debe proporcionar la estruc- tura de control apropiada que incluya el orden de evaluación del programa que compute una solución. Aquí no existe la necesidad de describir las diferentes eta- pas a seguir para alcanzar una solución como en el caso procedimental. (Alonso Amo, F. Martínez Normand, L. y Segovia Pérez, J, 2005, p. 23).
En la práctica, este enfoque implica proporcionar un lenguaje específico de
dominio (DSL, del inglés Domain-specific lenguage) para expresar lo qué el usuario quiere
y resguardarlos de las arquitecturas o construcciones de bajo nivel (bucles, condicionales,
asignaciones) que materializan el estado final deseado.
La programación declarativa es un término que agrupa los siguientes paradigmas de
programación:
Programación lógica: la
programación lógica es una programación por
descripción. El programa se construye describiendo
el área de aplicación, esto es, se señala el qué se
desea (mediante hechos que son verdaderos) pero no
el cómo obtenerlo, esto está implícito. Un programa lógico se configura
como un conjunto de hechos (asertos o
4
proposiciones), y de reglas lógicas previamente
establecidas, que obtienen conclusiones en base a una
serie de preguntas lógicas. El control es inherente al
sistema, el que permite investigar las preguntas
lógicas. Esta capacidad es el concepto clave que
subyace en la Programación Lógica (descriptiva). Al
separar el control y la lógica, el programa lógico se
transforma en un conjunto de declaraciones formales
de especificaciones que deben ser correctas por
definición.
Programación funcional: Todo se resuelve por medio de la evaluación de funciones
matemáticas. Es un estilo de programación cuyo método básico es la aplicación de
funciones a sus argumentos.
Lenguajes de dominio específico (DSLs). Lenguajes descriptivos para un propósito
específico, tales como HTML, CSS («Hojas de estilo en cascada», es un lenguaje de
diseño gráfico) y SQL (el lenguaje SQL sirve para el acceso a la información
almacenada en las bases de datos. Es un lenguaje sencillo de consulta, que permite
realizar operaciones de selección, inserción, actualización y borrado de datos, así
como operaciones administrativas sobre las bases de datos).
Tomado de:
Paradigmas de Programación. (s. f.). https://ele.chaco.gob.ar/pluginfile.php/1072964/mod_resource/content/1/Programaci%C3%B3n%20Imperativo%20y%20Declarativo.pdf
PARADIGMA FUNCIONAL
El paradigma funcional de tipo procedimental, está basado en el modelo matemá- tico de composición funcional. En este modelo, el resultado de un cálculo es la entrada del siguiente, y así sucesivamente hasta que la composición produce el resultado deseado. (Alonso Amo, F. Martínez Normand, L. y Segovia Pérez, J, 2005, p. 33)
Transparencia referencial
Decir que una función tiene transparencia referencial, quiere decir que se comporta como una función matemática, en el sentido de que si recibe un valor de entrada siempre producirá el mismo valor de salida, y que el resultado del cálculo de la función únicamente se devuelve por el nombre de la función y no por alguno de sus argumentos.
Funciones de orden superior
La programación funcional incorpora también el concepto de función de orden superior como objeto de primera clase, lo que significa que las funciones pueden ser tratadas como datos (pueden pasarse como parámetros, ser calculadas y devueltas como valores normales, y mezcladas en el cálculo con otras formas de datos). El carácter de orden superior es una característica fundamental que tienen que tener las funciones que participen en la construcción de un programa funcional.
Tipos de datos en la programación funcional
En general, los programas funcionales utilizan muy pocos tipos de datos primarios o básicos. Los más usuales son:
Datos atómicos, que son números enteros, reales, booleanos y cadenas de carac- teres. Ejemplo: 28, 43.76, T (cierto) ó NIL (falso), Programación, Vicente.
Identificadores, que son los nombres de las variables y de las funciones. Ejemplo: x, suma(x).
Listas. Conjuntos de elementos que corresponden a un tema común. Ejemplo: La lista de alumnos de una clase (Luis Pérez, Andrés Martínez, Rosa Gómez, ...).
Programas Funcionales
Un programa funcional es pues, “un conjunto compuesto de funciones que juntas definen un objetivo específico de aplicación”. El concepto de función, desde el punto de vista informático, es una pieza indivi- dual de codificación que siempre efectúa el mismo conjunto de operaciones, pero que puede operar con diferentes datos, y proporcionar algún tipo de resultado, que se conoce como "valor de la función".
La Orientación a Objetos está constituyendo una filosofía de diseño y desarrollo de software de gran trascendencia para la producción de software eficiente y barato. Su modelo de análisis, diseño y programación, que configura las fases funda- mentales del ciclo de vida de un sistema informático, se ha asentado como la estructura metodológica de los años 90, y se presenta educacionalmente como paradigmática en el desarrollo de aplicaciones.
La Orientación a Objetos se puede definir como ʺuna disciplina de ingeniería de desarrollo y modelado de software que permite construir más fácilmente sistemas complejos a partir de componentes individualesʺ [Khoshafian, 1990].
La Orientación a Objetos proporciona mejores herramientas para:
• Modelar el mundo real de un modo más cercano a la perspectiva del usuario.
• Interactuar fácilmente con un entorno computacional, usando metáforas fami- liares.
• Construir componentes reutilizables de software y librerías específicas de estos componentes fácilmente extensibles.
• Modificar y ampliar con facilidad la implementación de estos componentes sin afectar al resto de su estructura.
En cuanto a los elementos fundamentales que configuran el Paradigma Orientado a Objetos, algunos autores [Khoshafian, 1990] los centran en tres:
Los Tipos Abs- tractos de Datos, La Herencia y la Identidad de los Objetos. Mientras que otros [Meyer, 1988] señalan siete aspectos básicos a considerar para una verdadera orien- tación al objeto:
• Estructura modular basada en objetos, dado que los sistemas en esta metodología son modularizados sobre la base de sus estructuras de datos.
• Abstracción de Datos, porque los objetos se describen como implementaciones de tipos de datos abstractos.
• Gestión automática de memoria, de forma que los objetos no utilizados sean desasignados por el propio sistema sin intervención del programador.
• Clases, en las que cada tipo abstracto no simple sea un módulo.
• Herencia, que permita que una clase sea definida como una extensión o restric- ción de otra.
• Polimorfismo y enlace dinámico, de forma que las entidades del programa pue- dan referenciar en tiempo de ejecución a objetos de diferentes clases.
• Herencia múltiple para que se pueda declarar una clase como herencia de varias.
Lenguajes OO
Algunos lenguajes orientados a objetos, como C++, Object LISP, etc., son estén- siones de lenguajes convencionales que fueron diseñados básicamente como imperativos, por lo que estas extensiones no consideran a los objetos como entida- des activas que reciben mensajes, más bien invocan a procedimientos o funciones que pasan objetos; no obstante, incorporan las características más relevantes del PaOO, en particular: la encapsulación de datos, el polimorfismo con enlace dinámi- co, la genericidad y la herencia.
Alonso Amo, F. Martínez Normand, L. y Segovia Pérez, J. (2005). Introducción a la Ingeniería del Software: modelos de desarrollo de programas. Madrid, Delta Publicaciones. Recuperado de https://elibro.net/es/ereader/biblioibero/170188?page=82.
Los lenguajes de construcción incluyen todas las formas de comunicación mediante las cuales un humano puede especificar una solución ejecutable a un problema. Los lenguajes de construcción y sus implementaciones (por ejemplo, los compiladores) pueden afectar a los atributos de calidad del software en cuanto a rendimiento, fiabilidad, portabilidad, etc. Pueden contribuir seriamente a las vulnerabilidades de seguridad.
El tipo más sencillo de lenguaje de construcción es un lenguaje de configuración, en el que los ingenieros de software eligen entre un conjunto limitado de opciones predefinidas para crear instalaciones de software nuevas o personalizadas. Los archivos de configuración basados en texto que se utilizan en los sistemas operativos Windows y Unix son ejemplos de ello, y las listas de selección tipo menú de algunos generadores de programas constituyen otro ejemplo de lenguaje de configuración.
Los lenguajes de conjuntos de herramientas se utilizan para construir aplicaciones a partir de elementos de conjuntos de herramientas (conjuntos integrados de partes reutilizables específicas de la aplicación); son más complejos que los lenguajes de configuración.
Los lenguajes de conjuntos de herramientas pueden definirse explícitamente como lenguajes de programación de aplicaciones, o las aplicaciones pueden estar simplemente implícitas en el conjunto de interfaces de un conjunto de herramientas.
Los lenguajes de scripting son tipos de lenguajes de programación de aplicaciones muy utilizados. En algunos lenguajes de scripting, los scripts se denominan archivos por lotes o macros.
Los lenguajes de programación son el tipo de lenguajes de construcción más flexible. También contienen la menor cantidad de información sobre áreas de aplicación y procesos de desarrollo específicos, por lo que son los que requieren más formación y destreza para su uso eficaz. La elección del lenguaje de programación puede tener un gran efecto en la probabilidad de que se introduzcan vulnerabilidades durante la codificación- por ejemplo, el uso acrítico de C y C++ son elecciones cuestionables desde el punto de vista de la seguridad.
Hay tres tipos generales de notación utilizados para los lenguajes de programación:
- lingüística (por ejemplo, C/C++, Java)
- formal (por ejemplo, Event-B)
- visual (por ejemplo, MatLab)
Las notaciones lingüísticas se distinguen, en particular, por el uso de cadenas textuales para representar construcciones de software complejas. La combinación de cadenas textuales en patrones puede tener una sintaxis similar a la de una frase. Si se utiliza correctamente, cada cadena de este tipo debe tener una fuerte connotación semántica que proporcione una comprensión intuitiva inmediata de lo que sucederá cuando se ejecute la construcción de software.
Las notaciones formales se basan menos en los significados intuitivos y cotidianos de las palabras y las cadenas de texto y más en definiciones respaldadas por definiciones precisas, inequívocas y formales (o matemáticas).
Las notaciones de construcción formal y los métodos formales son la base semántica de la mayoría de las notaciones de programación de sistemas, en las que la precisión, el comportamiento en el tiempo y la capacidad de comprobación son más importantes que la facilidad de adaptación al lenguaje natural. Las construcciones formales también utilizan formas definidas con precisión para combinar símbolos que evitan la ambigüedad de muchas construcciones en lenguaje natural.
Las notaciones visuales se basan mucho menos en las notaciones textuales de las construcciones lingüísticas y formales y, en cambio, se basan en la interpretación visual directa y en la colocación de entidades visuales que representan el software subyacente.
La construcción visual tiende a estar algo limitada por la dificultad de hacer declaraciones "complejas" utilizando sólo la disposición de iconos en una pantalla. Sin embargo, estos iconos pueden ser herramientas poderosas en los casos en los que la tarea principal de programación es simplemente construir y "ajustar" una interfaz visual para un programa, cuyo comportamiento detallado tiene una definición subyacente.