Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La capacidad de reconocer objetos físicos es una habilidad que los humanos aprenden en edades
muy tempranas. Una pelota de colores llamativos atraerá la atención de un niño, pero casi
siempre, si se esconde la pelota, el niño no intentará buscarla; cuando el objeto abandona su
campo de visión, hasta donde él puede determinar, la pelota ha dejado de existir. Normalmente,
hasta la edad de un año un niño no desarrolla lo que se denomina el concepto de objeto, una
habilidad de importancia crítica para el desarrollo cognitivo futuro. Muéstrese una pelota a un
niño de un año y escóndase a continuación, y normalmente la buscará incluso si no esta visible. A
través del concepto de objeto, un niño llega a darse cuenta de que los objetos tienen una
permanencia e identidad además de cualesquiera operaciones sobre ellos. Informalmente
podemos entender un objeto como una entidad tangible que exhibe algún comportamiento bien
definido. Desde la perspectiva de la cognición humana, un objeto es cualquiera de las siguientes
cosas:
Clases
Para comprender la naturaleza de una clase, se deberán considerar dos niveles de definición:
El abstracto y el de instrumentación.
El nivel abstracto de una clase proporciona la esencia de la clase. En seguida se define una clase en
el nivel abstracto. En el nivel abstracto, una clase se describe como una interfaz que define el
comportamiento de sus objetos.
Una clase se puede describir como una interfaz, porque su propósito principal es describir las
operaciones, o funciones, que pueden realizar sus objetos. De esta manera, se define el
comportamiento común para todos sus objetos. Por comportamiento, se entiende cómo actúa y
reacciona un objeto de una clase dada cuando se acceda
Una abstracción denota las características esenciales de un objeto que lo distinguen de todos los
demás tipos de objeto y proporciona así fronteras conceptuales nítidamente definidas respecto a la
perspectiva del observador.
Una abstracción se centra en la visión externa de un objeto y, por tanto, sirve para separar el
comportamiento esencial de un objeto de su implantación.
Seidewitz y Stara sugieren que «existe una gama de abstracción, desde los objetos que modelan
muy de cerca entidades del dominio del problema a objetos que no tienen una verdadera razón
para existir». De mayor a menor utilidad, estos tipos de abstracción incluyen:
• Abstracción de entidades. Un objeto que representa un modelo útil de una entidad del dominio
del problema o del dominio de la solución.
• Abstracción de máquinas. Un objeto que agrupa operaciones, todas ellas virtuales utilizadas por
algún nivel superior de control, u operaciones que utilizan todas algún conjunto de operaciones de
nivel inferior.
Encapsulamiento
Dicho sencillamente, la abstracción de un objeto debería preceder a las decisiones sobre su
implementación. Una vez que se ha seleccionado una implantación, debe tratarse como un
secreto de la abstracción, oculto para la mayoría de los clientes. Como sugiere sabiamente Ingalls,
«ninguna parte de un sistema complejo debe depender de los detalles internos de otras partes».
Mientras que la abstracción «ayuda a las personas a pensar lo que están haciendo», el
encapsulamiento «permite que los cambios hechos en los programas sean fiables con el menor
esfuerzo».
Para comprender como funciona la fotosíntesis a un nivel alto de abstracción, se pueden ignorar
detalles como los cometidos de las raíces de la planta o la química de las paredes de las células.
Análogamente, al diseñar una aplicación de bases de datos, es práctica común el escribir programa
de forma que no se preocupen de la representación física de los datos, sin que dependan solo de
un esquema que denota la vista lógica de los mismos. Los objetos a un nivel de abstracción están
protegidos de los detalles de implementación a niveles más bajos de abstracción.
La abstracción es la clave para diseñar buen software. En los primeros días de la informática, los
programadores enviaban instrucciones binaras a una computadora, manipulando directamente
interrupciones en sus partes frontales. Los nemotécnicos del lenguaje ensamblador eran
abstracciones diseñadas para evitar que los programadores tuvieran que recordar las secuencias
de bits que componen las instrucciones de un programa. El siguiente nivel de abstracción se
consigue agrupando instrucciones primitivas para formar macroinstrucciones.
Por ejemplo, un conjunto se puede definir por abstracción como una colección no ordenada de
elementos en el que no existen duplicados. Utilizando esta definición, se puede especificar si sus
elementos se almacenan en un array, una lista enlazada o cualquier otra estructura de datos.
Un conjunto de instrucciones realizadas por un usuario se pueden invocar por un
macroinstrucción; un macroinstrucción instruye a la máquina para que realice muchas cosas.
El desarrollo de software va unido a un ciclo de vida compuesto por una serie de etapas que
comprenden todas las actividades, desde el momento en que surge la idea de crear un nuevo
producto software, hasta aquel en que el producto deja definitivamente de ser utilizado por el
último de sus usuarios.
La definición de un ciclo de vida facilita el control sobre los tiempos en que es necesario
aplicar recursos de todo tipo (personal, equipos, suministros, etc.) al software, a continuación
dos conceptos:
“Un marco de referencia que contiene los procesos, las actividades y las tareas involucradas en
el desarrollo, la explotación y el mantenimiento de un producto de software, abarcando la vida
del sistema desde la definición de los requisitos hasta la finalización de su uso” ISO 12207-15
Expresión de necesidades.
Esta etapa tiene como objetivo la consecución de un primer documento en que queden reflejados
los requerimientos y funcionalidades que ofrecerá al usuario del sistema a desarrollar (qué, y no
cómo, se va a desarrollar).
Dado que normalmente se trata de necesidades del cliente para el que se creará la aplicación, el
documento resultante suele tener como origen una serie de entrevistas cliente-proveedor
situadas en el contexto de una relación comercial, siendo que debe ser comprendido por ambas
partes (puede incluso tomarse como base para el propio acuerdo comercial).
Especificaciones.
Por medio de esta etapa se obtendrá un nuevo documento que definirá con más precisión el
sistema requerido por el cliente (el empleo de los casos de uso, use cases, de Jacobson es una muy
buena elección para llevar a cabo la especificación del sistema).
Lo más normal será que no resulte posible obtener una buena especificación del sistema a la
primera; serán necesarias sucesivas versiones del documento en que irán quedando reflejada la
evolución de las necesidades del cliente (por una parte no siempre sabe en los primeros contactos
todo lo que quiere realmente, y por otra parte pueden surgir cambios externos que supongan
requerimientos nuevos o modificaciones de los ya contemplados).
Análisis.
• Funcional.
• Estático.
• Dinámico.
• Diseño
Diseño
Tras la etapa anterior ya se tiene claro que debe hacer el sistema, ahora tenemos que determinar
como va a hacerlo (¿cómo debe ser construido el sistema?; aquí se definirán en detalle entidades
y relaciones de las bases de datos, se pasará de casos de uso esenciales a su definición como casos
expandidos reales, se seleccionará el lenguaje más adecuado, el Sistema Gestor de Bases de Datos
a utilizar en su caso, librerías, configuraciones hardware, redes, etc.).
Aunque todo debe ser tratado a su tiempo, y sería muy deseable que las decisiones
correspondientes en esta etapa fueran tomadas precisamente en esta etapa, muchas veces nos
vamos a encontrar con unas decisiones previamente impuestas sobre lenguaje, plataforma, etc.
Unas veces se dirán justificadas en simple política de empresa y por mantener "compatibilidad" en
lo que respecta a los demás proyectos de la propia empresa, y en otras ocasiones por rumores de
que tal o cual herramienta mejoraría la velocidad de desarrollo u otro aspecto de interés (en parte
de los casos no serán rumores con fundamento o estudios previos realizados al efecto, sino más
bien debidos a la propia publicidad como consejera).
Implementación.
Llegado este punto se empieza a codificar algoritmos y estructuras de datos, definidos en las
etapas anteriores, en el correspondiente lenguaje de programación y/o para un determinado
sistema gestor de bases de datos.
Lamentablemente en la actualidad, quedan bastantes empresas en las que, tras una reunión
comercial en que tan solo se ha conseguido recabar una breve lista de requerimientos, a pesar de
tener que enfrentarse a proyectos grandes-medios, se pasa directamente a la etapa de
implementación; son proyectos guiados por el riesgo que supone adoptar un modelo de ciclo de
vida de codificar-corregir (code and fix) donde se eliminan las fases de especificaciones, análisis y
diseño con la consiguiente pérdida de control sobre la gestión del proyecto.
Pruebas.
El objetivo de estas pruebas es garantizar que el sistema ha sido desarrollado correctamente, sin
errores de diseño y/o programación. Es conveniente que sean planteadas al menos tanto a nivel
de cada módulo (aislado del resto), como de integración del sistema (según sea la naturaleza del
proyecto en cuestión se podrán tener en cuenta pruebas adicionales, p.e. de rendimiento).
Validación.
Esta etapa tiene como objetivo la verificación de que el sistema desarrollado cumple con los
requisitos expresados inicialmente por el cliente y que han dado lugar al presente proyecto (para
esta fase también es interesante contar con los use cases, generados a través de las
correspondientes fases previas, que servirán de guía para la verificación de que el sistema cumple
con lo descrito por estos).
Mantenimiento y Evolución.
El análisis orientado a objetos es un método de análisis que examina los requisitos desde la
perspectiva de las clases y objetos que se encuentran en el vocabulario del dominio del problema
La programación orientada a objetos permite una representación más directa del modelo de
mundo real en el código. El resultado es que la transformación radical normal de los requisitos de
sistema (definido en términos de usuario) se reduce considerablemente.
Los elementos más importantes que deben tener los objetos de software que sirven como base
sobre las cuales se fundamenta la programación orientada a objetos, para cumplir con el
paradigma de orientación a objetos son:
• Abstracción
• Encapsulamiento
• Modularidad.
• Herencia y Jerarquía.
• Polimorfismo.
Cada uno de estos puntos requiere de una actitud mental diferente, una forma distinta de pensar
en el problema. Para todas las cosas orientadas a objetos, el marco de referencia conceptual es el
modelo de objetos.
1.5.1 Abstracción.
La abstracción es uno de los medios más importantes, mediante el cual nos enfrentamos con la
complejidad inherente al software. La abstracción es el proceso de simplificar un problema
complejo. Al abordar la solución de un problema, uno no se abruma con cada uno de los detalles,
mas bien, lo simplifica enfocándose tan sólo en los aspectos relevantes para la solución.
Una abstracción se centra en la vista externa de un objeto, de un modo que sirva para separar el
comportamiento esencial de un objeto de su implementación. Definir una abstracción significa
describir una entidad del mundo real, no importa lo compleja que pueda ser, y a continuación
utilizar esta descripción en un programa.
El elemento clave de la programación orientada a objetos es la clase. Una clase se puede definir
como una descripción abstracta de un grupo de objetos, cada uno de los cuales se diferencia por
su estado específico y por la posibilidad de realizar una serie de operaciones. Por ejemplo, un
pluma estilográfica es un objeto que tienen un estado (llena de tinta o vacía) y sobre la cual se
pueden realizar algunas operaciones (por ejemplo escribir, poner o quitar el capuchón, llenar de
tinta si está vacía).
La idea de escribir programas definiendo una serie de abstracciones no es nueva, pero el uso de
clases para gestionar dichas abstracciones en lenguajes de programación ha facilitado
considerablemente su aplicación.
1.5.2 Encapsulamiento.
1.5.3 Modularidad.
La modularidad es la propiedad que permite subdividir una aplicación en partes más pequeñas
(llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la
aplicación en si y de las restantes partes.
La naturaleza está llena de herencia. Todas las cosas vivas heredan las características o rasgos de
sus antepasados. Aunque usted es diferente de sus padres en muchos sentidos, también es igual
en muchas formas debido a los rasgos genéticos que ha heredado de ellos. En la programación
orientada a objetos, la herencia permite que las clases recién creadas hereden miembros de clases
existentes. Estas nuevas clases derivadas o hijos, incluirán sus propios miembros y miembros
heredados de las clases base o padres. De esta manera, es posible ver una colección de clases con
miembros heredados comunes como una familia de clases, como aquélla a la que usted
pertenece. Las clases se relacionan una con otra a través de la herencia. Tal herencia crea una
jerarquía de clase.
La jerarquía es una propiedad que permite una ordenación de las abstracciones. Las dos jerarquías
mas importantes de un sistema complejo son: estructura de clases (jerarquía «es–un» (is–a):
generalización/especialización) y una estructura de objetos (jerarquía «parte–de» (part– of):
agregación).
1.5.5 Polimorfismo.
Polimorfismo es la propiedad que indica, literalmente, la posibilidad de que una entidad tome
muchas formas. En términos prácticos, el polimorfismo permite a objetos de clases diferentes
mediante el mismo elemento de programa y realizar la misma operación de diferentes formas,
según sea el objeto que se referencia en ese momento.
La programación orientada a objetos es una técnica para programar: un paradigma para escribir
“buenos” programas para un conjunto de problemas.
El apoyo para un paradigma no viene solo en la forma obvia de los recursos del lenguaje que
permiten emplear directamente el paradigma, sino también en la forma más sutil de verificaciones
en los tiempos de compilación o ejecución, o ambos, contra desviaciones no intencionales
respecto al paradigma. La verificación de tipos es el ejemplo mas obvio de esto; la detección de
ambigüedades y las verificaciones durante la ejecución pude servir para ampliar el apoyo
lingüístico de los paradigmas. Los recursos extra lingüísticos, como las bibliotecas estándar y los
ambientes de programación, pueden proporcionar también un apoyo importante para los
paradigmas.
Un lenguaje no es por fuerza mejor que otro por poseer una característica de la que carece el otro.
Existen muchos ejemplos de lo contrario. Lo importante no es tanto que características posee un
lenguaje, sino que estas sean suficientes para apoyar los estilos de programación deseados en las
áreas de aplicaciones deseadas:
• Todas las características deben estar integradas al lenguaje en forma muy limpia y elegante.
• Debe ser posible utilizar una combinación de características distintivas para lograr soluciones
que de otra manera habrían requerido características independientes adicionales.
• El numero de características espurias y de aplicación especial debe ser lo mas bajo posible.
• La realización de un rasgo distintivo no debe implicar un gasto extra significativo para los
programas que no lo requieran.
• Un usuario solo necesita saber acerca del subconjunto del lenguaje empleado explícitamente
para escribir un programa.