Реализация оболочки JavaScript API

Может ли кто-нибудь предложить шаблон, который можно использовать для написания оболочки 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 для потребителей библиотеки.

Минусы : приведет к созданию огромной монолитной библиотеки, которую трудно поддерживать.

Модульное решение

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 оставался согласованным. Не особо СУХОЙ.

Это может быть тот случай, когда что-то вроде Интерфейса было бы полезно, но, насколько мне известно, нет никакого способа обеспечить выполнение контракта в Js.

Есть ли лучший практический подход для такого рода проблем?

5
задан Bayard Randel 13 February 2012 в 02:24
поделиться