una tablas tabla recorrer obtener filas ejemplos editar dinamicas datos con agregar javascript design oop interface dynamic-languages

javascript - recorrer - tablas dinamicas html jquery



¿Son necesarias las interfaces en JavaScript? (5)

Supongo que esto podría aplicarse a cualquier lenguaje dinámico, pero el que estoy usando es JavaScript. Tenemos una situación en la que estamos escribiendo un par de controles en JavaScript que necesitan exponer una función Send () que luego es llamada por la página que aloja el JavaScript. Tenemos una matriz de objetos que tienen esta función de envío definida, por lo que iteramos a través de la colección y llamamos a Send () en cada uno de los objetos.

En un lenguaje OO, si quisiera hacer algo similar, tendría una interfaz IControl que tiene una función Send () que debe ser implementada por cada control y luego tendría una colección de implementaciones de IControl que iteraría a través de y llame al método de envío.

Mi pregunta es, dado que JavaScript es un lenguaje dinámico, ¿hay alguna necesidad de definir una interfaz de la que los controles deban heredarse, o es lo suficientemente buena como para simplemente llamar a la función Send () expuesta en los controles?


Como puede llamar a cualquier método en cualquier objeto en un lenguaje dinámico, no estoy seguro de cómo las interfaces entrarán en juego de ninguna manera realmente útil. No hay contratos para hacer cumplir porque todo se determina en el momento de la invocación; un objeto incluso podría cambiar si se ajusta a un "contrato" durante su vigencia a medida que se agregan y eliminan métodos durante el tiempo de ejecución. La llamada fallará si el objeto no cumple con un contrato o fallará si no implementa un miembro; cualquier caso es el mismo para la mayoría de los propósitos prácticos.


Esto es lo mismo para PHP; realmente no necesitas interfaces. Pero existen para las necesidades arquitectónicas. En PHP, puede especificar sugerencias de tipo para funciones que pueden ser útiles.

En segundo lugar, una interfaz es un contrato. Es un contrato formal que todos los objetos de esta interfaz tienen esas funciones . Es mejor asegurarse de que sus clases cumplan con esos requisitos que recordar: " mm, esta clase tiene isEnabled() pero la otra es checkIfEnabled() ". Las interfaces te ayudan a estandarizar. Otros que trabajan en el objeto derivado no tienen que verificar si el nombre es isEnabled o checkIfEnabled (mejor para dejar que el intérprete capte esos problemas).


Los lenguajes dinámicos a menudo alientan a Duck Typing , en el cual los métodos del objeto dictan cómo se debe usar en lugar de un contrato explícito (como una interfaz).


Vimos una buena implementación en la página siguiente, esta es nuestra (versión corta)

var Interface = function (methods) { var self = this; self.methods = []; for (var i = 0, len = methods.length; i < len; i++) { self.methods.push(methods[i]); } this.implementedBy = function (object) { for (var j = 0, methodsLen = self.methods.length; j < methodsLen; j++) { var method = self.methods[j]; if (!object[method] || typeof object[method] !== ''function'') { return false; } } return true; } }; //Call var IWorkflow = new Interface([''start'', ''getSteps'', ''end'']); if (IWorkflow.implementedBy(currentWorkFlow)) { currentWorkFlow.start(model); }

El ejemplo completo está en: http://www.javascriptbank.com/how-implement-interfaces-in-javascript.html


Bob.js ofrece otra alternativa a las interfaces:

1. Verifique si la interfaz está implementada:

var iFace = { say: function () { }, write: function () { } }; var obj1 = { say: function() { }, write: function () { }, read: function () { } }; var obj2 = { say: function () { }, read: function () { } }; console.log(''1: '' + bob.obj.canExtractInterface(obj1, iFace)); console.log(''2: '' + bob.obj.canExtractInterface(obj2, iFace)); // Output: // 1: true // 2: false

2. Extraiga la interfaz del objeto y siga ejecutando las funciones correctamente:

var obj = { msgCount: 0, say: function (msg) { console.log(++this.msgCount + '': '' + msg); }, sum: function (a, b) { console.log(a + b); } }; var iFace = { say: function () { } }; obj = bob.obj.extractInterface(obj, iFace); obj.say(''Hello!''); obj.say(''How is your day?''); obj.say(''Good bye!''); // Output: // 1: Hello! // 2: How is your day? // 3: Good bye!