技术组件说的是软件工程中可以复用“零件”或者说“元件”吧。通常是经过多个项目之后将解决同一类需求的实现抽象出来,打包成可以重用、可以配置的部件。 好处是避免重新发明轮子、节省开发者的时间,将精力放在更高层的抽象上。
6 年前用 RoR 开发的时候,最好用的组件是 Active Record。AR 是个把关系数据库映射成对象的组件,用它开发中数据逻辑不需要写 SQL,直接写 Ruby(或者在此基础上抽象成更简单的DSL)。
举个例子,数据库中两个表 `order_lines` 和 `customers`,通过 `customer_id` 可以实现获得订单的客户信息,或者通过客户 id 查询到所有订单,乃至新增订单等操作。如果没有 AR,对于查询客户所有订单这个操作,需要写类似 `SELECT * FROM order_lines WHERE customer_id = 0123;`。而引入 AR 之后,调用 `customer.order_lines` 即可获得该客户的所有订单信息。扩展说明如下:
常见的业务场景,比如在删除一条产品信息时,需要同时删除相关订单信息(假设的情景,现实中往往只是改变状态位),类似的需求 AR 内建了解决方案。比如在定义 Customer 类的时候 申明 `after_delete :cascade`(仅举例,实际语法不通),即可实现。如果是改变状态位,也可自行申明`after_delete :my_func`(`my_func` 另行定义即可,代码类似`this.order_lines.update :status => 1, :save => true1`)。
通过这个简短的例子,可以到 AR 的另一个好处:借助 OOP 的方法解决数据逻辑,可扩展、易维护。
当然,实际运行过程中,AR 还是会将 Ruby 代码转换为 SQL,翻译过程有一定性能损耗,另外机器生成的 SQL 也未必如有经验的 DBA 写的效率高。不过这也是 6 年前,查询优化技术方面的研究也有可能会让 AR 等 ORM 方案的效率更高。另外, 实际项目中,人的时间总是比机器宝贵的。 非要到性能关键的场合,手动写一些 SQL 也不是不可以。
类似 AR 的思路,微软开发了 PowerQuery 这种可视化的工具,使数据分析师、产品经理等不需要写 SQL 就能直接查询数据库。
总结一下,为什么我认为 ActiveRecord 是个好组件: