# data[].attributes.headline
Equipo 4: Ocultamiento de información y abstracción.

# data[].attributes.subject
Equipo 4: Ocultamiento de información y abstracción.

# data[].attributes.body
Integrantes:

-GONZALEZ LOPEZ GABRIEL ANTONIO

-HERNANDEZ HERNANDEZ LEONARDO

-LUNA VAZQUEZ RODRIGO

-SEGUIN LUNA IRVING ALEJANDRO

Contenido a Incluido:

(A) Definición del concepto o principios (Investigar por lo menos 3 fuentes).

(B) Importancia en la ingeniería de software.

(C) Ejemplos prácticos.

(D) Ventajas y Desventajas.

(E) Técnicas, guías o heurísticas.

(F) Diagramas o gráficos ilustrativos.

# data[].attributes.body
Recursos Recomendados:

Farley, D. (2021). Modern software engineering: Doing what works to build better software faster. Addison Wesley.

Paradigma de la programación orientada a objetos. (s. f.). https://ferestrepoca.github.io/paradigmas-de-programacion/poo/poo_teoria/concepts.html

Otero, J. (2022, 9 julio). Diferencia entre abstracción y ocultación de datos - Opinion duel. Opinion duel. https://opinionduel.com/informatica/diferencia-entre-abstraccion-y-ocultacion-de-datos/

Serna M. Edgar. (2011). Scientia et Technica. Universidad Tecnológica de Pereira

# data[].attributes.attachment_caption
Modern software engineering: Doing what works to build better software faster.

# data[].attributes.headline
(A) Ocultación y abstracción de información (1)

# data[].attributes.subject
(A) Ocultación y abstracción de información (1)

# data[].attributes.body
El ocultamiento y la abstracción de información se definen como “el proceso de eliminar detalles o atributos físicos, espaciales o temporales en el estudio de objetos o sistemas para centrar la atención en detalles de mayor importancia”.

Farley, D. (2021). Modern software engineering: Doing what works to build better software faster. Addison Wesley.

# data[].attributes.body
La abstracción es un proceso de interpretación y diseño que implica reconocer y enfocarse en las características importantes de una situación u objeto, y filtrar o ignorar todas las particularidades no esenciales.

Dejar a un lado los detalles de un objeto y definir las características específicas de éste, aquellas que lo distingan de los demás tipos de objetos.

Hay que centrarse en lo que es y lo que hace un objeto, antes de decidir cómo debería ser implementado.

Se hace énfasis en el qué hace más que en el cómo lo hace

Paradigma de la programación orientada a objetos. (s. f.). https://ferestrepoca.github.io/paradigmas-de-programacion/poo/poo_teoria/concepts.html

# data[].attributes.attachment_caption
Programación Orientada a Objetos ( OOP )

# data[].attributes.body
La abstracción es un proceso en el que la información relevante o necesaria se extrae o muestra de una gran cantidad de datos y se muestra al usuario.

La información no deseada o sin importancia está oculta en la pantalla del usuario.

Por ejemplo, considere un automóvil en la sala de exposición de un automóvil. El militar muestra todo el automóvil sin sus componentes individuales. La abstracción se usa en muchos lenguajes de programación. Es un método esencial y uno de los conceptos en Programación Orientada a Objetos ( OOP )

Otero, J. (2022, 9 julio). Diferencia entre abstracción y ocultación de datos - Opinion duel. Opinion duel. https://opinionduel.com/informatica/diferencia-entre-abstraccion-y-ocultacion-de-datos/

# data[].attributes.body
La ocultación de datos es un proceso. En Simple, la ocultación de datos ocultará su información interna importante de la exposición a los atacantes. Impide el acceso a los datos fuera de la clase. La ocultación de datos solo ocultará componentes de datos, mientras que la encapsulación de datos ocultará métodos y clases privadas.

La ocultación de datos es similar a la encapsulación de datos. La ocultación de datos solo limita sus datos de la pantalla y garantiza la seguridad de los datos. También puede reducir la complejidad del sistema mediante la ocultación de datos.

