introducción en leguaje de interfaz
¿Qué es una Interface?
Las interfaces surgen como una evolución de la POO (programación Orientada a Objetos) ante la necesidad de reutilizar y agrupar las distintas funcionalidades de un objeto en subconjuntos mas manejables.
Debido a la creciente complejidad de los sistemas modernos cada vez mas los objetos (que antes necesitaban solo algunos métodos para poder definir sus funcionalidades) fueron creciendo en complejidad, hasta el punto de tornarse inmanejables por la excesiva cantidad de métodos que contenían (pensemos por ejemplo en un simple control activex que muestre una imagen según el estado del tiempo y que se insertará en una página Web). Debida a esta creciente complejidad en los sistemas fue que surgió la necesidad de agrupar las funcionalidades de los objetos en pequeños módulos que a su vez fuesen reutilizables por otros objetos que utilizaban otras implementaciones de la misma funcionalidad.
Podríamos decir en una definición muy casera que “una interface en términos de c++ es una clase abstracta que encapsula los métodos que definen un cierto comportamiento de un objeto “.
¿Cómo se define una Interface?
Una interface puede ser definida utilizando las palabras reservadas clase, struct o interface. El beneficio de utilizar struct o interface es que la visibilidad por defecto de la interface será publico mientras que si usamos una clase deberemos especificarlo explícitamente. Por lo tanto una manera sencilla de definir una interface sería:
Es interesante analizar que esta pasando detrás de los bastidores cuando declaramos una interface.
Si nos remitimos a nuestras primeras lecciones de C++, recordaremos que cuando un método de una clase, es definido virtual. El compilador crea en lugar donde iría el método en memoria, un puntero (vPtr) que apunta a alguna posición de la tabla de todas las funciones virtuales del objeto vTable que finalmente contiene las direcciones de memoria de las implementaciones de todas las funciones virtuales del objeto.
Entonces para la interface IDraw definida anteriormente, la estructura en memoria de una instancia de la interface sería la siguiente:
Un dato un tanto trivial al tener en cuenta es que la palabra interface no es una palabra del lenguaje c++ sino que es un typedef de Windows, para ello deberemos incluir en nuestro código el header <windows.h>. Además es muy importante tener en cuenta que la definición de una interface nunca trae aparejada una implementación de los métodos sino que la misma se dejará para la clase que implemente la misma.
¿Por Que Utilizar Interfaces?
Una de las principales ventajas de utilizar interfaces es el polimorfismo ya que separamos la definición de los métodos de su implementación. Además cabe notar que nuestro objeto ira cobrando forma a partir de la herencia de distintas interfaces que el mismo deberá ir implementando a su debido Tiempo.
A su vez al no definir ningún tipo de implementación a priori en la definición de una interface tenemos un grado extra de aislación entre la declaración de los metodos que tendra un determinado objeto y sus implementaciones. También es de remarcar que todas las variables del objeto quedarán del lado de la implementación con lo que tendremos un grado de encapsulación extra al utilizar interfaces.
Algunas de las ventajas de la herencia son:
Reutilización del software: cuando el comportamiento se hereda de otra clase, no necesitamos rescribir el código responsable de ese comportamiento. Además, aporta mayor confiabilidad: cuanto más utilicemos ese código, mayores serán las posibilidades de encontrar errores.
Compartición de código: muchos usuarios o proyectos independientes pueden hacer uso de las mismas clases. Podemos referirnos genéricamente a estas clases como componentes software. Otra forma de compartición de código ocurre cuando un programador construye dos o más clases diferentes que heredan de una clase paterna única.
Consistencia de la interfaz: si tenemos un conjunto de clases que heredan de la misma superclase, se asegura que el comportamiento que heredan será similar en todos los casos. Así, es más fácil garantizar que las interfaces de objetos similares tengan comportamientos similares, y al programador se le hace más fácil recordar la manera en que éstos objetos se utilizan.
Ocultación de información: cuando se desarrolla un componente software sólo se necesita entender la naturaleza del componente y su interfaz. Es decir, no importa comprender cómo se ha implementado dicho componente.
Operadores y expresiones Como ya hemos dicho con los datos de un tipo podemos realizar determinadas operaciones pero, ¿cómo las expresamos en un lenguaje de programación? Para resolver este problema aparecen lo que llamamos operadores. Podemos decir que un operador es un símbolo o conjunto de símbolos que representa la aplicación de una función sobre unos operandos. Cuando hablamos de los operandos no sólo nos referimos a variables, sino que hablamos de cualquier elemento susceptible de ser evaluado en alguna forma. Por ejemplo, si definimos una variable entera podremos aplicarle operadores aritméticos (+, -, *, /), de asignación (=) o relacionales (>, <, …), si definimos una variable compuesta podremos aplicarle un operador de campo que determine a cual de sus componentes queremos acceder, si definimos un tipo de datos podemos aplicarle un operador que nos diga cual es el tamaño de su representación en memoria, etc.
Algoritmos y estructuras de control Podemos definir un algoritmo de manera general como un conjunto de operaciones o reglas bien definidas que, aplicadas a un problema, lo resuelven en un número finito de pasos. Si nos referimos sólo a la informática podemos dar la siguiente definición: Un procedimiento es una secuencia de instrucciones que pueden realizarse mecánicamente. Un procedimiento que siempre termina se llama algoritmo. Al diseñar algoritmos que resuelvan problemas complejos debemos emplear algún método de diseño, la aproximación más sencilla es la del diseño descendente (top-down). El método consiste en ir descomponiendo un problema en otros más sencillos (subproblemas) hasta llegar a una secuencia de instrucciones que se pueda expresar en un lenguaje de alto nivel. Lo que haremos será definir una serie de acciones complejas y dividiremos cada una en otras más simples. Para controlar el orden en que se van desarrollando las acciones, utilizaremos las estructuras de control, que pueden ser de distintos tipos:
Comentarios
Publicar un comentario