2010-08-26 17 views
6

Mi pregunta es: ¿en PHP son las interfaces realmente útiles para los desarrolladores que crean aplicaciones de sitios web por su cuenta? ¿No es una clase abstracta que proporciona todas las cosas que proporciona una interfaz?¿Es una interfaz php redundante para las aplicaciones compiladas por un único desarrollador?

Si una interfaz es solo un "contrato", ¿no es el desarrollador consciente de las cosas que la clase debería implementar?

El único beneficio único que puedo pensar es que una clase puede implementar múltiples interfaces, pero de nuevo, qué tan útil es esto ... cuando sabes todo lo que una clase debe implementar. Simplemente te obligas a implementar esos métodos.

Como puedes ver, todavía estoy esperando ese momento A-HA cuando realmente entiendo por qué una interfaz es útil.

Para concluir y ponerlo simple: ¿Cuándo debo usar interfaces y por qué no utilizar clases abstractas en su lugar?

Respuesta

2

El hecho de que usted "sepa" lo que debe implementar algo, no significa que lo recuerde. No significa que nunca cometerás un error y escribirás un nombre de función. Los "Contratos" en la programación no son solo para que un desarrollador imponga las cosas a otro: también le permiten proporcionar una rigidez al código que puede detectar errores que de otro modo pasarían desapercibidos.

+0

¿Puede dar un ejemplo? – danidacar

-1

¿Cuándo debería usar interfaces y por qué no usa clases abstractas?

Tan pronto como utilice, por ejemplo, el patrón de fábrica, se debe utilizar una interfaz. Estoy seguro de que hay más ejemplos para eso.

Eche un vistazo a los diversos patrones de diseño. http://www.ibm.com/developerworks/library/os-php-designptrns/

EDITAR: cambió el enlace a una mejor explicación.

+0

No creo que el artículo que menciona sea muy bueno =) –

+1

TBH no lo leí, utilizo el libro de patrones de diseño PHP de Stephan Schmidt. – Rufinus

+0

Los patrones PHP y de diseño son la razón por la que comencé esta pregunta. La mayoría de los tutoriales para patrones de diseño relacionados con php no son realmente sobre el punto. – danidacar

1

Puede utilizar las interfaces de

  • Tipo-dando a entender en funciones public function foo(IWhatever $x)
  • para comprobar si hay tipo $x instanceof IWhatever
  • Para crear objetos simulados en la unidad de pruebas $this->getMock('IWhatever')

Por supuesto, podría usar clases abstractas también, pero si realmente no necesita definir ningún código, probablemente sea una mejor idea usar una interfaz.

0

La interfaz es una muy buena práctica en el desarrollo de comandos. Crea una integridad del producto del programa. El equipo de primera vez escribe la interfaz, después de clases abstractas (con métodos comunes y métodos abstractos).

Clase abstracta útil cuando la ampliamos en diferentes clases. Por ejemplo, el método __construct() es común para todas las clases secundarias, pero otros métodos son diferentes.

Nuestro equipo utiliza este modelo: interfaz-> Resumen-> Class1-> Clase2

Class1 extends Abstract implements Interface 

Class2 extends Abstract implements Interface 
+0

La pregunta se refiere a un único desarrollador. Para un equipo, puedo entender tu enfoque. – danidacar

1

"Programación de una interfaz y no una implementación" es un principio introducido por el GoF en sus libros Design Patterns: Elements of Reusable Object-Oriented Software.

Citando Erich Gamma en el Principe:

Una vez que dependen de las interfaces única, que está desacoplada de la aplicación. Eso significa que la implementación puede variar, y esa es una relación de dependencia saludable. Por ejemplo, para fines de prueba puede reemplazar una implementación pesada de base de datos con una implementación simulada de peso ligero. [...]

Así que este enfoque le da flexibilidad, pero también separa la parte realmente valiosa, el diseño, de la implementación, lo que permite que los clientes se desacoplen de la implementación. Una pregunta es si siempre debe usar una interfaz Java para eso. Una clase abstracta también es buena. De hecho, una clase abstracta te brinda más flexibilidad en lo que respecta a la evolución. Puede agregar un nuevo comportamiento sin romper clientes. [...]

En Java cuando agrega un nuevo método a una interfaz, rompe todos sus clientes. Cuando tiene una clase abstracta, puede agregar un nuevo método y proporcionar una implementación predeterminada en él. Todos los clientes continuarán trabajando. Como siempre, hay una compensación, una interfaz le da libertad con respecto a la clase base, una clase abstracta le da la libertad de agregar nuevos métodos más adelante. No siempre es posible definir una interfaz en una clase abstracta, pero a la luz de la evolución debe considerar si una clase abstracta es suficiente.

Read the full interview here

Por lo tanto, se puede utilizar una interfaz o una clase abstracta. Solo debes considerar la compensación. OMI, vale la pena usar interfaces, incluso si estás solo. Raramente sabes cómo se verá tu aplicación al final. The waterfall is a myth, por lo que tendrá que hacer frente al cambio durante el desarrollo y las interfaces hacen que sea más fácil abarcarlo.

Usted también puede estar interesado en:

y algunos más:

+0

La programación de una interfaz y no una implementación en PHP no es realmente sencilla porque PHP tiene un tipo débil – danidacar

+0

He leído Gof y muchos otros libros. ¿Pueden ustedes estar más en el punto? – danidacar

+0

@daniphp [ese argumento aparece de vez en cuando] (http://stackoverflow.com/questions/2758254/what-is-the-point-of-interfaces-in-a-weakly-typed-language-like- php). PHP está simplemente * débilmente * tipado. No está sin tipo. – Gordon

0

algún tiempo ya que esta se le preguntó, pero como la funcionalidad de las interfaces parece desconcertar a mucha gente - si viene aquí buscando, pruebe el ejemplo de aquí con más de 500 votos. Lo encontré realmente útil.

What does it mean to "program to an interface"?

Cuestiones relacionadas