20.如何从app业务逻辑提炼api接口

         在app后端的工作中,设计api是一个很考验设计能力的工作。在项目的初始阶段,只知道具体的业务逻辑,那怎么把业务逻辑抽象和提炼,设计出api呢?通过阅读本文,可解答以上疑惑。

        

         在本文中,是用以前做过的app移客ekeo第一版(以后的业务逻辑改了很多)业务逻辑来举例。移客ekeo是一款以熟人社交和真实聚会为核心的社交工具。移客以解决聚会难题为核心,你可以通过移客快速发起或者参与聚会活动,掌握参加者是否已经出发或者到达。    

         移客ekeo这个app已经停止运营了,如果想要更加了解ekeo的业务逻辑, 可下载app"微聚"来研究一下,这两个app在业务逻辑上是比较相近的。

 

         从业务逻辑到api出炉,分为下面6个阶段:

        

1.业务逻辑思维导图  

2.功能-业务逻辑导图

3.基本功能模块关系

4.功能模块接口uml(设计出api)

5.在设计稿标注api

6.编写api文档

 

 

1.业务逻辑思维导图

 

整个流程的第一步,就是抽象出业务逻辑。

 

抽象是什么意思?就是把相同的东西先放在一起,这是抽象的第一步。我们业务流程,就像一条河一样,从头走到脚,里面会有很多一样的东西,我们需要先抽象出来,就好比,一栋楼,就很多三角形,很多圆形,很多正方形,我们先要把这些东西抽象出来。

如果抽象都抽象错了,写接口也没啥用,就是在乱做了。

 

所以说抽象的第一步,就是我们其实可以通过思维导图的形式把我们相同的业务流程,抽象出来形成一个图表,然后通过关系箭头,表现出来。

 

1. 我们现在首先是要用思维导图把结构关系列出来,包括里面的功能

2. 我们要把相同的元素整理出来,比如说,都是相同的推送,都是相同的评论,都是图片上传,然后我们用相同的颜色,在1的图上面表明出来。

 

这样大家至少清楚,我们哪些业务逻辑是一样的,各位亲,这个如果都没搞清楚,你怎么敢确保后面你做的接口是完整的呢?等我们把这一步搞清楚,我们就知道了,一个模块,需要有哪些接口,那个时候,我们再用UML图,把接口和接口关系画出来,那个时候是抽象的第二步。

 

         根据业务逻辑整理出如下的思维导图:


 

2.功能-业务逻辑导图

 

这步的核心是"把业务逻辑和功能模块呈现的内容结合"。

 

功能模块,说简单点,就是支撑业务逻辑的功能模块。就是说,我们现在需要做的,是属于MODULES的这一块。

 

MVC ,最复杂,其实是M这一块,V 不用说, 很简单,其实就是业务流程,C  也很简单,是功能操作流程,M 怎么分, 如何对应前面的业务流程,很复杂。

 

“就是把业务逻辑和功能模块呈现的内容结合”什么意思?就是你写了一个MODUELS的名字出来,你要能够把业务逻辑里面的东西,和他关联起来。再说简单点,就是一对多,一就是MODULES,多就是业务逻辑,一个MODULES,对应于多个业务逻辑。

先做最上面的一层,尽可能多的进行一对多的分析,然后按照最小独立原则,看这个1,是不是一个最小的系统,按照GOOGLE的设计思想原理,每一个MODULES,都是一个可以独立运行的模块,也就是说,MODULES和MODULES之间是没关系的。

 

所以,后面的东西越来越复杂鸟。也就是说,你可能会画出ABCDEF 6个MODULES,对应前面的业务逻辑,但是去掉中间任意一个,比如只有ABCDF了,业务逻辑只是相对减少,而不会完全崩溃,这就是最小独立原则。

 

在思维导图中,其实是2个部分的结合
1. 业务逻辑
2. 功能模块

 

我们现在需要划分功能模块,依据3个原则:

 

1.      功能模块和业务逻辑之间的关系

2.      功能模块和功能模块之间还不能有关系

3.      功能模块还要尽可能的一对多(一个功能模块对应多个业务逻辑)

 

