{ Article findByTitle(String title); Article findByTitleAndAuthor(String title, String author); } 当你需要使用的时候,只要在服务里调用对应的接口即可。 class ArticleService { private ArticleRepository repository; ... public Article findByTitle(final String title) { return repository.findByTitile(title); } } 显然,Java 无法像 Rails 那样不声明方法就去调用,因为这是由 Ruby 的动态语言特性支持的,而 Java 这种编译型语言是做不到的。不过比起从前自己写 SQL、做对象映射,已经减少了很多的工作量。 顺便说一下,Spring Data JPA 之所以能够只声明接口,一个重要的原因就是它利用了 Spring 提供的基础设施,也就是上一讲提到的依赖注入。它帮你动态生成了一个类,不用你自己手工编写。 简单,表达性好,这就是 Rails API 的风格。 命令行接口 ----- 作为程序员,我们都知道自动化的重要性,但 Rails 在“把命令行的接口和整个工程配套得浑然一体”这个方面做到了极致。Rails 的自动化不仅会帮你做一些事情,更重要的是,它还把当前软件工程方面的最佳实践融合进去,这就是 Rails 的命令行风格。 如果要创建一个新项目,你会怎么做呢?使用 Rails,这就是一个命令: $ rails new article-app 这个命令执行的结果生成的不仅仅是源码,还有一些鼓励你去做的最佳实践,比如: 它选择了 Rake 作为自动化管理的工具,生成了对应的 Rakefile; 它选择了 RubyGem 作为包管理的工具,生成了对应的 Gemfile; 为防止在不同的人在机器上执行命令的时间不同,导致对应的软件包有变动,生成了对应的 Gemfile.lock,锁定了软件包的版本; 把对数据库的改动变成了代码; …… 而这仅仅是一个刚刚生成的工程,我们一行代码都没有写,它却已经可以运行了。 $ bin/rails server 这就启动了一个服务器,访问 http://localhost:3000/ 这个 URL,你就可以访问到一个页面。 如果你打算开始编写代码,你也可以让它帮你生成代码骨架。执行下面的命令,它会帮你生成一个 controller 类,生成对应的页面,甚至包括了对应的测试,这同样是一个鼓励测试的最佳实践。 $ bin/rails generate controller Welcome index 在 Rails 蓬勃发展的那个时代,人们努力探索着 Web 开发中各种优秀的做法,而在这个方面走在最前沿的就是 Rails。所以,那个时候,我们经常会关注 Rails 的版本更新,看看又有哪些好的做法被融入其中。 Rails 中那些优秀的实践逐步地被各种语言的框架学习着。语言编写者们在设计各种语言框架时,也都逐步借鉴了 Rails 中的那些优秀实践。比如,今天做 Java 开发,我们也会用到数据库迁移的工具,比如 Flyway。 当然,另一个方面,即便到了今天,大部分项目的自动化整合程度也远远达不到 Rails 的高度,可能各方面的工具都有,但是如此浑然一体的开发体验,依然是 Rails 做得最好。 最后,你可能会问,Rails 这么优秀,为什么今天却落伍了呢? 在 Web 开发领域,Rails 可谓成也 MVC,败也 MVC。MVC 是那个时代 Web 开发的主流,页面主要在服务端进行渲染。然而,后来风云突变,拜 JavaScript 虚拟机 V8 所赐,JavaScript 能力越来越强,Node.js 兴起,人们重新认识了 JavaScirpt。它从边缘站到了舞台中心,各种组件层出不穷,前端页面的表现力大幅度增强。 Web 开发的模式由原来的 MVC,逐渐变成了前端提供页面,后端提供接口的方式。Java 的一些框架和服务也逐步发展了起来,Spring 系列也越来越强大,重新夺回了 Web 后端开发的关注。 总结时刻 今天,我们学习如何了解设计的第二部分:看接口。看接口的一个方法是找主线,看风格。先找到一条功能主线,对项目建立起结构性的了解。有了主线之后,再沿着主线把相关接口梳理出来。 查看接口,关键要看接口的风格,也就是项目作者引导人们怎样使用接口。在一个项目里,统一接口风格也是很重要的一个方面,所以,熟悉现有的接口风格,保持统一也是非常重要的。 我还介绍了一个曾经火爆的 Web 开发框架:Ruby on Rails。借着它的起步走文档,我给你介绍了它的一些接口,包括: Web 应用对外暴露的接口:REST API; 程序员写程序时用到的接口:API; 程序员在开发过程中用到的接口:命令行。 从 Rails 的接口设计中,我们可以看到,一个好的接口设计,无论是最佳实践的引入,抑或是 API 设计风格的引导,都可以帮助我们建立起良好的开发习惯。 当我们理解了模型和接口,接下来就该看实现了,这就是我们下一讲要讲的内容。 如果今天的内容你只能记住一件事,那请记住:理解一个项目的接口,先找主线,再看风格。  思考题 --- 最后,我想请你来分享一下,你在哪个项目的设计中学到了一些好的开发习惯呢?欢迎在留言区分享你的经历。 感谢阅读,如果你觉得这一讲的内容对你有帮助的话,也欢迎把它分享给你的朋友。