我正在重写一个我几周前创建的相当复杂的脚本。在向少数人展示之后,他们都同意我应该把它分解成具有特定目的的小块(类),SOLID object-oriented programming principles
作为一个自学成才的程序员,这些概念对我来说是一个新手,我对如何最好地将数据从一个函数/类传递到另一个函数/类感到困惑。例如,这是我正在构建的简化结构:
我的问题是:
我是否应该有一个“控制器”脚本来调用所有这些函数/类并在必要时传递数据?这是我将for loop
放在上图中的位置,即使它与Function 1
的一部分一样可以调用Function 2
吗?
答案 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 方法中创建存储库对象,想一想注入它们的方式,以便您满足依赖性反转原则。
希望它有所帮助!