Подтвердить что ты не робот

Необходимы ли интерфейсы в JavaScript?

Я полагаю, это применимо к любому динамическому языку, но тот, который я использую, - это JavaScript. У нас есть ситуация, когда мы пишем пару элементов управления в JavaScript, которые должны выставлять функцию Send(), которая затем вызывается на странице, на которой размещается JavaScript. У нас есть массив объектов, которые имеют эту функцию отправки, поэтому мы итерируем по коллекции и вызываем Send() для каждого из объектов.

На языке OO, если вы хотите сделать что-то подобное, у вас будет интерфейс IControl, который имеет функцию Send(), которая должна быть реализована каждым элементом управления, а затем у вас будет коллекция реализаций IControl, которые вы 'd идите и вызовите метод отправки.

Мой вопрос заключается в том, что с JavaScript, являющимся динамическим языком, существует ли необходимость в определении интерфейса, на который должны наследоваться элементы управления, или достаточно ли достаточно просто вызвать функцию Send(), которая отображается на элементах управления?

4b9b3361

Ответ 1

Динамические языки часто поощряют Duck Typing, в которых методы объекта определяют, как его следует использовать, а не явный контракт (например, интерфейс).

Ответ 2

Так как вы можете вызывать любой метод для любого объекта на динамическом языке, я не уверен, как интерфейсы будут входить в игру по-настоящему полезному. Нет контрактов на принудительное исполнение, потому что все определяется во время обращения - объект может даже изменить, соответствует ли он "контракту" в течение его жизни, поскольку методы добавляются и удаляются во время выполнения. Вызов завершится с ошибкой, если объект не выполнит контракт или он потерпит неудачу, если он не реализует элемент. В большинстве случаев любой случай одинаковый.

Ответ 3

Это то же самое для PHP; вам действительно не нужны интерфейсы. Но они существуют для архитектурных нужд. В PHP вы можете указать типы подсказок для функций, которые могут быть полезны.

Во-вторых, интерфейс - это контракт. Это формальный контракт, что все объекты этого интерфейса имеют эти функции. Лучше убедиться, что ваши классы отвечают этим требованиям, чем помнить: "мм, этот класс имеет isEnabled(), а другой - checkIfEnabled()". Интерфейсы помогают стандартизировать. Другие, работающие над производным объектом, не должны проверять, является ли это имя isEnabled или checkIfEnabled (лучше, чтобы интерпретатор поймал эти проблемы).

Ответ 4

Мы увидели хорошую реализацию на странице ниже, это наша (короткая версия)

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);
}

Весь пример: http://www.javascriptbank.com/how-implement-interfaces-in-javascript.html

Ответ 5

Еще одна альтернатива интерфейсам предлагается bob.js:

1. Проверьте, реализован ли интерфейс:

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. Извлеките интерфейс из объекта и по-прежнему выполните соответствующие функции:

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!