[php] ¿Hay algún punto para las interfaces en los lenguajes dinámicos?


Answers

Sí, hay un punto

Si no usa interfaces explícitamente, su código aún usa el objeto como si implementara ciertos métodos, simplemente no está claro cuál es la interfaz tácita.

Si define una función para aceptar una interfaz (en PHP decir) entonces fallará antes, y el problema será con la persona que llama, no con el método haciendo el trabajo. En general, fallar antes es una buena regla general a seguir.

Question

En lenguajes estáticos como Java necesita interfaces porque de lo contrario el sistema de tipos simplemente no le permitirá hacer ciertas cosas. Pero en lenguajes dinámicos como PHP y Python, solo aproveche la tipificación de pato .

PHP admite interfaces. Ruby y Python no los tienen. Entonces puedes vivir felizmente feliz sin ellos.

He estado trabajando principalmente en PHP y nunca he utilizado la capacidad de definir interfaces. Cuando necesito un conjunto de clases para implementar cierta interfaz común, entonces simplemente lo describo en la documentación.

¿Entonces, qué piensas? ¿No estás mejor sin usar interfaces en lenguajes dinámicos?




Si no tiene altas restricciones de seguridad (para que nadie acceda a sus datos de una manera que no desee) y tiene una buena documentación o codificadores bien capacitados (para que no necesiten el intérprete / compilador para decirles qué hacer), entonces no, es inútil.

Para la mayoría de los proyectos de tamaño mediano, todo lo que necesita es tipear patos.




En un lenguaje como PHP donde una llamada a método que no existe produce un error fatal y toma toda la aplicación hacia abajo, entonces las interfaces sí tienen sentido.

En un lenguaje como Python donde puede detectar y manejar llamadas a métodos no válidos, no es así.




Bueno, sin duda sería más fácil verificar si un objeto dado admite una interfaz completa, en lugar de no bloquearse cuando llama al uno o dos métodos que utiliza en el método inicial, por ejemplo, para agregar un objeto a una lista interna.

El tipado en pato tiene algunos de los beneficios de las interfaces, es decir, fácil de usar en todas partes, pero el mecanismo de detección todavía falta.




como programador de PHP, como yo lo veo, una interfaz se usa básicamente como un contrato. Le permite decir que todo lo que utiliza esta interfaz DEBE implementar un conjunto determinado de funciones.

No sé si eso es tan útil, pero encontré un poco un obstáculo para tratar de entender de qué se trataban las interfaces.




Un uso de la "interfaz" de Java es permitir mixins fuertemente tipados en Java. Mezcla la superclase adecuada, más cualquier método adicional implementado para admitir la interfaz.

Python tiene herencia múltiple, por lo que realmente no necesita la invención de interfaz para permitir métodos de múltiples superclases.

Sin embargo, como algunos de los beneficios de la mecanografía fuerte, principalmente, soy partidario de la detección temprana de errores. Intento utilizar una definición de superclase abstracta "similar a una interfaz".

class InterfaceLikeThing( object ):
    def __init__( self, arg ):
        self.attr= None
        self.otherAttr= arg
    def aMethod( self ):
        raise NotImplementedError
    def anotherMethod( self ):
        return NotImplemented

Esto formaliza la interfaz, de alguna manera. No proporciona evidencia absoluta para una subclase que coincida con las expectativas. Sin embargo, si una subclase falla al implementar un método requerido, mis pruebas de unidad fallarán con un obvio valor de retorno NotImplementedError o NotImplementedError excepción NotImplementedError .




Además de las otras respuestas, solo quiero señalar que Javascript tiene una instancia de palabra clave que devolverá verdadero si la instancia dada está en alguna parte en la cadena de prototipos de un objeto dado.

Esto significa que si usa su "objeto de interfaz" en la cadena de prototipos para sus "objetos de implementación" (ambos son simplemente objetos para JS), entonces puede usar instanceof para determinar si lo "implementa". Esto no ayuda al aspecto de cumplimiento, pero sí ayuda en el aspecto de polimorfismo, que es un uso común para las interfaces.

MDN instanceof Reference




Creo que el uso de las interfaces está más determinado por la cantidad de personas que usarán su biblioteca. Si solo eres tú o un equipo pequeño, la documentación y la convención estarán bien y requerir interfaces será un impedimento. Si se trata de una biblioteca pública, las interfaces son mucho más útiles porque obligan a las personas a proporcionar los métodos correctos en lugar de simplemente dar pistas. Así que las interfaces son definitivamente una característica valiosa para escribir bibliotecas públicas y supongo que la falta (o al menos el énfasis) es una de las muchas razones por las que los lenguajes dinámicos se utilizan más para las aplicaciones y los idiomas fuertemente tipados para las grandes bibliotecas.




Links