mysql

如何拆分任务?

2020-06-11  本文已影响0人  技术灭霸

1、需求

这个例子就是最简单的用户登录。需求很简单,用户通过用户名密码登录。

要完成这个需求,最基本的任务是用户通过输入用户名和密码登录。

image.png

用户名和密码登录这个任务很简单,但我们在第一部分讲过沙盘推演,只要推演一下便不难发现,这不是一个完整的需求。

用户名和密码是哪来的呢?它们可能是用户设置的,也可能是由系统管理员设置的。这里我们就把它们简单设定成由用户设定。另外,有用户登录,一般情况下,还会有一个退出的功能。这才是一个简单而完整的需求。我们就不做进一步的需求扩展。

所以,我们要完成的需求列表是下面这样的。


image.png

假设我们就是拿到这个需求列表的程序员,要进行开发。我们先要分析一下要做的事情有哪些,也就是任务分解。

2、技术方案 - 数据库

我们先来决定一下技术方案,就用最简单的方式实现,在数据库里建一张表保存用户信息。一旦牵扯到数据库表,就会涉及到数据库迁移,所以,有了下面的任务。

image.jpeg

这时,需要确定这两个任务自己是否知道怎么做。设计表,一般熟悉 SQL 的人都知道怎么做。数据库迁移,可能要牵扯到技术选型,不同的数据库迁移工具,写法上略有差别,我们就把还不完全明确的内容加到任务清单里。

image.jpeg

3、技术方案 - 三层技术架构

数据库的内容准备好了,接下来,就轮到编写代码的准备上了。我们准备用常见的 REST 服务对外提供访问。这里就采用最常规的三层技术架构,所以,一般要编写下面几项内容。

根据这个结构,就可以进一步拆解我们的开发任务了。

image.jpeg

我的任务清单上列任务的顺序,是按照一个需求完整实现的过程。

4、技术方案 - 登陆延伸出来的共享问题

考虑到我们在做的是一个 REST 服务,这个服务可能是分布到多台机器上,请求到任何一台都能提供同样的服务,我们需要把登录信息共享出去。

这里我们就采用最常见的解决方案:用 Redis 共享数据。登录成功的话,就需要把用户的 Session 信息放到 Redis 里面,退出的话,就是删除 Session 信息。在我们的任务列表里,并没有出现 Session,所以,需要引入 Session 的概念。任务调整如下。

image.jpeg

如果采用 Redis,我们还需要决定一下在 Redis 里存储对象的方式,我们可以用原生的 Java 序列化,但一般在开发中,我们会选择一个文本化的方式,这样维护起来更容易。这里选择常见的 JSON,所以,任务就又增加了两项。

image.jpeg

简单的做法就是加入一个 filter,在请求到达真正的资源代码之前先做一层过滤,在这个 filter 里面,如果待访问的地址是需要登录访问的,我们就看看用户是否已经登录,现在一般的做法是用一个 Token,这个 Token 一般会从 HTTP 头里取出来。但这个 Token 是什么时候放进去的呢?答案显然是登录的时候。所以,我们继续调整任务列表。

image.jpeg

至此,我们已经比较完整地实现了一个用户登录功能。当然,要在真实项目中应用,需求还是可以继续扩展的。比如:用户 Session 过期、用户名密码格式校验、密码加密保存以及刷新用户 Token 等等。

来看一下分解好的任务清单


image.jpeg

记住:任务拆的越细越好。

上一篇下一篇

猜你喜欢

热点阅读