21

我已经开始使用 Yo (yeoman) 为 angularjs 搭建我的控制器、服务等。

我通常做一个

  yo angular:service passwordService

我使用的是驼峰式大小写,因为这是它创建的文件的名称,但我注意到它也使用相同的名称作为服务的名称,所以

passwordService

而不是

PasswordService

这里有哪些最佳实践?

谢谢

4

2 回答 2

21

值得注意的是,在许多地方的开发人员指南中(包括链接到“服务”部分),AngularJS 开发人员使用驼峰+第一个小写来表示服务名称和其他内容。所以也许你会认为这是 AngularJS 的最佳实践。

也就是说,我认为在其他语言中,使用驼峰+首字母大写来命名服务和类更为常见,实际上,在 JavaScript 中,这似乎特别重要。考虑到你有一个名为的类user——那么你会怎么称呼一个包含 的实例的变量useruser如果没有非常尴尬/容易出错的阴影,您将无法调用它。

在 AngularJS 中,您的$resource服务最终将成为您在 OO JavaScript 中的“旧”类。看:

angular.module('Foo', [], function() {}).factory('User', function() {
  var User = $resource('/api/user');

  User.prototype.getFullName = function() {
    return this.firstName + ' ' + this.lastName;
  };

  return User;
});

看看我要去哪里?您最终将注入新的User $resource并实例化它:

function MyController($scope, User) {
  var someNewUser = new User();
};

或者,您将希望使用一个简单的 var 名称来迭代多个用户,例如user当前项目:

angular.forEach(someUsers, function(user) {
  // Good thing you didn't name your $resource "user"!
  // Weird/undesirable shadowing would result here then...
});

如果您需要更多说明,请告诉我为什么我认为在 JavaScript 的上下文中,类/服务名称的最佳实践首先是大写的。(相比之下,考虑到 PHP 中的 var 名称以 为前缀$,因此在 var 名称和类名称之间不会发生阴影。$User = new User() 非常好。)

当然,您可以User = new user()在 JS 中执行,但这与现有语言/样式指南的标准几乎相反。

于 2013-06-24T05:49:02.940 回答
15

对于 Javascript 约定,仅PascalCase当且仅当相关函数是constructor函数时才应使用。(即必须用new调用。这很重要,因为它让程序员知道必须使用new,否则this属性将被搞砸。

对于工厂和供应商等,您实际上应该使用camelCase约定。

更新

虽然我最初的主张仍然存在于 Angular 之外的 JS 环境中,但我现在认为最好将其PascalCase用于注入变量。这已经是很长时间的惯例了,不值得反击。由于注入的变量几乎总是单例并且是应用程序范围的,因此将它们与在函数范围内创建的局部变量区分开来感觉是正确的。

于 2013-06-24T13:18:56.747 回答