# data[].attributes.body
La abstracción es un proceso mental que consiste en realzar los detalles relevantes, es decir, los que nos interesan en un momento sobre el objeto de estudio, mientras se ignoran los detalles irrelevantes. Esto nos lleva a una simplificación del problema, ya que:

•la cantidad de información que es necesario manejar en un momento dado disminuye.

•podemos tratar cosas diferentes como si fueran la misma.

•permite descomponer un sistema en módulos.

Por tanto, para que la descomposición sea útil, es necesario un proceso de ocultamiento de información de forma que el razonamiento, en la construcción del sistema a partir de sus módulos, utilice el mínimo de características relevantes (parte publica) ocultando las irrelevantes (parte privada). Nótese que cuanto mayor es el grado de ocultamiento de información, menor será la información que tendremos que manejar (se disminuye la complejidad a causa de haber minimizado la interdependencia entre módulos). Es importante destacar que este ocultamiento no hace referencia a que el usuario del módulo no debe conocer ningún detalle interno por motivos relacionados con la privacidad del código, los derechos de copia o la explotación comercial. Cuando usamos el termino de ocultamiento en este documento nos referimos a la necesidad de que el usuario del módulo utilice el mínimo de características para el desarrollo de sus programas.

# data[].attributes.headline
¿Cuál es su importancia en la ingeniería de software?

# data[].attributes.subject
¿Cuál es su importancia en la ingeniería de software?

# data[].attributes.body
La ocultación y la abstracción de información son dos conceptos clave en la ingeniería software. La ocultación de información se refiere a la práctica de ocultar los detalles de implementación de un objeto y exponer solo una interfaz publica que le permite interactuar con el objeto. Esto ayuda a reducir la complejidad del sistema y proteger la integridad de los datos. Por otro lado, la abstracción se refiere a la práctica de identificar características importantes de un objeto y ocultar detalles sin importancia. Esto hace que el sistema sea más fácil de entender y el código más fácil de reutilizar.

El ocultamiento y la abstracción de información son importantes en la ingeniería de software porque ayudan a mejorar la calidad del software. Ocultar los detalles de ejecución reduce la complejidad del sistema y protege la integridad de los datos. Resumir funcionalidades importantes hace que el sistema sea más fácil de entender y el código más fácil de reutilizar. Juntas, estas prácticas ayudan a mejorar la mantenibilidad, escalabilidad y eficiencia del software.

# data[].attributes.body
-Por ejemplo, si en el programa que se desarrolla es necesario calcular el índice del elemento máximo que se almacena en un vector, podemos olvidar todos los detalles relativos a cómo se debe calcular, las variables que se deben usar, etc. (detalles irrelevantes) y considerar que disponemos de una operación IndiceMaximo que se ocupa de resolverlo (detalles relevantes).

-Por ejemplo, si en el programa que se desarrolla es necesario gestionar fechas, es mas complejo que el programador tenga que conocer los detalles de cómo se almacena, así como de las sentencias necesarias para realizar algún cálculo con ellas. En este caso, es conveniente crear un nuevo tipo de dato que podemos denominar Fecha junto con un conjunto de operaciones para manejarlo.

# data[].attributes.body
Ventajas

-Estructura organizada y modular

-Reutilización de código

-Fácil mantenimiento y actualización

-Abstracción y encapsulamiento

-Facilita la colaboración en equipo

Desventajas

-Mayor complejidad inicial

-Mayor consumo de recursos

-Mayor complejidad de depuración

-Sobrecarga de abstracción

# data[].attributes.body
-Ocultamiento de información:

Principle of Information Hiding: La ocultación de información oculta la decisión de diseño de un componente que probablemente cambiará en el futuro de otros componentes que dependen de él. Como tal, el programador sólo necesita conocer la entrada requerida por las funciones en el componente y el resultado esperado que producirán las funciones.

Encapsulamiento: Agrupa los datos y los métodos que operan sobre esos datos en una única unidad. Los detalles de implementación internos no deben ser visibles fuera de la unidad (clase u objeto).

Modificadores de Acceso: Usa modificadores de acceso (public, private, protected) para administrar el acceso a los integrantes de una clase. Ayudando al principio de ocultamiento de información.

-Abstracción:

Abstracción de Datos: Representa los conceptos del mundo real en tu programa de manera abstracta, mediante la creación de tipos de datos que modelen esos conceptos.

Interfaces y Clases Abstractas: Define interfaces y clases abstractas para crear abstracciones comunes que pueden ser compartidas por varias implementaciones.

Jerarquía de Clases: Organiza las clases en una jerarquía que refleje las relaciones de generalización y especialización.

-Heurísticas:

Principio KISS (Keep It Simple, Stupid): es un principio de diseño que establece que las cosas deben ser lo más simples posibles, tanto en cuanto a diseños como en cuanto a sistemas.

Principio DRY (Don’t Repeat Yourself): reducir el número de repeticiones de código. Esto mejora la calidad del código y facilita que todos puedan agregar otras funciones o realizar cambios en él más adelante.

Principio SOLID:

S – Single Responsibility Principle (SRP):Cada clase o módulo debe tener una sola responsabilidad.

O – Open/Closed Principle (OCP):Las clases deben estar abiertas para la extensión pero cerradas para la modificación.

L – Liskov Substitution Principle (LSP):Las subclases deben ser sustituibles por sus clases base.

I – Interface Segregation Principle (ISP):Las interfaces deben ser específicas para los clientes que las usan.

D – Dependency Inversion Principle (DIP):Los módulos de alto nivel no deben depender de los módulos de bajo nivel. En su lugar, ambos deben depender de abstracciones.

# data[].attributes.body
ABSTRACCION

INFORMATION HIDING

ENCAPSULATION AND INFORMATIONHIDING

ENCAPSULAMIENTO Y OCULTAMIENTO DE DATOS

-Seleccionar nombre para ir al video.

# data[].attributes.body
https://ccia.ugr.es/~jfv/abstraccion.pdf

Carrano, Helman y Veroff. Data abstraction and problem solving with C++.Walls and Mirrors. Addison-Wesley, 1998.

B. Liskov, John Guttag. Abstraction and Specification in Program Development. The MIT Press, 1987.

Peña Marí, Diseño de Programas, Formalismo y Abstracción. Prentice Hall, 1997.

https://www.scielo.org.mx/scielo.php?script=sci_arttext&pid=S1405-77432014000200012

https://uapa.cuaieed.unam.mx/sites/default/files/minisite/static/60ca9387-f41f-4a12-aec9-bb4705651e87/UAPA-abstraccion-encapsulamiento/index.html

https://informatica.uv.es/iiguia/AED/teoria/apuntes/cuatr2/AED.Tema.10.pdf

https://tan-jun-bang.medium.com/what-is-information-hiding-principle-c5d5b97d4595

https://www.iebschool.com/blog/keep-it-simple-stupid-analitica-usabilidad/#:~:text=Dicho%20esto%2C%20Keep%20it%20simple,como%20en%20cuanto%20a%20sistemas.

https://codeyourapps.com/el-principio-dry-no-te-repitas/

https://profile.es/blog/principios-solid-desarrollo-software-calidad/

https://www.proscont.com/ventajas-y-desventajas-de-poo/