2009-12-04 10 views
16

A menudo escucho/leo acerca de la programación basada en interfaces pero no estoy exactamente claro en lo que realmente significa. ¿La programación basada en interfaces es un tema real independiente que realmente tiene libros escritos sobre esto? Si es así, ¿alguien puede recomendar alguno bueno?¿Qué es exactamente "programación basada en interfaz"?

Encontré una programación basada en interfaces mientras leía sobre cómo se diseñan las buenas API y me gustaría aprender más al respecto. En este momento, no tengo claro cómo diseñar adecuadamente una API en torno a las interfaces.

Cualquier información es muy apreciada.

+0

Este es un duplicado. Véase, por ejemplo, la pregunta 1413543 (http://stackoverflow.com/questions/1413543). – jason

+0

Es posible que desee consultar el libro Head First Design Patterns. Aunque los ejemplos están escritos en Java, es un buen comienzo. – kragan

+1

@Jason: la programación en una interfaz no es necesariamente igual a la programación basada en interfaz. Hay más en la "programación basada en la interfaz" que solo el uso de interfaces, por lo general se entiende más como una decisión arquitectónica. –

Respuesta

24

Básicamente se trata de expresar sus dependencias en términos de interfaces en lugar de clases concretas (o peor, métodos estáticos). Entonces, si una de sus clases necesita realizar la autenticación, se debe proporcionar un IAuthenticator (o lo que sea).

Esto significa que:

  • se puede escribir el código antes de la aplicación de la dependencia real de
  • Usted puede probar a través de burlarse muy fácilmente (sin necesidad de clases simuladas, que pone feo)
  • Está claro de lo que depende en términos de API en lugar de implementación (es decir, tiene un acoplamiento más flexible)
+0

¿Hay algún buen libro que explique este "estilo" de programación en C#? – koumides

+1

@koumides: No específicamente, pero busque "inversión de control" e "inyección de dependencia" para encontrar muchos artículos. –

9

El capítulo 6 de "Practical API Design" by Jaroslav Tulach se titula "Código contra interfaces, no Implementaciones ". Explica que, al codificar contra una interfaz en lugar de una implementación específica, puede desacoplar módulos (o componentes) en un sistema y, por lo tanto, elevar la calidad del sistema.

Bertrand Meyer en OOSC2 explica claramente por qué "cerrar" un sistema y hacerlo más modular aumenta su calidad.

3

Si busca interfaces, encontrará mucha información sobre cuán útiles pueden ser las interfaces.

El concepto es definir interfaces claras, que serán utilizadas por los diversos componentes/partes/clases/módulos para comunicarse e interactuar. Una vez que haya definido cuál debe ser la entrada/salida de estas interfaces, puede dejar que los distintos equipos desarrollen lo que sea necesario para cumplir con los requisitos de interfaz, incluidas las pruebas de entrada/salida, etc.

Si sigue este patrón, varios equipos pueden comenzar a desarrollar su parte sin esperar a que las otras partes estén listas. Además de eso, puede usar las pruebas unitarias (usando objetos falsos para simular las otras partes que no está desarrollando y probar su parte).

Este método es bastante el estándar para cualquier nuevo proyecto de programación y todos lo darán por hecho.

2

Esto es algo que no recomiendo usar mucho en el desarrollo de C#.

Interface-based programming es básicamente la programación de interfaces. Desarrolla las interfaces que va a usar en los Contratos, y la implementación real de las interfaces está oculta detrás de estos contratos.

Era muy común antes de .NET, ya que la mejor manera de obtener componentes reutilizables en Windows era a través de COM, que funcionaba a través de interfaces en todas partes. Sin embargo, dado.La capacidad de NET para admitir múltiples idiomas con un único tiempo de ejecución (CLR), así como su compatibilidad superior para el control de versiones cuando se compara con el código nativo, la utilidad de la programación basada en interfaz se reduce drásticamente cuando se programa en C# (a menos que tratando de hacer componentes COM, en cuyo caso, aún creará las interfaces COM indirectamente de sus clases C#).

+0

Para los downvoters: no estoy sugiriendo que las interfaces, por sí mismas, sean malas, sino que la utilidad de diseñar toda su API alrededor de las interfaces, a lo que a menudo se refiere la "programación basada en interfaz" no es necesariamente tan válido para los desarrolladores de C# como lo fue en los días COM. –

+0

La burla es mucho más fácil contra las interfaces que las clases concretas (particularmente las selladas sin métodos virtuales). También sigo creyendo que aclara en qué dependes realmente ... –

+0

@Jon SKeet: cierto. La burla puede ser más fácil contra las interfaces que las clases selladas o no virtuales, pero las clases abstractas se pueden burlar con la misma facilidad, y tienen algunas ventajas al versionar, si estás usando C# (que fue etiquetado en la pregunta). –

3

Lo que usted llama "programación basada en interfaz" se conoce más comúnmente como programación en una interfaz. Aquí hay un ejemplo a continuación. El beneficio es ocultar la implementación real de la interfaz y permitir que su código sea más flexible y fácil de mantener en el futuro.

YourInterface foo = CreateYourInterface(); 
foo.DoWork(); 
foo.DoMoreWork(); 

CreateYourInterface() devolvería una implementación concreta de YourInterface. Esto le permite cambiar la funcionalidad de la aplicación cambiando una línea:

YourInterface foo = CreateYourInterface(); 
+0

¿Has cambiado una línea de código allí? ¿Cúal? Quizás podrías aclarar? – DOK

+0

YourInterface foo = CreateYourInterface() es la línea a la que me refería. Solo estaba señalando que si asignaba un objeto diferente a foo que también implementaba la interfaz, obtendría una funcionalidad diferente con el mismo código. –

0

programación basada en interfaz puede ser pensado como desacoplar la implementación de la funcionalidad y la forma de acceder a la funcionalidad.

se define una interfaz de
interface ICallSomeone { public bool DialNumber(string number); }

y que escribe su aplicación

public class callsomeone: ICallSomeone {
public bool DialNumber(string number) {
//dial number, return results }}

utiliza la interfaz sin preocuparse por la aplicación. Si cambia la implementación, no le importa porque solo usa la interfaz.

0

Desde una perspectiva muy abstracta, la programación basada en interfaz es similar a los componentes utilizados por un plomero (uniones de tuberías y tuberías).

Mientras las tuberías y las juntas se fabriquen de acuerdo con la interfaz especificada (el número de hilos y el espaciado, etc.) varios fabricantes pueden proporcionar uniones a tubos que fueron potencialmente fabricados por algún otro proveedor (pero adhiriéndose al la interfaz conjunta/tubería antes mencionada).

Por lo tanto, hay más interoperabilidad de componentes y libertad para que el plomero pueda elegir entre varios proveedores, rangos de precios, etc. para crear un sistema de plomería funcional.

Reemplace las tuberías y las juntas con componentes de software y los paralelismos son asombrosamente simples.