Предисловие
В этой главе мы собираемся объяснить четвертую главу реализации пяти основных принципов солидного JavaScript, принципа сегрегации интерфейса.
Оригинальный английский текст: http://freshbrewedcode.com/derekgreeer/2012/01/08/solid-javascript-the-inter-segration-principle/
Примечание: автор этой статьи довольно трогательна, поэтому дядя также депрессию, чтобы понять ее. Просто прочитайте это как вам, пожалуйста, не застряли в нем.
Описание принципа изоляции интерфейса:
Кода -копия выглядит следующим образом:
Клиенты не должны быть вынуждены зависеть от методов, которые они не используют.
Клиенты не должны быть вынуждены полагаться на методы, которые они не используют.
Когда метод интерфейса, от которого зависит пользователь, используется только другими пользователями и не использует его, он должен реализовать эти интерфейсы. Другими словами, если пользователь полагается на интерфейс, который не используется, а используется другими пользователями, когда другие пользователи изменяют интерфейс, будут затронуты все пользователи, полагаемые на интерфейс. Это, очевидно, нарушает принцип открытия и закрытия, и это не то, что мы ожидаем.
Принцип изоляции интерфейса ISP несколько похож на единую ответственность. Оба используются для агрегирования функциональных обязанностей. Фактически, ISP можно понять, чтобы преобразовать программы с единичными обязанностями в объект с публичным интерфейсом.
Интерфейс JavaScript
Как мы соблюдаем этот принцип под JavaScript? В конце концов, JavaScript не имеет функции интерфейсов. Если интерфейс - это то, что мы хотим установить контракт и отделить с помощью абстрактных типов, предоставленных определенным языком, можно сказать, что он в порядке, но у JavaScript есть другая форма интерфейса. В моделях дизайна книги элементы многоразового объектно-ориентированного программного обеспечения мы нашли определение интерфейса:
http://www.amazon.com/design-patterns-elements-reusable-object-oriented/dp/0201633612
Любая операция, объявленная объектом, содержит имя операции, объект параметра и возвращаемое значение операции. Мы называем это подписью оператора.
Все операции, объявленные в объекте, называются интерфейсом этого объекта. Интерфейс объекта изображает всю информацию о запросах, которая происходит в этом объекте.
Независимо от того, предоставляет ли язык отдельную конструкцию для представления интерфейса, все объекты имеют неявный интерфейс, состоящий из всех свойств и методов объекта. См. Следующий код:
Кода -копия выглядит следующим образом:
var examplebinder = {};
exampleBinder.ModelobServer = (function () {
/* Приватная переменная*/
возвращаться {
Наблюдайте: функция (модель) {
/* Код*/
вернуть Newmodel;
},
Onchange: function (обратный вызов) {
/* Код*/
}
}
}) ();
exampleBinder.ViewAdaptor = (function () {
/* Приватная переменная*/
возвращаться {
bind: function (model) {
/* Код*/
}
}
}) ();
Пример Binder.bind = function (model) {
/* Приватная переменная*/
exampleBinder.Modelobserver.onchange (/ * обратный вызов обратного вызова */);
var om = examplebinder.modelobserver.observe (model);
examplebinder.viewadaptor.bind (om);
вернуть ом;
};
Вышеупомянутая библиотека классов примера Binder реализует двустороннюю привязку. Общественный интерфейс, выявленный этой библиотекой классов, представляет собой метод связывания, где функции уведомления об изменении и взаимодействие представления, используемые в Bind, реализованы отдельными объектами ModelObserver и ViewAdaptor, соответственно. Эти объекты в некотором смысле являются конкретной реализацией метода привязки общего интерфейса.
Хотя JavaScript не предоставляет типы интерфейсов для поддержки объектов контрактов, неявный интерфейс объекта все еще может быть предоставлен пользователям программы в качестве контракта.
ISP и JavaScript
Некоторые из подразделах, которые мы обсуждаем ниже, являются влиянием нарушения принципа изоляции интерфейса в JavaScript. Как видно выше, хотя жаль реализовать принцип изоляции интерфейса в программах JavaScript, он не так мощный, как статически напечатанные языки. Языковые характеристики JavaScript иногда делают так называемый интерфейс немного непризовым.
Реализация порочности
В статически напечатанных языках одной из причин нарушения принципов ISP является вырожденная реализация. Методы, определенные во всех интерфейсах в Java и C#, должны быть реализованы. Если вам нужно только несколько из них, другие методы также должны быть реализованы (могут быть реализованы пустыми или бросающими исключениями). В JavaScript необходимы только некоторые интерфейсы в объекте, он не может решить проблему вырожденной реализации, хотя нет необходимости заставлять реализацию вышеуказанного интерфейса. Однако эта реализация все еще нарушает принцип замены Рихтера.
Кода -копия выглядит следующим образом:
var rectangle = {
область: function () {
/* Код*/
},
Нарисуйте: function () {
/* Код*/
}
};
var geometryApplication = {
getlargestrectangle: function (прямоугольники) {
/* Код*/
}
};
var transwapplication = {
DrawRectangles: function (прямоугольники) {
/* Код*/
}
};
Когда прямоугольная альтернатива для удовлетворения getlargestrectangle нового объекта GeometryApplication, ему нужен только метод прямоугольной области (), но он нарушает LSP (поскольку он не может использовать метод рисования, который можно использовать только в методе DrawRectAngles).
Статическая связь
Еще одна причина нарушений интернет -провайдера на статически напечатанных языках - статическая связь. В статически напечатанных языках интерфейсы играют важную роль в слабо связанной программе проектирования. Будь то на динамическом или статическом языке, иногда объект может потребоваться общаться между несколькими клиентскими пользователями (такими как общее состояние). Для статически напечатанных языков наилучшим решением является использование ролевых интерфейсов, что позволяет пользователю взаимодействовать с объектом (который, возможно, должен быть в нескольких ролях) в качестве его реализации, чтобы отделить пользователя и не связанного поведения. В JavaScript нет такой проблемы, потому что объекты отделяются уникальными преимуществами динамических языков.
Семантическая связь
Одной из общих причин нарушения ISP является динамическая и статически напечатанная языки, а это семантическое соединение. Так называемая семантическая связь-это взаимозависимость, то есть поведение объекта зависит от другого объекта, что означает, что если пользователь изменит одно из поведения, это, вероятно, повлияет на другого пользователя. Это также нарушает принцип единой ответственности. Эта проблема может быть решена с помощью наследования и замены объекта.
Масштабируемость
Другая причина проблемы - о масштабируемости. Многие люди приведут примеры о вызове, чтобы продемонстрировать масштабируемость (например, настройки обратного вызова после успеха в Ajax). Если такой интерфейс нуждается в реализации, и в объекте этой реализации есть много знакомых или методов, ISP станет очень важным. То есть, когда интерфейс интерфейса становится необходимостью реализации многих методов, его реализация станет чрезвычайно сложной, и это может привести к тому, что эти интерфейсы возьмут на себя нестирную ответственность. Это жирный интерфейс, который мы часто упоминаем.
Суммировать
Динамические языковые характеристики в JavaScript делают нашу реализацию непринимающих интерфейсов менее влиятельными, чем статически напечатанные языки, но принцип изоляции интерфейса по-прежнему имеет свою функцию в модели программирования JavaScript.