⑩ 如何对一个功能做面向对象分析
面向对象主要分析对象是 "需求",因此,面向对象可以粗略地看成 "需求分析",给到的需求一般都是不明确的,首先要做的都是将笼统的需求细化到足够清晰、可执行。我们需要通过沟通、挖掘、分析、假设、梳理搞清楚具体的需求有哪些,哪些现在要做的,哪些是未来可能要做的,哪些是不用考虑做的,将抽象问题具象化,最终产生清晰的、可落地的需求定义。
接口鉴权功能分析例子演进(从最简单的方案想起,得出可行解,然后再优化引出更优解):
- 用户名+密码认证,给允许访问服务的调用方派发一个(AppID和Key),每次请求带上,微服务接收到请求,解析出AppID和Key,与存储在微服务端的数据比对,一致说明认证成功,允许接口调用请求,否则,拒绝接口调用请求。
- 明文传输 容易被拦截,对密码加密(如SHA),一样会被截获,不发分子可以携带拦截的加密key和AppID访问我们的接口(重放攻击);
- OAuth验证思路,调用方将请求接口URL、AppID、key拼接在一起,然后加密算法,生成一个token,调用接口时带上。服务端根据AppID从数据库取出对应key,通过同样的token生成算法,生成token,然后与传进来的比对;
- token固定,拦截到了还是可以进行重放攻击,可以对 token生成算法进行优化,引入随机变量,让生成的Token都不一样,比如加上时间戳参数加密。将token、AppID和时间戳传到后台,后台验证时间戳是否在一定时间内(如一分钟),小于一分钟,说明token没过期,走一遍token生成,跟传入的token比对;
需求分析过程是一个不断迭代优化的过程,不要试图一下子就给出完美的解决方案,而是先给出一个粗糙的、基础的方案,有一个迭代的基础,再慢慢优化,这样一个思考过程能让我们摆脱无从下手的窘境。
⑪ 如何做面向对象设计
- 划分职责进而识别出有哪些类;
- 定义类及属性和方法;
- 定义类与类间的交互关系;
- 将类封装起来并提供执行入口;
⑫ 类与类间的相互关系
UML统一建模语言中定义了六种,我的记忆口诀:鸡湿衣冠剧组 (也可以自己编),继承、实现都基本知道,后面四个只是 语义层次 的区别,两个类的相关程度:依赖 < 关联 < 聚合 < 组合。
- 继承/泛化 (Generalization)
子类指向父类,或子接口指向父接口,用空心三角箭头实线表示;
- 实现 (Realization)
类实现接口,重写相关方法,用 空心三角箭头虚线 表示;
- 依赖 (Dependency)
具体表现:局部变量、函数参数、返回值,用 实心三角箭头虚线 表示,从使用类指向依赖类,示例如下:
网络异常,图片无法展示
|
- 关联 (Association)
具体表现:成员变量,用 实心三角箭头实线 表示,箭头指向被关联类,可以双向,一对多或多对多,示例如下:
网络异常,图片无法展示
|
- 聚合 (Aggregation)
具体表现:成员变量,不过关联是处于 同一层次 的,而聚合则是 整体和局部,比如社团与小弟,社团没了,小弟还能去别的地方搞事,用 空心菱形箭头实线 表示。
- 组合 (Composition)
和聚合类似,只是程度更强烈,共生死,组合类负责被组合类的生命周期,比如社团和大佬,社团没了,大佬也就不复存在了,用 实心菱形箭头实线 表示。
根绝上述关系列一个简单的UML类图:
网络异常,图片无法展示
|