En un lenguaje de programación, el especificador de acceso privado logra la ocultación de datos. Considere un ejemplo de una cuenta con saldo. Aquí el saldo de una cuenta es información confidencial.

Por lo tanto, podemos permitir que el usuario verifique el saldo sin alterar la actitud del equilibrio. Así es como funciona la ocultación de datos en ejemplos de la vida real.

La ocultación de datos también se conoce como ocultación de información. La encapsulación de datos es un subproceso en la ocultación de datos. La ocultación de datos protegerá sus datos del acceso no autorizado.

Otero, J. (2022, 9 julio). Diferencia entre abstracción y ocultación de datos - Opinion duel. Opinion duel. https://opinionduel.com/informatica/diferencia-entre-abstraccion-y-ocultacion-de-datos/

# data[].attributes.headline
(A) Diferencias principales entre abstracción y ocultación de datos (3)

# data[].attributes.subject
(A) Diferencias principales entre abstracción y ocultación de datos (3)

# data[].attributes.body
1. La abstracción tiene tres tipos, mientras que la ocultación de datos no tiene tipos.

2. El propósito de la abstracción es disminuir la complejidad, mientras que el propósito de ocultar datos es lograr la encapsulación.

3. La abstracción se usa para implementar los detalles, y la ocultación de datos se usa para asegurar los datos.

4. La abstracción es un proceso que extrae información relevante, mientras que la ocultación de datos es un proceso que oculta los datos.

5. La abstracción también se denomina abstracción de datos, mientras que la ocultación de datos también se denomina ocultación de información.

Otero, J. (2022, 9 julio). Diferencia entre abstracción y ocultación de datos - Opinion duel. Opinion duel. https://opinionduel.com/informatica/diferencia-entre-abstraccion-y-ocultacion-de-datos/

# data[].attributes.headline
(B) Importancia en la ingeniería de software.

# data[].attributes.subject
(B) Importancia en la ingeniería de software.

# data[].attributes.body
Debería ser obvio que si nuestro objetivo es gestionar la complejidad para que podamos construir sistemas más complejos de los que podemos guardar cómodamente en nuestras cabezas, entonces necesitamos ocultar información.

Nos gustaría poder concentrarnos en el trabajo/código que tenemos frente a nosotros sin preocuparnos por lo que está sucediendo en otros lugares y cómo funcionan las cosas que no necesitamos preocuparnos en este momento.

Devlin señala de manera clara y concisa: “Una vez que te das cuenta de que la informática tiene que ver con la construcción, manipulación y razonamiento acerca de abstracciones, se hace evidente que un pre-requisito importante para la buena escritura de programas de computador es la capacidad para manejar abstracciones de manera precisa”.

Ghezzi et al. identifican a la abstracción como uno de los principios fundamentales de la ingeniería de software, para poder dominar la complejidad. Autores como Hazzan, también han discutido la abstracción como un pilar básico para las matemáticas y la computación. La eliminación de detalles innecesarios es evidente en la ingeniería de requisitos y en el diseño de software.

La elicitación de requisitos consiste en identificar los aspectos críticos del entorno que requiere el sistema, mientras se abandonan los irrelevantes. El diseño requiere que se evite la implementación innecesaria de restricciones.

Farley, D. (2021). Modern software engineering: Doing what works to build better software faster. Addison Wesley.

Serna M. Edgar. (2011). Scientia et Technica. Universidad Tecnológica de Pereira

# data[].attributes.body
En la abstracción se busca tener un código limpio y que sea fácil de editar.

Un ejemplo puede ser con una calculadora, podríamos tener una función que haga una suma, una resta, una división y otra la multiplicación.

Abstracción

Usaremos como ejemplo la función de la suma.

# data[].attributes.body
void suma(){

float nl, n, suma;

cout << "Suma \n";

cout << "Cuantos numeros vas a ingresar? \n";

cin >> nl;

suma = 0;

for (int i = 1; i <= nl; i++){

cout << "Introduce un numero \n";

cin >> n;

suma = suma + n;

}

cout << "El resultado es: " << suma << endl;

}

# data[].attributes.body
void suma(){

float nl, n, suma;

cout << "Suma \n";

numALeer(nl);

suma = 0;

for (int i = 1; i <= nl; i++){

leerNumero(n);

suma = suma + n;

}

resultado(suma);

}

