《设计模式之美》实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?

王争《设计模式之美》学习笔记

如何进行面向对象设计?

划分职责进而识别出有哪些类

  • 回顾上文中需求分析的四点详细需求描述,将需求拆解成小的功能点,遵循“单一职责”。
  • 7个功能点列述:
    1. 把 URL、AppID、密码、时间戳拼接为一个字符串;
    2. 对字符串通过加密算法加密生成 token;
    3. 将 token、AppID、时间戳拼接到 URL 中,形成新的URL;
    4. 解析 URL,得到 token、AppID、时间戳等信息;
    5. 从存储中取出 AppID 和对应的密码;
    6. 根据时间戳判断 token 是否过期失效;
    7. 验证两个 token 是否匹配;
  • 根据功能点划分三个核心类:
    1. AuthToken:1、2、6、7 都是跟 token 有关,负责 token的生成、验证
    2. Url:3、4 都是在处理 URL,负责 URL 的拼接、解析
    3. CredentialStorage:5 是操作 AppID 和密码,负责从存储中读取 AppID和密码
  • 复杂的需求开发,要先进行模块划分,然后在模块内部分别拆解功能点。

定义类及其属性和方法

AuthToken:
  • 一般情况,识别需求中的名词为属性,动词为方法
  • 属性:token,createTime,expireTimeInterval
  • 方法:getToken(),isExpired(),match()
  • 并不是所有出现的名词都定义为属性,有的名词作为了方法得参数,因为这些名词从业务角度不属于当前类
  • 还要挖掘出没在功能点中得属性(在方法中使用)和方法(保证类的完整性)
Url类:
  • 类名:ApiRequest
  • 属性:baseUrl,token,appId,timestamp
  • 方法:getBaseUrl(),getToken(),getAppId(),getTimestamp()
CredentialStorage类:
  • 文中作者给设计成接口的形式,基于接口而非实现的编程
  • 我理解此种设计,可以灵活应对更换存储方式

定义类与类之间的交互关系

  • UML统一建模语言中定义的六种类之间的关系:
    1. 泛化:继承
    2. 实现:接口和实现类
    3. 聚合:A类对象包含B类对象,销毁A类对象不影响B类对象
    4. 组合:A类对象包含B类对象,B类对象不可单独存在
    5. 关联:包含聚合和组合
    6. 依赖:包含关联,只要A类对象和B类对象有任何使用关系
  • 作者简化的定义:
    1. 泛化
    2. 实现
    3. 依赖
    4. 组合:组合、聚合、关联,并且可以和“多用组合少用继承”中的“组合”统一含义
  • 文中的三个核心类,目前看只用到了实现关系

将类组装起来并提供执行入口

  • 设计一个最顶层的 ApiAuthenticator 接口类,暴露一组给外部调用者使用的 API 接口,作为触发执行鉴权逻辑的入口。

如何进行面向对象编程?

  • 面向对象编程的工作,就是将这些设计思路翻译成代码实现。
  • 文中作者给出了ApiAuthenticator 接口的实现类代码,此实现类中AppID和密码是使用mysql存储的。

辩证思考与灵活应用

  • 文中作者将面向对象分析、设计、实现,每个环节的界限划分都比较清楚、细致,即使是没有太多经验的初级工程师,也可以按部就班地做。
  • 然而大部分情况,这些过程可能是在大家脑子里完成的,不要花太多时间放在设计出完美的类图、UML图上,不要拘泥于形式,死搬理论概念。即使设计的时候有遗漏,我们边开发、边思考、边重构,反复迭代,也是代码演变的正常流程。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值