Может ли кто-нибудь предложить шаблон, который можно использовать для написания JavaScript API wrapper , где нет общего кода между несколькими реализациями? Идея состоит в том, чтобы предоставить клиенту-потребителю единый API-интерфейс для одного из многих возможных API-интерфейсов, определенных во время выполнения. Вызовы API могут относиться к объектам / библиотекам, уже находящимся в среде приложения, или к вызовам веб-служб.
Следующие биты псевдокода - это два подхода, которые я рассмотрел:
Монолитный раствор
var apiWrapper = {
init: function() {
// *runtime* context of which API to call
this.context = App.getContext();
},
getName: function() {
switch(context) {
case a:
return a.getDeviceName() // real api call
case b:
return b.deviceName // real api call
etc...
}
// More methods ...
}
}
Плюсы : Может поддерживать согласованный API для потребителей библиотеки.
Минусы : приведет к созданию огромной монолитной библиотеки, которую трудно поддерживать.
Модульное решение
init.js
// set apiWrapper to the correct implementation determined at runtime
require([App.getContext()], function(api) {
var apiWrapper = api;
});
module_a.js
// Implementation for API A
define(function() {
var module = {
getName: function() {
return deviceA.getDeviceName();
}
};
return module;
});
module_b.js
// Implementation for API B
define(function() {
var module = {
getName: function() {
// could also potentially be a web service call
return deviceB.getName;
}
};
return module;
});
Плюсы : Больше обслуживания.
Минусы : разработчики должны позаботиться о том, чтобы API оставался согласованным. Не особо СУХОЙ.
Это может быть случай, когда что-то в духе Interface будет полезным, но, насколько я знаю, нет способа принудительно реализовать контракт в Js.
Существует ли наилучший практический подход для решения такой проблемы?