# data[].attributes.body
En el ejemplo A la función de suma hace más de una operación, lee la cantidad de datos que se van a ingresar, se leen los datos, se hace la suma y finalmente se imprime el resultado.

Mientras que en el ejemplo B solo hace la operación de suma, la lectura de la cantidad de datos que se leeran, la lectura de datos y la impresión de resultados se hacen con otras funciones, lo cual lo hace más eficiente pues se pueden usar en las demás funciones de resta, multiplicación y división.

# data[].attributes.body
Con ocultar información nos referimos a que ciertos datos no sean accesibles desde fuera de esa clase.

En este ejemplo tenemos un libro cuyos datos no se pueden acceder desde fuera.

# data[].attributes.body
#include <iostream>

#include <string>

using namespace std;

class Libro{

private:

string titulo;

string autor;

int anoPublicacion;

public:

Libro(const string &titulo, const string autor, int ano){

this -> titulo = titulo;

this -> autor = autor;

this -> anoPublicacion = ano;

}

void mostrarInformacion(){

cout << "Titulo: " << titulo << endl;

cout << "Autor: " << autor << endl;

cout << "Ano de Publicacion: " << anoPublicacion << endl;

}

};

int main(){

Libro miLibro("Mi Libro", "Autor Anonimo", 2023);

// Mostramos la informacion del libro utilizando un metodo de la clase

miLibro.mostrarInformacion();

return 0;

}

# data[].attributes.body
En este ejemplo no se puede accesar a la información de la clase Libro desde fuera, es decir, esa información está segura.

En la imágen tenemos un programa que tiene una clase y su función principal (main) la cual no puede acceder a la información que está denntro de la clase.

# data[].attributes.body
Estos son algunos ejemplos en codificación, pero también se puede usar la Ocultación de información y abstracción en los siguientes ejemplos:

En el sistema de un banco donde la seguridad de los datos es importante.

En una base de datos personales de una empresa por ejemplo.

# data[].attributes.body
Aumenta la seguridad de los datos que son usados (y del programa en general)

Hace más eficiente un programa pues apoya la modularidad y busca que se escriban la menor cantidad de líneas de código

Específicamente, en el contexto de evitar y corregir grandes bolas de barro, hay una mentalidad que es importante adoptar. Esta es la mentalidad de que es algo bueno y sensato cambiar el código existente

Fácilita la colaboración entre integrantes de un equipo

Hace que el manteniemiento sea más fácil de llevar a cabo porque solo se modificarían ciertos módulos

Fomenta la reutilización

Facilita la optimización

# data[].attributes.body
Dado que se suele usar en POO (Programación Orientada a Objetos) puede llegar a ser algo complicada de entender para principiantes

El aplicar la abstracción puede llegar a ser difícil o complejo

Puede disminuir el rendimiento porque se debe pasar por más capas

El desarrollo de la abstracción puede ser más tardado por su complejidad

Mayor necesidad de mantenimiento

# data[].attributes.body
DevOps.

El término DevOps, que es una combinación de los términos ingleses development (desarrollo) y operations (operaciones), designa la unión de personas, procesos y tecnología para ofrecer valor a los clientes de forma constante.

DevOps permite que los roles que antes estaban aislados se coordinen y colaboren para producir productos mejores y más confiables. los equipos adquieren la capacidad de responder mejor a las necesidades de los clientes, aumentar la confianza en las aplicaciones que crean y alcanzar los objetivos empresariales en menos tiempo.

Uno de los hallazgos clave del informe DevOps que sustenta el enfoque científico. Acelerarte es que no existe compensación entre velocidad y calidad. No se crea software más rápido si se hace un trabajo deficiente

# data[].attributes.body
Brooks.

La Ley de Brooks es un principio utilizado en el desarrollo de software que afirma que "añadir más efectivos a un proyecto de software en retraso, lo retrasará más”. El corolario de la ley de Brooks es que cuando se incorpora una persona en un proyecto, este se ralentiza en lugar de acelerarse.

