Una interfaz de software puede referirse a una amplia gama de diferentes tipos de interfaz en diferentes «niveles»: un sistema operativo puede interactuar con piezas de hardware. Las aplicaciones o programas que se ejecutan en el sistema operativo pueden necesitar interactuar a través de flujos de datos, filtros y canalizaciones; y en los programas orientados a objetos, los objetos dentro de una aplicación pueden necesitar interactuar a través de métodos.
En la prácticaeditar
Un principio clave del diseño es prohibir el acceso a todos los recursos de forma predeterminada, permitiendo el acceso solo a través de puntos de entrada bien definidos, es decir, interfaces. Las interfaces de software proporcionan acceso a recursos informáticos (como memoria, CPU, almacenamiento, etc.).) del sistema informático subyacente; el acceso directo (es decir, no a través de interfaces bien diseñadas) a dichos recursos mediante software puede tener ramificaciones importantes, a veces desastrosas, para la funcionalidad y la estabilidad.
Las interfaces entre componentes de software pueden proporcionar constantes, tipos de datos, tipos de procedimientos, especificaciones de excepciones y firmas de métodos. A veces, las variables públicas también se definen como parte de una interfaz.
La interfaz de un módulo de software A se define deliberadamente por separado de la implementación de ese módulo. Este último contiene el código real de los procedimientos y métodos descritos en la interfaz, así como otras variables» privadas», procedimientos, etc. Otro módulo de software B, por ejemplo, el cliente a A, que interactúa con A se ve obligado a hacerlo solo a través de la interfaz publicada. Una ventaja práctica de esta disposición es que la sustitución de la implementación de A por otra implementación de la misma interfaz no debería causar que B fallara: la forma en que A cumple internamente los requisitos de la interfaz no es relevante para B, que solo se ocupa de las especificaciones de la interfaz. (Véase también el principio de sustitución de Liskov.)
En idiomas orientados a objectoseditar
En algunos lenguajes orientados a objetos, especialmente aquellos sin herencia múltiple completa, el término interfaz se usa para definir un tipo abstracto que no contiene datos, pero define comportamientos como firmas de métodos. Se dice que una clase que tiene código y datos para todos los métodos correspondientes a esa interfaz y que lo declara implementa esa interfaz. Además, incluso en lenguajes de herencia única, se pueden implementar múltiples interfaces y, por lo tanto, pueden ser de diferentes tipos al mismo tiempo.
Por lo tanto, una interfaz es una definición de tipo; en cualquier lugar donde se pueda intercambiar un objeto (por ejemplo, en una llamada a función o método), el tipo del objeto a intercambiar se puede definir en términos de una de sus interfaces implementadas o clases base en lugar de especificar la clase específica. Este enfoque significa que se puede usar cualquier clase que implemente esa interfaz. Por ejemplo, se puede usar una implementación ficticia para permitir que el desarrollo avance antes de que la implementación final esté disponible. En otro caso, una implementación falsa o simulada puede sustituirse durante las pruebas. Estas implementaciones de stub son reemplazadas por código real más adelante en el proceso de desarrollo.
Por lo general, un método definido en una interfaz no contiene código y, por lo tanto, no se puede llamar por sí mismo; debe implementarse mediante código no abstracto para ejecutarse cuando se invoca. Una interfaz denominada «Stack
» podría definir dos métodos: push()
y pop()
. Se puede implementar de diferentes maneras, por ejemplo, FastStack
y GenericStack
div—: el primero es rápido, trabaja con una estructura de datos de tamaño fijo, y el segundo usa una estructura de datos que se puede cambiar de tamaño, pero a costa de una velocidad algo menor.
Aunque las interfaces pueden contener muchos métodos, pueden contener solo uno o incluso ninguno. Por ejemplo, el lenguaje Java define la interfaz Readable
que tiene el único read()
método; diversas implementaciones se utilizan para diferentes propósitos, incluyendo BufferedReader
FileReader
InputStreamReader
PipedReader
y StringReader
. Las interfaces de marcadores como Serializable
no contienen ningún método y sirven para proporcionar información en tiempo de ejecución al procesamiento genérico mediante Reflexión.
Programación en la interfaceeditar
El uso de interfaces permite un estilo de programación llamado programación en la interfaz. La idea detrás de este enfoque es basar la lógica de programación en las interfaces de los objetos utilizados, en lugar de en detalles de implementación interna. La programación en la interfaz reduce la dependencia de los detalles de implementación y hace que el código sea más reutilizable.
Llevando esta idea al extremo, la inversión de control deja el contexto para inyectar el código con las implementaciones específicas de la interfaz que se utilizará para realizar el trabajo.