设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
17596 人已学习
课程目录
已更新 21 讲 / 共 100 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (4讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?
不定期加餐 (2讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
设计模式之美
登录|注册

13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?

王争 2019-12-02
面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP),是面向对象开发的三个主要环节。在前面的章节中,我对三者的讲解比较偏理论、偏概括性,目的是让你先有一个宏观的了解,知道什么是 OOA、OOD、OOP。不过,光知道“是什么”是不够的,我们更重要的还是要知道“如何做”,也就是,如何进行面向对象分析、设计与编程。
在过往的工作中,我发现,很多工程师,特别是初级工程师,本身没有太多的项目经验,或者参与的项目都是基于开发框架填写 CRUD 模板似的代码,导致分析、设计能力比较欠缺。当他们拿到一个比较笼统的开发需求的时候,往往不知道从何入手。
对于“如何做需求分析,如何做职责划分?需要定义哪些类?每个类应该具有哪些属性、方法?类与类之间该如何交互?如何组装类成一个可执行的程序?”等等诸多问题,都没有清晰的思路,更别提利用成熟的设计原则、思想或者设计模式,开发出具有高内聚低耦合、易扩展、易读等优秀特性的代码了。
所以,我打算用两节课的时间,结合一个真实的开发案例,从基础的需求分析、职责划分、类的定义、交互、组装运行讲起,将最基础的面向对象分析、设计、编程的套路给你讲清楚,为后面学习设计原则、设计模式打好基础。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(77)

  • 编程界的小学生
    工作中遇到非crud的需求我就会想尽一切办法让他通用,基本需求分析和需求设计的时间占用百分之五十,开发和重构到自认为最优占用百分之五十。比如最简单的验证码功能,几乎每个项目都有,我就封装一套验证码服务,主要功能有你在配置文件里配置好需要被验证码拦截的路径,这里还要考虑到通配符,空格等等细节和可扩展的点,内置图片验证码,极验证,手机验证以及自定义验证码等等,总之我认为如果有机会遇到非crud的需求,一定要好好珍惜,好好把握,把他打造成属于自己的产品,这样会让自己下意识的去想尽一切办法把他做到最优,亲儿子一样的待遇,再也不会无脑cv,连变量名可能都要认真的重构一两遍😹😹😹
    2019-12-02
    9
    79
  • 辣么大
    一句话:使用进化算法的思想,提出一个MVP(最小可行性产品),逐步迭代改进。

    拿到这个需求,假设我们不了解接口鉴权,需求又不明确,我会我自己如下问题:
    1.什么叫接口鉴权?搞清基本概念
    2.接口鉴权最佳实践是什么?技术调研
    3.appid和secret key从哪里来?用户自己申请还是我们授权?用户申请是以什么方式申请(网页还是邮件?申请的网页有人做了么?)追问下去。
    4.appid secretkey存储在什么地方呢?数据存储
    5.用户如何使用?需要为用户提供接口鉴权使用手册和文档,及示例代码。写用户手册,文档。
    6.这个功能如何测试?提前想好如何测试
    7.接口鉴权功能何时上线?估计工期
    8.鉴权成功或失败返回码和信息定义?约定返回结果

    关于防止重放攻击:请求参数中还可以加入nonce(随机正整数),两次请求的nonce不能重复,timestamp和nonce结合进一步防止重放攻击。
    2019-12-02
    13
    68
  • aoe
    OAuth 2.0 + 网关(如Zuul)+ 认证中心 + AOP可以实现。
    极客时间《微服务架构实战160讲》里介绍了OAuth 2.0企业级的解决方案,小争哥的方案适合快速落地。
    实际业务中如果安全等级没这么高,直接生成Token鉴权就可以。通过业务模型规避风险:
    1. 充值类业务,就算对方篡改接口,最终结果可以通调用证金融机构的接口验证是否有效,不会给公司带来损失。
    2. 如果安全等级非常高,比如提现、转账可以通过发送手机短信,确保是本人操作。
    3. 如果是商品信息查询类接口,防止第三方爬取数据,可以在调用一定次数后加入”人机验证“(输入图片识别码、拼图)。
    4. 根据IP限制访问次数。
    5. 服务器间调用可以绑定mac地址、IP。
    6. 服务器、客户端通过架设私有VPN进行通信,将安全问题转移到VPN上,降低业务复杂度的同时还可以避免加解密带来的性能损耗,提升性能。
    7. 调用接口时通过付费方式(如实名认证、银行四要素验证这些调用一次都是要收费的),防止恶意调用。
    8. 通过独立加密硬件(如U盾)+ 独立密码验证器(Google验证器)+ 语音识别 + 面部识别(刷脸支付) + 指纹 + 多人同时输入动态秘钥(核打击时发射程序)。
    9. 安全性会降低系统性能适可而止。
    极客时间《左耳听风》专栏中介绍了亚马逊在设计开发微服务时,就已经做好了随时对外网开放的准备,由于没有阅读完整个专栏,不知道后面有没有详细介绍。
    2019-12-03
    31
  • 黄林晴
    打卡
    充血模型那两节还没完全理解,加油
    2019-12-02
    3
    8
  • 安静的boy
    这个需求去年我就做过,给自己系统的对外接口开发一个鉴权的功能。因为之前了解过oauth2,当时就直接想到了oauth2鉴权来实现,就去学习了下,然后选择了“客户端模式”来实现,给各个应用分配appid和appsecrete,客户端拿appid和appsecrete请求有一定时效的token,应用拿到token后再跟appid和appsecrete一起来请求接口,服务端鉴权通过后即可调用。老师的例子是客户端定开始时间,我做的是服务端定开始时间。
    不过当时分析的时候没有意识去一步步分析,就是一下子想起来就去做了,也没有去想着做什么优化,以后在遇到这种问题,应该多去分析,思考,才能让设计更优。
    2019-12-02
    8
    7
  • 阿卡牛
    还有个风险,如果调用方是app,那有可能app被反编译,然后加密算法就被第三方知道了
    2019-12-02
    8
    6
  • 追风少年
    老师好,感觉在鉴权这个例子中,无论客户端如何加密,攻击方的逻辑都是不变的。只需要截获请求,并不需要解析token.
    如果能在token中加入客户端的特征变量,比如ip或者mac,服务端获取特征变量,然后和appid等一起生成token再比较。这样会更好。要不然总感觉在自欺欺人
    2019-12-05
    1
    4
  • Richard Zhong
    我看到过的最好的设计模式课
    2019-12-02
    4
  • 趙衍
    我觉的老师的方案也没有增加攻击方的试错成本吧,我每次截获调用接口的请求,获取你调用的URL,在这个过期时间内仍然可以非法调用微服务方的接口啊。做了这么多的加密,可是对于攻击方,我的攻击成本增加在哪里了呢?

    请老师解答一下哈
    2019-12-04
    3
  • Young!
    像今天的例子中,如果老板给我这样的需求,我第一反应就是去想怎么实现,用什么技术实现,有什么现成的框架,而不是去先思考「用户名密码登录验证」这最基础的第一步。刚开始脑子就一团浆糊,知道完成也是在便实现便理思路,这样浪费时间而且最后也没有自己完整的思路过程。

    以后还是要先理清思路,理清需求再去考虑每一小需求实现的技术。
    2019-12-02
    3
  • 梦倚栏杆
    我是做业务需求的:我们期望于产品画清楚流程图,表达好规则描述,
    a.有些产品做的足够细致时,rd照着流程实现就好了。
    b.有些产品表达的很粗糙,rd会按照自己的梳理,然后向产品要相关时刻的规则,最后rd再照着实现。

    感觉针对一个具体业务需求时,貌似技术实现到底多么优雅取决于与之合作的产品,总觉得不对,但貌似又无能为力
    2019-12-02
    3
  • 刘大明
    一般遇到这种需求不是特别明确的,先自己理解第一遍需求,有一个大概的思路,然后在和产品经理确认是不是这样。需求确认之前在按照争哥说的需求分析,对需求做任务分解,将需求分解成一个个小的任务点,每个小任务都是很容易执行的。就算开发过程中被打断了,也不要紧。任务分解的尽量小,这样重新回到开发状态也就越容易。
    2019-12-02
    3
  • 2018
    打卡,依旧在理解贫血和充血模型
    2019-12-02
    2
  • 丁丁历险记
    1 推荐写markdown 进行描述
    2 分析将做什么转为怎么做,并将怎么做拆解的足够小,单步可验。
    3 过程是渐进的,逐步分解
    2019-12-06
    1
  • Murrre
    https://github.com/murreIsCoding/auth
    根据实战教程编写的,放到了github上
    2019-12-06
    1
  • 修缘
    遵循合适原则、简单原则、演化原则三个原则,有助于做出最好的选择。在实际的项目中,我们要结合业务 、技术、成本三个方面综合考虑具体的方案。
    2019-12-05
    1
  • 阿冰777
    Day10: 先设计,在完成核心功能试验,设计时要考虑以后可能的改动,要考虑最常用场景的性能优化,如果这个功能和已有功能有重叠,考虑进行重构,如果没有重叠但是有使用相同的数据,要考虑到是否有数据不一致的bug,设计时还要考虑到极端情况,最好先写出测试case。
    2019-12-04
    1
  • 板栗饼
    课依然很好,就是有些想念算法之美里每节画插图的小姐姐
    2019-12-04
    1
  • QQ怪
    老师,我们公司有个重构项目,也是要最客户端鉴权,但是旧客户端没有做token之类的鉴权传token,但现在要做,如何做到兼容旧客户端做鉴权呢?

    作者回复: 后端可以对没有传递token的不做校验

    2019-12-02
    3
    1
  • 杰洛特
    请问老师,token 在 client 端生成的话,是否意味着要告知 client 端加密算法?然后才能在 server 端解密到信息

    作者回复: 是的 要统一加密算法

    2019-12-02
    1
收起评论
77
返回
顶部