今天是感恩节,也刚好是我来到 ⅩⅩ实习整 3 个月,的确是个值得纪念的日子。首先,感觉自己是个幸运的人,很幸运的得到来 ⅩⅩ实习的机会,很幸运认识组里面的每一个人。感谢老大博一,让我能够加入 ⅩⅩ这个大家庭,并在适当的时候给予我指点,给我创造展现自己的机会;感谢师傅士敦,每次遇到问题都耐心的帮我讲解,带我敲开 Rails 的大门,教会我各种技巧;感谢 Twork 组里的每一位成员,从各方面给予我指导,帮助 …… 真的很感激,谢谢!
我一直很喜欢一句话——“自助者天助”。其实只要付出了,就一定会有收获。来 ⅩⅩ的 3 个月来,从初识 ruby 语言,初识 Rails 框架,到用一个多月的时间完成“线上账号管理”,用一个多星期的时间完成“兼容性测试账号管理”,感觉自己每天都在收获、在成长,这种感觉很充实、很幸福。当看到你的产品在为他人服务,为他人提供便利的时候,我想这是每一位工程师最满足的时刻。
这段时间让我懂得,与他人沟通,准确地确认需求是多么重要。之前在学校里做的东西,大多是自己给自己提需求,这样功能点就很好把握。而真正的产品是给他人用的,需求也是由用户来提,所以需求确认时有一点不准确,都会极大地影响产品。如果这一步都没有走好,之后做出来的东西又有多大价值呢?不要怕浪费时间,在需求确认上投入越多的时间,其实就是为后期开发节省更多的时间。
接下来是我通过这段时间对 ruby 语言,以及 Rails 框架的学习,总结出来的一些心得体会。其中不准确的地方还请多多批评。
1. 实际应用中的管理员权限设计
在 users 表中加 admin 字段,来区分用户的权限,虽然目的可以达到,但是却为了一个业务,浪费了一个字段的资源,当角色更多时,这样设计就会出来一堆字段,是不正确的。更好的办法是引入 members 成员表,和 roles 角色表,这样当引入一个角色时,只要在 roles 表中增加一条记录,如果一个用户想拥有某一权限时,只要在 members 表中将此用户与某一角色关联即可。
2.Rails 的 MVC 架构
Ruby on Rails 的模型 - 视图 - 控制器架构由以下各部分组成:
模型
模型包含着应用的状态,状态可能是临时的也可能是长久性保存在数据库中的。需要注意的是模型不仅包含数据,而且包含数据代表的逻辑。在 Rails 中,模型通常是由一些代表关系数据库中 RDBMS 表的类组成的。
在 RoR 中,模型类是通过 Active Record 模式进行处理的。一般来说,我们要做的是继承 ActiveRecord 类,同时程序会自动计算出要使用哪个 RDBMS 表,这个表有哪些列。表与表之间的关系通过简单的命令来指明。
控制器
控制器将用户界面和数据模型关联起来,并充当协调运作的角色。它接收各种用户操作,更新数据模型,并用合适的 view 展示结果给用户。像它的名字一样,可以说应用的主要控制中心就是各个控制器。
视图
View 负责根据 Model 中的数据显示用户界面。作为 web 应用, Rails 里的 View 通常是生成整个或者部分网页。当然可以是 XML 或者甚至是 JavaScript 代码。表现为使用内嵌 Ruby 的 HTML / XML / JavaScript 模板。
3. 表间关系设计好后,很多事情就已经事半功倍了
Rails 的开发,给我的最大的感受就是它是面向数据库设计的开发。为什么这么说?因为从设计的一开始,我们就得把表和表之间的关系写清楚:谁和谁是一对多,谁和谁是多对多,并且在 model 层中用很简单的代码语句关联好。这部分设计好,基本就成功了 20% 了。这也是和以往的开发最不同的地方,我想也是 rails 吸引人的地方!
4. 模型之间的关系(神奇之处)
Rails 的设计原则包括“不要重复自己”( Don't Repeat Yourself )和“约定胜于配置”( Convention Over Configuration )。 Rails 框架是以固定的命名习惯来自动判断整个架构,默认下会将网址分析成 http://domain-name/ControllerName/ActionName/Attribute/ 然后执行目标 Controller 中的 Action ,并取出指定的 View( 视图 ) 回传给浏览器显示。面对数据库则以 Model( 模型 ) 的形式,借由 Active Record 作为与数据库之间的传输接口。并且一个模型类会默认对应一个数据表,比如 User 类对应 users 表,你只要在模型类中写好与其它模型类的关联关系,那么它们所对应的表就自动关联起来了,根本不需要像 Java 技术中那样写那些枯燥的 XML 配置文件,并且进行数据库 CRUD 操作时 , 也是直接操作模型类就可以了,如果是想查看某个用户有哪些账号,只需要 @user.accounts 就 ok 了( Users 表和 Accounts 表是一对多的关系),实在是非常神奇。
5. 避免 N+1 次查询
( 1 ) @ts = Testsuite.find(2).includes( : testcases)
@tcs = @ts.testcases
只查询一次数据库
( 2 ) @ts = Testsuite.find(2)
@tcs = @ts.testcases
查询了两次数据库
虽然是返回了相同的结果,但是( 1 )却比( 2 )减少了一次对数据库的操作,真的很划算。
6. 学会使用工具很重要
合格的工程师不能只会 coding ,要将眼光放远,要熟练多种操作系统,多种 IDE ,多种数据库的操作 ……. 要尝试搭建各种平台工具,来辅助我们的项目(例如持续集成工具、性能监测工具等等)。在这里不得不提的是,一定要养成阅读英文文档的习惯。因为很多新技术、小工具都是由国外传过来的,要想使用它,当然它们官网上的文档是最权威,最具指导意义的。
自己的一些拙见就先写到这里,日后还会继续沉淀。未完,待续 ……