面向对象分析、设计和实现有哪些要点
- 根据需求描述分析有哪些类
- 职责划分(进而识别出有哪些类)
- 设计类,包括类有哪些属性,类之间该如何交互(组合、继承和实现)
- 零件有了(类),如何组装成可执行的程序呢?
接口鉴权
还是以接口鉴权设计为例,根据前面得到的可落地的需求描述依次进行分析,需求描述的流图展示如下:
划分职责(有哪些类)
如何划分,按照需求描述将其中涉及的功能点一个个列出来,根据功能点职责是否相近,操作属性是否相同,判断是否将其归为同一个类,比如针对上面的需求描述图:
- 拼接 URL、用户名、时间戳和密码,并加密成 token,再将 token、用户名和时间戳拼接到 URL 中并发送到微服务端
- 微服务端解析 URL,得到 token、用户名、时间戳
- 根据时间戳比较当前时间,判断请求是否过期,否则拒绝请求调用
- 请求没有过期,根据用户名取出密码,并再次生成 token,并判断两个 token 是否一致,否则拒绝请求调用
上面是需求描述流图的文字描述,下面分析功能点:
- 把 URL、用户名、密码、时间戳拼接为一个字符串;
- 对字符串通过加密算法加密生成 token;
- 将 token、用户名、时间戳拼接到 URL 中,形成新的 URL;
- 解析 URL,得到 token、用户名、时间戳等信息;
- 从存储中取出用户名和对应的密码;
- 根据时间戳判断 token 是否过期失效;
- 验证两个 token 是否匹配;
综上:
- 2,4,6,7等都是对 token 进行操作,分别有 token 加密,token 是否失效,验证 token,
- 1,3,4 是与 URL 相关的,包括对 URL 的拼接和解析
- 5 是从数据库取出用户名和密码
因此可将需求描述建模成这几个类:AuthToken、Url 和 CredentialStorage
类的属性和方法
按照上面总结的操作,设计出方法和属性即可
类之间的交互关系
- 泛化,即继承
- 实现,即接口和实现类之间的关系
- 组合
- 依赖
其中组合和依赖的代码表示形式没有什么区别,不过 A 组合 B 来说,B 是无法独立存在的,就像翅膀不能脱离鸟自身而存在,那样将没有任何意义
组装并执行
- 独立运行的程序:提供 main 函数入口或暴露接口
- 框架:封装并向外界暴露接口
面向对象实现
将上述设计翻译成代码