何时应该使用/优先选择透明模块设计模式而不是面向对象的范式,或者反之?

14 浏览
0 Comments

何时应该使用/优先选择透明模块设计模式而不是面向对象的范式,或者反之?

我偶然发现了Lukas Ruebbelke的优秀著作《关于AngularJS的行动》,AngularJS in Action

当你使用module.service定义一个服务时,实例会通过构造函数返回。这非常适合那些更喜欢编写面向对象代码并且喜欢在this关键字上定义方法和属性的开发者。

angular.module("Mod").
        service("myService", function($rootScope){
                                  var service = this;
                                  service.setLoading = function(loading){
                                      // 这里是一些代码
                                  }
});

现在,他展示了使用module.factory来实现相同功能的服务:

angular.module("Mod").
            factory("myFactory", function($rootScope){
                                      var setLoading = function(loading){
                                          // 这里是一些代码
                                      };
                                      return {
                                          setLoading : setLoading
                                      }
});

这种方式与模块揭示模式非常相似。

问题与service和factory的区别无关,因为这对我来说已经非常清楚了,而是关于在哪些情况下,上述提到的设计模式中的一种优先于另一种,反之亦然。

或者说这只是用户偏好,最好坚持使用其中一种模式?

0
0 Comments

Revealing Module设计模式何时应该被使用或优先于面向对象的范式?

Revealing Module设计模式何时应该被使用或优先于面向对象的范式?这个问题的出现的原因是因为模块模式的三种不同实现之间的比较。其中,Revealing Module Pattern在覆盖和原型继承方面表现不佳,而Stub Module Pattern在覆盖方面表现良好,但在原型继承方面表现不佳,而Original Module Pattern在正确执行时在覆盖和原型继承方面表现良好。然而,Original Module Pattern在使用this时,如果不使用var self = this或function.bind()的某种变体,就无法将其函数作为参数传递。此外,Revealing Module Pattern的优点是可以轻松地将公共成员更改为私有成员,反之亦然,而无需修改函数体。因此,可以推断出每种实现都有权衡和优点,在某些情况下可以选择其中一种。然而,这是一个错误的推断。我认为,使用this的Original Module Pattern的优势是实质性的,使用Original Module Pattern创建的对象在覆盖和原型覆盖方面表现出预期的行为。另一方面,Revealing Module Pattern所谓的优势只是方便——编码人员只需输入少量的代码。因此,绝对没有技术上的理由优先选择Revealing Module Pattern而不是Original Module Pattern。因此,我们应该始终使用Original Module Pattern。然而,确实有非技术原因优先选择Revealing Module Pattern。通过完全避免使用this,Revealing Module Pattern的编码人员不需要学习JavaScript的this的微妙之处。这是Revealing Module Pattern在流行的真正原因。

0
0 Comments

问题的出现原因是因为在使用设计模式时,需要考虑何时应该使用“Revealing Module”设计模式,何时应该使用面向对象编程范式。解决方法是比较“Revealing Module”设计模式和面向对象编程范式的优势和适用场景。

“Revealing Module”设计模式在大多数情况下与工厂模式一起使用。尽管“service”和“factory”的实际区别要多一些(“service”仅限于扩展“this”对象,而“factory”可以返回任何类型的数据,而不仅仅是对象),但在问题的上下文中,它们执行相同的工作。

使用“service”语法结合“this”关键字可以有效地重构使用“controllerAs”语法的控制器,因此它们的方法(同时考虑可能的“$scope”依赖)可以复制到新的“service”中。这里有一个使用此方法通过混合扩展控制器的示例。

对于“service”的有力论点是它非常适合转换为ES2015或TS类。

0