结合还有另外一层的意思,按照人,事来分, 人其实就是一个大模块, 事,就看里面有哪些事, 相同的事,就是一个模块, 人和事之间又会有关系,哪些是关系模块,

 

功能-业务逻辑导图如下:

 

 

 

3.基本功能模块关系

 

关系图内部,把对应关系找出来, 现在要做第3个图, 你看我们的步伐是,从业务—》进入功能, 按照人和事来分:

 

人,有哪些功能模块?

事,有哪些功能模块?

 

人和事之间的关系,又有哪些模块?

 

所有的互联网产品,无非就是人和事, 没有更多的东西了,注意:我们现在还不是在做API哦,我们只是在做功能模块哦,千万不要做到API这个层次上面去了,现在还没有到那一步。

 

事的划分标准,就是以业务逻辑来划分,但是你站在功能的角度来看,你又要把业务逻辑里面,相同的功能,抽象出来,形成功能模块,这样才能满足一对多啊。

 

事不能理解成用户的行为哦,事就是单纯的事,商家 就是事,他不是用户的行为哦,人就是指用户,事,就是指事物,人和事之间的关系,叫事件,事件是人和事之间的关系。

 

你 =  用户 = 人

星巴克 =  商家 = 事

 

不能主动发出请求的,归属于事,你去星巴克喝咖啡  = 事件= 人和事之间的关系,事是事物,不是事件,我给你发短信,你收到了短信是2个事件。

 

我是人

短信是事物

我发短信是事件

你是人

短信是事物

你接受短信是事件

 

这个拆分得不好,后面程序就一塌糊涂。

 

短信的那个事件很经典的,很多人不会拆的,看起来好简单的,不能主动发出请求的,归属于事。如果商家可以主动发出请求,那就是人,没其他的分法了,如果一个东西,具备主动性,他就人,就是用户。

 

做出的功能模块关系图如下:

 

 

 

 

4.功能模块接口uml(设计出api)

 

现在我们只考虑功能模块,做功能模块的UML图,但是只考虑到api的接口, 就是说,我们要设计哪些接口,去解决哪些问题。

 

接口是基于现在的模块,粗略的模块。

 

基于现在的模块设计接口,就是要提高耦合度,确保耦合正确。整理这些业务和功能模块,就是确保耦合正确。

 

耦合是一个很不好做的东西。耦合度太高,不能拆分。太低,又失去了模块化的意义。我其实是想先让你们自己设计一下,看看对照出来的是什么效果。主要困难,其实就是在耦合度的设计上。

 

         整理出功能模块接口的UML如下:

 

 

 

  

         上面的图就是所整理处理的api,把这些中文变成英文,就是熟悉的api。

 

5.编写在线api测试文档

 

我们网站的api在线测试文档,是使用既是一份在线api文档,也是一个在线测试工具,极大方便沟通和测试。每次客户端程序员觉得某个api有什么问题,我们就是这个在线工具上讨论沟通的。客户端程序员最喜欢这个玩意了^-^。

 

  这个api在线测试文档,是使用了Swagger-UI搭建的。Swagger-UI简单而一目了然。它能够纯碎的基于html+javascript实现,只要稍微整合一下便能成为方便的API在线测试工具。项目的设计架构中一直提倡使用TDD(测试驱动)原则来开发,swagger-ui在这方面更是能提供很大帮助。

 

  下面是用Swagger-UI搭建的api文档中的一个api的例子,可看到,整个api的提交方式,作用,参数都非常清晰明了。

 

 

6.在设计稿标注api

 

         api整理出来后,对于前端的开发人员来说,还有一个比较大的障碍,他们不知道app在哪个地方调用哪些api,为了方便前端人员,需要在设计稿上标注出哪个地方使用哪个api,如下图所示:

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------

打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生
【QQ】190678908
【app后端qq群】254659220 
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi 

 

 

 

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

小型团队的测试该何去何从 - 2015-04-10 10:04:09