El autor del libro de Farley dice que para mejorar la orden de magnitud de Brooks es el elevar el nivel de abstracción de la programación donde el tema más común ha sido fortalecer la relación entre los diagramas de alto nivel que a veces utilizamos para describir nuestros sistemas.

# data[].attributes.body
TDD.

El test driven development (TDD) o en español desarrollo guiado por pruebas, es un enfoque de programación que se utiliza durante el desarrollo de software en el que se realizan pruebas unitarias antes de escribir el código. Básicamente, el objetivo consiste en hacer un código limpio, robusto y simple, para ello; es necesario crear en primer lugar, casos de prueba para cada funcionalidad que se quiera desarrollar, se testea, y en caso de detectar algún fallo, se rescribe un código libre de errores.

El TDD sufre menos de problemas de modificaciones al código una vez terminado por lo que primero se escribe la prueba (especificación) y nos vemos obligados a abstraer el problema, pero el verdadero valor de esto es que con se pude abstraer las especificaciones creando pruebas abstractas las cuales hacen que se más fácil el realizar cambios en el código.

# data[].attributes.body
YAGNI.

El principio YAGNI o You Aren’t Gonna Need It, es un principio de optimización de trabajo en el desarrollo de software que establece que los componentes deben añadirse cuando sean estrictamente necesarios. Este principio forma parte de la filosofía de la llamada programación extrema (XP), que contribuye a evitar el exceso y la ineficacia y concretar un producto informático en menor tiempo.

Esta filosofía logra que los desarrolladores desperdicien esfuerzos en características que solo forman parte de una suposición de su uso en “algún momento”. El principio YAGNI influye para que el trabajo se realice bajo términos pragmáticos y utilitarios, de manera que los desarrolladores se enfoquen en las características y componentes realmente necesarios.

# data[].attributes.headline
(F)Diagramas y gráficos ilustrativos.      Diagramas de clases                 

# data[].attributes.subject
(F)Diagramas y gráficos ilustrativos.      Diagramas de clases                 

# data[].attributes.body
Cuando se está planteando el diseño y el modelo de los objetos mediante la abstracción, existe una forma de plasmar esos prototipos a través de un diagrama de clases.

Formalmente, se describe como un tipo de diagrama de estructura estática que representa la estructura de un sistema mostrando las clases, sus atributos, operaciones (o métodos), y las relaciones entre los objetos.

Para este ejemplo concretamente, la clase Empleado y la clase Cliente heredan de la clase Persona. Todos los atributos de las clases son privados, como se detalla en la clase Persona con el signo negativo antes de nombre y edad. Además, existe una relación de composición entre la clase Empleado y la clase Empresa, es decir, si un objeto Empresa deja de existir, la clase Empleado también va a dejar de existir.

# data[].attributes.body
Un mensaje es una comunicación dirigida desde un objeto A ordenando a otro objeto B que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.
Los mensaje son los que permiten la comunicacion entre objetos.

# data[].attributes.body
Este tipo de clases nos permiten crear "métodos generales", que recrean un comportamiento común, pero sin especificar cómo lo hacen. A nivel de código tiene por particularidad que algunos de sus métodos no tienen “cuerpo de declaración“.

# data[].attributes.attachment_caption
Ambas clases deben sobreescribir el método getArea() puesto que se calculan de diferentes maneras en cada caso.

# data[].attributes.body
Son comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando.

# data[].attributes.body
Es un conjunto de métodos abstractos y de constantes cuya funcionalidad es la de determinar el funcionamiento de una clase, es decir, funciona como un molde o como una plantilla. También es una descripción de las acciones que un objeto puede hacer. En programación orientada a objetos una interfaz X describe todas las funciones que un objeto debe tener para poder ser un X.

Una interface es una variante de una clase abstracta con la condición de que todos sus métodos deben ser abstractos. Si la interface va a tener atributos, éstos deben llevar las palabras reservadas static final y con un valor inicial ya que funcionan como constantes por lo que, por convención, su nombre va en mayúsculas.

Una clase implementa una o más interfaces (separadas con comas ",") con la palabra reservada implements.

La principal diferencia entre interface y abstract es que una interface proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia.