Prefacio
En este capítulo, vamos a explicar el cuarto capítulo de la implementación de los cinco principios principales de JavaScript sólido, el principio de segregación de interfaz.
Texto en inglés original: http://freshbrewedcode.com/derekgreeer/2012/01/08/solid-javascript-theinterface-segregation-principle/
Nota: El autor de este artículo es bastante conmovedor, por lo que el tío también está deprimido de entenderlo. Solo léelo como quieras, no te quedes atrapado en él.
La descripción del principio del aislamiento de la interfaz es:
La copia del código es la siguiente:
Los clientes no deben verse obligados a depender de los métodos que no usan.
Los clientes no deben verse obligados a confiar en los métodos que no usan.
Cuando el método de interfaz del que depende del usuario solo es utilizado por otros usuarios y no lo usa, debe implementar estas interfaces. En otras palabras, si un usuario se basa en una interfaz que no es utilizada pero utilizada por otros usuarios, cuando otros usuarios modifican la interfaz, todos los usuarios que confían en la interfaz se verán afectados. Obviamente, esto viola el principio de apertura y cierre, y no es lo que esperamos.
Principio de aislamiento de interfaz ISP es algo similar a la responsabilidad única. Ambos se utilizan para agregar responsabilidades funcionales. De hecho, se puede entender que el ISP convierte programas con responsabilidades únicas en un objeto con una interfaz pública.
Interfaz JavaScript
¿Cómo cumplimos con este principio bajo JavaScript? Después de todo, JavaScript no tiene la característica de las interfaces. Si la interfaz es lo que queremos establecer el contrato y desacoplar a través de tipos abstractos proporcionados por un cierto idioma, se puede decir que está bien, pero JavaScript tiene otra forma de interfaz. En los patrones de diseño del libro elementos del software reutilizable orientado a objetos, encontramos la definición de la interfaz:
http://www.amazon.com/design-patterns-elements-reusable-object-oriented/dp/0201633612
Cualquier operación declarada por un objeto contiene un nombre de operación, objeto de parámetro y valor de retorno de la operación. Lo llamamos la firma del operador.
Todas las operaciones declaradas en un objeto se denominan interfaz de este objeto. La interfaz de un objeto representa toda la información de solicitud que ocurre en este objeto.
Independientemente de si un lenguaje proporciona una construcción separada para representar una interfaz, todos los objetos tienen una interfaz implícita compuesta por todas las propiedades y métodos del objeto. Consulte el siguiente código:
La copia del código es la siguiente:
var ejemplobinder = {};
ejemplobinder.modelobserver = (function () {
/* Variable privada*/
devolver {
Observar: función (modelo) {
/* Código*/
regresar Newmodel;
},
Onchange: function (devolución de llamada) {
/* Código*/
}
}
}) ();
ejemplobinder.viewAdaptor = (function () {
/* Variable privada*/
devolver {
Bind: function (modelo) {
/* Código*/
}
}
}) ();
ejemplobinder.bind = function (modelo) {
/* Variable privada*/
ejemplobinder.modelobserver.onchange (/ * llamado devolución de llamada */);
var om = ejemplobinder.modelobserver.observe (modelo);
ejemplobinder.viewAdaptor.bind (OM);
devolver om;
};
La biblioteca de clases de Ejemplo de Ejemplo de Ejemplo implementa la unión de dos vías. La interfaz pública expuesta por esta biblioteca de clases es el método de enlace, donde las funciones de notificación de cambio e interacción de vista utilizada en BIND son implementadas por objetos separados ModelOBServer y ViewAdaptor, respectivamente. Estos objetos son en cierto sentido la implementación específica del método de enlace de la interfaz pública.
Aunque JavaScript no proporciona tipos de interfaz para admitir contratos de objetos, la interfaz implícita del objeto aún se puede proporcionar a los usuarios del programa como un contrato.
ISP y JavaScript
Algunas de las subsecciones que discutimos a continuación son el impacto de violar el principio de aislamiento de la interfaz en JavaScript. Como se vio anteriormente, aunque es una lástima implementar el principio de aislamiento de la interfaz en los programas de JavaScript, no es tan poderoso como los idiomas escrita estáticamente. Las características del lenguaje de JavaScript a veces hacen que la llamada interfaz sea un poco antiadherente.
La realización de la depravación
En los idiomas escrita estáticamente, una de las razones para violar los principios del ISP es la implementación degenerada. Se deben implementar los métodos definidos en todas las interfaces en Java y C#. Si solo necesita algunos de ellos, los otros métodos también deben implementarse (se pueden implementar mediante excepciones vacías o de lanzamiento). En JavaScript, si solo se necesitan algunas interfaces en un objeto, no puede resolver el problema de la implementación degenerada, aunque no es necesario forzar la implementación de la interfaz anterior. Sin embargo, esta implementación aún viola el principio del reemplazo de Richter.
La copia del código es la siguiente:
var rectangle = {
área: function () {
/* Código*/
},
dibujar: function () {
/* Código*/
}
};
var geometryapplication = {
getLargestRectangle: function (rectangles) {
/* Código*/
}
};
var drawingapplication = {
drawRectangles: function (rectangles) {
/* Código*/
}
};
Cuando una alternativa de rectángulo para satisfacer el getLargestRectangle de la nueva aplicación de geometría del objeto, solo necesita el método de área del rectángulo (), pero viola el LSP (porque no puede usar el método de dibujo que solo puede usarse en el método de dibujo).
Acoplamiento estático
Otra razón para las violaciones de ISP en idiomas escrita estáticamente es el acoplamiento estático. En los idiomas escrita estáticamente, las interfaces juegan un papel importante en un programa de diseño poco acoplado. Ya sea en un lenguaje dinámico o estático, a veces un objeto puede necesitar comunicarse entre múltiples usuarios de clientes (como el estado compartido). Para los idiomas escrita estáticamente, la mejor solución es usar interfaces de roles, lo que permite al usuario interactuar con el objeto (que puede necesitar estar en múltiples roles) como su implementación para desacoplar el usuario y el comportamiento no relacionado. No existe tal problema en JavaScript, porque los objetos están desacoplados por las ventajas únicas de los idiomas dinámicos.
Acoplamiento semántico
Una razón común para violar el ISP son los idiomas dinámicos y escrita estáticamente, que es el acoplamiento semántico. El llamado acoplamiento semántico es la interdependencia, es decir, el comportamiento de un objeto depende de otro objeto, lo que significa que si un usuario cambia uno de los comportamientos, es probable que afecte a otro usuario. Esto también viola el principio de responsabilidad única. Este problema se puede resolver mediante herencia y sustitución de objetos.
Escalabilidad
Otra razón para el problema es sobre la escalabilidad. Muchas personas darán ejemplos sobre la devolución de llamada para demostrar escalabilidad (como la configuración de devolución de llamada después del éxito en AJAX). Si dicha interfaz necesita una implementación y hay muchos métodos familiares o en el objeto de esta implementación, el ISP será muy importante. Es decir, cuando una interfaz de interfaz se convierte en una necesidad de implementar muchos métodos, su implementación será extremadamente compleja, y puede hacer que estas interfaces asuman una responsabilidad indista. Esta es la interfaz grasa que a menudo mencionamos.
Resumir
Las características del lenguaje dinámico en JavaScript hacen que nuestra implementación de interfaces antiadherentes sea menos influyente que los lenguajes escrita estáticamente, pero el principio de aislamiento de la interfaz todavía tiene su función en el modelo de programación de JavaScript.