前言 :很不幸,我不知道自己应该不应该谈论这件事,“小型团队的测试该何去何从”,我没有十足的经验,更没有十足的理论,然而回想起昨日大家一起的讨论结果,我到现在依然沉浸在失望和苦闷的滋味中,究竟是增强开发人员的自测能力以及自我驱动力还是增加测试人员来做问题的过滤?        首先,我们先抛开需求分析,为什么这么重要的环节要先抛开,因为国内的小型团队面临着无法避免的严重问题: 客户压根不懂需求,遇到一个稍微懂一些需求的客户,那都是上天对你的恩赐。 时间太过紧迫,经常在客户眼里,这个什么功能简单的很,实现起
?php/*所谓策略模式是在不同的事件策略模式就是针对相同的行为,在不同的场景中拥有不同的算法,将这些算法封装起来,并且这些算法是可以互换的,这样就对客户隐藏了相应算法的实现细节,可以很方便的在运行时选择具体的行为算法(即策略)。简单的策略模式: 保安对于学生和老师进考场这个事件,可以分化出不同的策略,学生要查看考试证据,老师放行*/interface Strategy{public function handle(); // 执行的策略(function)}/**对学生采取的策略 */class stu
这篇博客,我们要详细讲解的是迭代器模式(Iterator Pattern),将要讲解的内容有:迭代器模式的定义,作用,详细设计分析等方面。 一、Pattern name 迭代器模式(Iterator Pattern) : 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。——《设计模式 可复用面向对象软件的基础》 二、Problem 在我们实际编程的过程中,经常会遇到下面这种情况: 当我们需要遍历某个集合的时候,常常调用某个类的一个方法,返回一个集合类型的数据,如下: privat
默认的phpMyAdmin在安装后会访问本机的mysql,但是有的时候我们需要访问其他的服务器的mysql数据库,所以我们需要配置来做。 果然,phpMyAdmin已经为我们做了配置的选项,但是需要我们进行一些手动的操作。 http:/yourphpmyadmin.com/setup/index.php 进入配置界面,这时候会出现提示  找到对应的文档 复制出一份配置文件,并且赋予修改的权限。 [root@ip-0 phpMyAdmin-4.4.0-beta1-all-languages]# mkdir
如果不小心将/etc/inittab文件中的init级别设置成6(重启)或者不支持级别,系统就不能正常启动。本博客讲解如何通过Grub来解决这个问题。 1. 在Linux启动过程中,按Esc键进入Grub界面   2. 按e修改当前Linux系统的配置   3. 选择第二行,按e键,并按如下步骤执行 1)在出现的命令行后加1(单用户模式); 2)按Enter键接收操作并后退到当前Linux配置页面; 3)按b重启Linux。   4. 重启后进入Linux系统,修改/etc/inittab文件。将init

Firebreath3——Firebreath架构 - 2015-04-10 09:04:21

Firebreath工程目录 各工程的功能和含意…… 文件目录 Firebreath 根目录 build 编译目录 bin 编译出的插件的.dll或.so文件 boost 编译出的boost库 projects 项目的工程文件,如win下的.sln,.vcxproj … cmake cmake文件 doxygen fbgen Python脚本 gen_templates 工程配置相关的模板 Installer 安装程序相关 projects 插件工程源码 MPPReader OfdPlugin src F

C#做的CPU内存使用率 - 2015-04-10 09:04:13

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Diagnostics;using System.Threading;using System.Runtime.InteropSer

单例模式的优缺点 - 2015-04-10 09:04:02

单例模式的优缺点 1、优点 (1)减少系统性能开销 (2)减少内存开支 (3)避免资源多重占用 (4)优化和共享资源 2、缺点 (1)扩展性差 (2)测试不利 (3)与单一职责原则冲突
讲了这么多理论,我们来手动实现一个简易的IoC框架的,这样可以加深IoC的理论知识。   一、思路 在我们使用Spring.NET框架的时候,首先需要实例化Spring.NET容器, 然后调用IoC容器IObjectFactory接口中GetObject方法获取容器中的对象。通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明一个Dictionarystring, object来存放IoC容器中的对象,还需要写一个能从Dictionarystring, object中获取对象的方
         ZooKeeper的安装非常简单,它的工作模式分为单机模式、集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装、配置、启动和使用:         一、安装配置ZooKeeper(在Windows操作系统下)         a、下载ZooKeeper压缩安装文件,这里下载稳定版—— zookeeper-3.4.5.tar.gz         b、解压压缩文件,这里将其解压到C盘根目录下,打开解压后的文件夹,得到下图:           c、点击上图名为“con