表名和目录名是用单数好还是用复数好

表名和目录名是用单数好还是用复数好

Chris Yue No Comment
Posts

刚开始一个新的项目,总是满怀憧憬和激动万分的。也许你已经对整个系统架构有了精妙的构思,想象自己就快升职加薪迎娶白富美了,但实际你却还在纠结——或者跟团队争论——这用户表是叫 “user” 呢还是叫 “users” 呢?API 里提供的会员列表应该是 /user 还是 /users ?如果你跟我一样,只想赶紧升职加薪迎娶白富美,那么我们可以在开始下一个项目之前,提前讨论一下这个世纪难题(真的是世纪难题,stackoverflow 上关于此问题的讨论也非常多)。

从各种框架的开发习惯来,以及目前网上已经存在的讨论来说,倾向于使用复数的人稍微多一些,想想经典的 “Program Files” 目录,或者 Mac 下的 “Users” 目录,HTTP API 也类似,github 和 facebook 等知名互联网公司都是复数党的。

所以还有什么好想的,照着大公司的做法准没错,完结散花!

咳……

当然……大公司的习惯也不一定是最适合自己的习惯是吧。从我自己的工作经验出发来思考这个问题,我是越来越倾向于使用单数,所以在我身上到底发生了什么?

说实话,国内的工程师大都英语素质不是很好——包括我在内,所以每次我看见一个表叫什么『leafs』,『mouses』,甚至『propertys』,我就会开始急躁……,当然还有一种另外一种急躁,那是类似给 news 起表名,但又想让表名和对象名达成一种单复数对应规则的急躁。天下无难事,只怕有心人——除了起名字。

使用复数最大的问题,在于——相对的——更容易减慢开发的速度,以及影响开发体验,特别是对于我这种准处女座的人来说。所以,我现在倾向压根就不去想这个问题,都单数拉倒。其实大家都明白,很多事情是没有绝对的标准答案的,但给自己的选择找一堆合理的理由却很容易。我的理由就是:表名其实是指代表里面装的是什么类型的东西,所以『user 表』那自然表里的数据都是 user 咯,还是很合理的是吧。

这个规则用到 API 的路径上,是这个样子的:

  • GET /user
  • GET /user/1

不知道你们啥感受,对我来说,第二个看上去还挺合适,比 ,/users/1 还合适,但第一个的真的要命…… 不过不要紧啊,我现在的做法是,只要是/结尾的,都表示一个集合:

GET /user/

套用上面对表名的解释:这个目录下包含的是一堆叫做『user』的东西,所以叫『user』目录很合适嘛。

既然都说到这了,顺便说一下控制器的命名吧。

我追求类的纯粹性,对于 CRUD 来说,操作一个对象和集合,是两个类的事情。所以对于一些常见的开发习惯,我会这么来设计控制器:

  • UserController
  • UsersController

为了避免之前所说的复数形式的问题,第二种也可以改成 UserListController (或者 UserCollectionController)。在使用 Symfony 的时候,这么写也的确可以享受到一些便利,比如 Route 注解可以都不用写在方法上了,class 上写一次就完全搞定:

表名和目录名是用单数好还是用复数好 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

文章不错,我要帮站长分担建站费!
天使投赏人

发表评论

− one = one