使用Composition的通用JavaScript模型

时间:2016-08-24 07:17:42

标签: javascript node.js composition

我目前正在开发一个Node.js应用程序,其中包含几个JavaScript模型:

function Role(data) {
  this.data = data;
  ...
}

Role.prototype.save = function(...) {...}

Role.findById = function(...) {...}
Role.findAll = function(...) {...}

对于大多数功能,它们都使用相同(相似)的逻辑,但有些需要不同的实现来保存等等。所以我的想法是通过使用某种组合来重构它们。我目前的解决方案是使用原型函数的继承和静态函数的适配器的组合。它看起来像这样。

var _adapter = new DatabaseAdapter(SCHEMA, TABLE, Role);

function Role(data) {
  Model.call(this, _adapter, Role._attributes)
  this.data = data;
  ...
}

Role._attributes = {
  name: ''
}

Role.prototype.save = function(...) {...}

Role.findById = function(...) {
  _adapter.findById(...);
}

Role.findAll = function(...)
{
  _adapter.findAll(...)
}

但是,我对目前的解决方案并不满意,因为开发人员需要了解很多实现细节才能创建新模型。所以,我希望有人能告诉我一个更好的方法来解决我的问题。

谢谢, 亨德里克

修改 经过一番研究后,我提出了以下解决方案:

角色模型:

 Role.schema = 'db-schema-name';
 Role.table = 'db-table-name';
 Role.attributes = { /* attributes of the model */ }

 Role.prototype.save = genericSaveFunc;

 Role.findById = genericFindByIdFunc;
 ...

通用保存:

 function genericSaveFunc(...) {
   if (this.id) {
     // handle update
     // attributes in 'this' will be updated 
   } else {
     // handle create
     // attributes in 'this' will be updated 
   }
 }

静态泛型函数findById:

 function genericFindByIdFunc(...) {
   /* use this.schema && this.table to create correct SELECT statement */
 }

模型创建可以包装到工厂功能中。此解决方案的优点是可以简单地创建具有不同功能的新模型(例如,只将savefindById添加到模型中。但我不知道依赖泛型函数的调用上下文是否是一个好主意?

1 个答案:

答案 0 :(得分:1)

因为您使用的是基于原型的语言。没有必要尝试进行类继承。看一下stampit它会让你很容易用JavaScript方式进行组合:)