OOP - 从其他功能中调用函数或拥有一个大控制器是否更好?

时间:2013-06-13 07:34:09

标签: javascript oop solid-principles

我正在重写一个我几周前创建的相当复杂的脚本。在向少数人展示之后,他们都同意我应该把它分解成具有特定目的的小块(类),SOLID object-oriented programming principles

作为一个自学成才的程序员,这些概念对我来说是一个新手,我对如何最好地将数据从一个函数/类传递到另一个函数/类感到困惑。例如,这是我正在构建的简化结构:

enter image description here

我的问题是:

我是否应该有一个“控制器”脚本来调用所有这些函数/类并在必要时传递数据?这是我将for loop放在上图中的位置,即使它与Function 1的一部分一样可以调用Function 2吗?

1 个答案:

答案 0 :(得分:1)

如果没有控制器/服务脚本,您实际上将无法满足单一责任原则。如果我是你,这是我实施的高级设计。

<强> FileRepository文件
应该公开一个获取文件的方法。我们将其命名为 GetFileById

<强> MongoDBRepository CRUD操作的方法。例如 SelectById SelectByQuery 更新创建删除

对象创建逻辑
如果您的 createNewObj 逻辑很简单,那么将它移动到您的对象构造函数就足以让您的代码看起来像这样:var newObj = new MyObj(json[i]); 但是,如果它相对复杂,可能是因为你使用了一些第三方框架进行验证,或者你最好创建一个工厂。然后你可以这样看:var newObj = MyObjFactory.Create(json[i]);

<强>服务/控制器
最后,您需要实现控制器/服务对象。我们使用方法 DoWork 将其命名为 WorkService ,该方法应处理存储库与上述其他对象之间的所有交互。这里的DoWork大概应该是这样的:

function DoWork(fileId){
  var json = fileRepository.SelectById(fileId);
  for(var i=0;i<json.length;i++){
     var newObj = new MyObj(json[i]);  // or calling factory method
     var dbRecord = MongoDBRepository.SelectByQuery(newObj.name, newObj.date);
     if(dbRecord){
       MongoDBRepository.Update(newObj);
     }
     else{
       MongoDBRepository.Create(newObj);
     }
  }
}

请注意它只是一个javascript语法伪代码。你的实际代码看起来可能与absolutley不同,但它让你感觉到你应该拥有什么样的设计。此外,我明确地没有在 DoWork 方法中创建存储库对象,想一想注入它们的方式,以便您满足依赖性反转原则。

希望它有所帮助!