开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:对象状态分析】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15932
对象状态分析
首先要来讨论的第一个问题就是对象的状态,在权限管理系统中间哪些东西是有状态的,这个应该毫无疑问,用户是有状态的。除了用户以外,还有什么东西是有状态的?这里面总共有三个东西就是用户,角色和权限,还有个日志。其它东西其实都是这几个东西之间的关系,一般关系是没有状态的,只有实体的东西才有状态。
除了用户以外,还有东西有状态吗?角色为什么要有状态?学术没有逻辑可以删除,角色也直接删除,因为删掉角色只会减少它的权限,没什么太大问题,从安全性的角度来说,只怕别人增加权限,不怕别人减少权限。这个东西可能会有状态,关系是没状态的,但用户代理是一个很特殊的东西,它是表示用户和用户之间的代
理关系。在这里面有两个时间,一个是开始时间,一个是过期时间,也就是状态的代理关系,用户的代理关系在什么时间之内是有效的?
当一个用户需要权限时,其实是要去读它的代理关系,代理的用户要有权限,它决定它有没有权限,这两个字段可能会存在着一些问题,因为后面会说到较权限是在这个系统中间非常高频的动作,每一个操作都是需要较权限的。在这个部分来说,
通过两个时间在数据库里去比较它的权限,去比较它有效的代理关系,可能会是个瓶颈。主要看后续的设计是什么样的。
如果这个部分是瓶颈,那就会考虑给它加一个状态,当它进入到有效期以后,将状态标识成为这个代理是有效的,它没有进入到有效期之前,就是它等待的这个这个状态,过了以后就是过期的无效的状态。如果有个状态要去拿到当前有效的代理关系就变得比较简单了,就不需要通过两个字段去做判断,只要拉到 state 就能把它查出来。这是有可能会有状态的对象。
但是之所以不是很确定是因为后面的设计还没有做。就要看这样的一个部分是不是瓶颈。就是要通过两个时间去拿到当前有效的代理关系,这个事情是不是瓶颈,如
果它是瓶颈,也许会设个状态让它取出来比较简单一点,减少它的瓶颈。如果它不是瓶颈,就不用去管这个事情。
因为还没有做瓶颈分析,所以先不给用户代理状态。只有这个用户是状态才可以,所以用户有些什么样的状态?刚才已经写了三个状态。一个是可以正常登录的一个状态,另外一是不让它登录的一个状态,第三个是废弃。之前已经把它逻辑删除给去掉了,再给这个用户加了一个废弃状态。废弃就相当于删除它永远不用。但是这
个用户的所有的信息还在里面,因为这个用户发的评论,做的所有事情还能查到,只是说它永远不能再用了,这是三个状态。
除此之外还有没有状态?在设计对象状态时要去发现状态,再来说状态的迁移关系。这里应该加一个叫做新用户的状态。什么是新用户的状态?因为这是后台的权限管理系统,不像前端的电子商城,谁注册一个用户谁就可以用。如果谁都能注册
用户都能进来使用,那么这个肯定是有问题的,所以要定义一个新的状态叫做新用户。
就是任何一个用户注册了一个用户,告诉自己是哪个商铺的,或者告诉自己是平台。不是说自己是平台就是平台,说自己是商铺就是商铺,这是需要审核的。平台的由平台管理员来审,商铺的由商铺的管理员来审,来自商铺里有权限的人,因为不知道权限怎么定义的,商铺里有权限的人审这个用户是否能登陆进来。首先说能
登陆进来,再说它有没有权限,如果它不能登录进来就不要谈它的权限了。所以要加一个新用户的状态,这是第四个状态。
还要不要别的状态?就先有这四个状态。四个状态中间,首先要想哪一个是初始状态,什么叫初始状态,就是当一个用户刚刚出现时,新建一个用户时,它是什么状态,是哪个状态,是新用户状态,这个应该是很明显的。所以要画一个初始的状态的符号指向这个状态,说它是个新状态。而且上面还要写一个动作,这个动作表
示,什么情况下它会出现一个新用户状态的用户,是什么动作?
是注册。这个注册其实是在界面上的一个 api,当然在这里为了清晰,写的是中文。如果传统的设计是一个方法,可以直接写方法名,这样也比较清晰。因为是api,注册出来是一个很长的东西,写上面是很不方便的,所以再另外做一张表。
就在周三的讨论课时,在做这个状态的动作的时候,做一张表所注册的这个动作是哪一个 api,去把它描述出来,但图上就写这个注册就可以了。所以注册这样的一
个动作会产生一个新用户状态的用户。
如果一个新用户要变成正常的用户是需要经过一个审核的过程,就是由平台管理员来审核。平台管理员可以审登记为平台用户的这些新用户,店铺管理员去审核本店铺的这些新用户,其实就像 super id技术,就是每个用户有的 super id,也就是department id ,是用 department id去比较的。每个人只能审自己 Department
id 是相同的用户,就是自己审自己的。
但这里会有个问题,当一个新店铺出来时,第一个用户谁来审?还是平台管理员来审,所以还是要做特殊的处理。平台管理员可以审所有的,店铺管理员只能审本店
铺的,做这样的一个设定。审核既然有审核就有同意和不同意,如果不同意怎么办?
首先确定一下新用户是不能登录的,它要到正常用户才可以登进这个系统,所以新用户是不能登录的。首先如果审核不过,让它禁止是没有意义的,如果废弃好像太极端了,那么用户能不能改一改,可能说他的名字取得不合理或者就觉得不爽不想
让他过,过两天才让他通过。
所以如果审核不过就让他留在这个新的用户,他其实没有任何动作,它只有一个动作就是审核通过,所以审核的底下要加一个条件叫做 ok或叫成功。不是审核这个动作就必然使新用户转移到正常的用户,而是审核他的条件是 ok,条件的前面要加方
括号,表示下面这个是条件。
一般来说把动作写到线上,条件写在线下,表示在这个动作下的这个条件下,用户的状态从新用户的状态转移到了正常的状态。新用户的状态还能去其他状态吗?应
该不行,因为禁止它没有意义,也不让它废弃,所以它只有一个状态迁移线。
从正常态的这个用户来说它是可以被禁止的,所以管理员想进谁就进谁,所以说禁止,这也是一个api,就可以禁止掉一个用户,到它的静止态就是不能登录的,它就是不能登录的一个状态,但是它还能够改自己的信息,他不能登录应该也不能改自
己的信息。
如果他不能登录就什么都不能干了,自己的信息自己的东西都不可以看,这是静止态。
在静止态时,如果觉得他 ok了再把它捞回来,这叫做恢复,写到线上,使得他重新变成了正常态。静止态这里多提一下,一般来说都是管理员去禁止一个用户,但是如果把这个系统做的足够的好一点,就是发现有一个用户在一分钟之内访问了十次
api,那意味着什么呢?因为他不是个人就要禁止它,所以这时发出静止动作的不是这个管理员而是系统。
但是这个系统肯定要有一个身份来发,所有的动作都是要有一个身份来发的,系统虽然不是人,它也是个有身份的东西,所以这个禁止不仅管理员可以做,系统也可以做。
而且做完以后是要有一个日志的,到底是管理员禁止它,还是系统禁止它,所以把
系统也想成是个人就好。就像这个禁止工作,其实系统也可以做,但是将系统也想象成是个人就好了。这是静止到正常态的一个转变。
那废弃就是这个用户永远不要,他也别想再登陆了。但是保留它这个东西,相当逻辑删除。逻辑是从上述的三个状态都可以到废,所以如果要写就是画三条线,当然也可以另外一种画法,这里用另外一种画法。再定义一个大的状态,已经用正常
了,就多点词汇,这个大的状态叫做常用用户,就是他还能用到这个当用的用户的状态,这是可以用的。不要常用的,叫当用的。因为这些用户状态都能够让它可以恢复到可以登录的状态,但是废弃是不行的。
所以在这三个状态下,只做了一个动作,这个动作叫做废弃,就是不要这个用户
了,那它就进入到了废弃的状态。可以看到废弃的状态是唯一没有出现的状态。新用户,正常,禁止都可以看到有一个动作能使得它离开这个状态。
但是废弃这个状态是没有任何动作能让它离开这个状态,所以这个状态是整个系统
的中终止态。要画一下,终止需要有个符号来表示出来,这就表示这是整个系统的终止态。那这就是权限系统中间的用户的状态分析和状态图。
分析出来系统中间到底有些什么样的状态,再看它新建这个对象时它的状态是什
么,什么是它的初始态,最后这个这个对象的终止的状态是什么?到这个状态以后这个对象就不会再发生任何的改变。
这些所有的状态的迁移,一般都是 api,就是之前设计的 api,有人去操作的动作造成了状态的迁移,个别情况会是系统做的动作。系统做的动作有可能会通过api,有
可能不会通过 api。
比如像禁止这个动作,就没必要让系统通过api再走一趟,可能就让系统直接调服务层的这个代码让它禁止,不要再通过外面的api过来。所以所有的状态的迁移一般都
是 api,除了系统内部的动作造成它的状态迁移,这就是用户的状态。