Может ли кто-нибудь предложить шаблон, который можно использовать для написания оболочки JavaScript API , где нет общего кода между несколькими реализациями? Идея состоит в том, чтобы предоставить клиенту-потребителю единый 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 для потребителей библиотеки.
Минусы : приведет к созданию огромной монолитной библиотеки, которую трудно поддерживать.
// set apiWrapper to the correct implementation determined at runtime
require([App.getContext()], function(api) {
var apiWrapper = api;
});
// Implementation for API A
define(function() {
var module = {
getName: function() {
return deviceA.getDeviceName();
}
};
return module;
});
// Implementation for API B
define(function() {
var module = {
getName: function() {
// could also potentially be a web service call
return deviceB.getName;
}
};
return module;
});
Плюсы : Более удобное обслуживание.
Минусы : Разработчики должны позаботиться о том, чтобы API оставался согласованным. Не особо СУХОЙ.
Это может быть тот случай, когда что-то вроде Интерфейса было бы полезно, но, насколько мне известно, нет никакого способа обеспечить выполнение контракта в Js.
Есть ли лучший практический подход для такого рода проблем?