• 辣么大
    2019-12-04
    干货满满!争哥拆分需求、组织类和方法的思考过程值得我们学习。

    我想到的实现过程是按照用户发送请求通过鉴权和未通过鉴权的流程写:
    1、先写接口auth(String url) ,这里先定义好请求的格式,例如“xxx?AppID=123&Token=aaa&TimeStamp=123123”
    2、ApiRequest类,解析请求
    3、AuthToken类,判断是否过期、token匹配、校验token
    4、CredentialStorate类,获取AppID对应的password

    具体实现见:https://github.com/gdhucoder/Algorithms4/tree/master/geekbang/designpattern/u014
    展开
     10
     38
  • 醉比
    2019-12-04
    前一个项目我也完整的实现了整个鉴权流程,需求分析阶段可以说和小争哥分析的功能点几乎一样,拼接参数,进行加密,验证token,验证时间。可到了编程阶段,我还是按照面向过程的方式,拆了几个方法,把功能就实现了。今天给我了一个深刻的感悟,面向对象编程,听起来并不复杂,但他真正的难点在于我学了这么多,对于下一个功能,是不是能够用面向对象的方式来把功能实现。如何做到学以致用,是我们学会知识后,接下来要考虑的问题。
     2
     23
  • 黄林晴
    2019-12-04
    打卡✔
    如果是我的话怕是理清功能后,写一个鉴权util,然后所有的方法都塞进去,典型的面向过程了😩
     4
     13
  • bboy孙晨杰
    2019-12-04
    同样的需求我在代码里实现过,但是看了争哥的思路有种耳目一新的感觉;
    另外我有一点疑惑:“将 token、AppID、时间戳拼接到 URL 中,形成新的 URL”,这个功能点应该是在客户端完成的吧,服务端只需要在验证的时候解析URL,验证token就可以了吧,虽然也是一个功能点,但实际并不需要服务端考虑。
     4
     7
  • 李小四
    2019-12-04
    设计模式_14
    我就是画画草稿图就开始写代码的那个人,画图可以避免复杂度在大脑中“爆炸”。。。

    # 感想:
    在入门阶段,我们会遵照一些方法论来行事,比如
    “寻找名词作为参数”,
    “寻找动词作为方法”
    ...
    这些方法通常都可以直接执行,一顿操作解决问题。
    时间久了,我们开始思考:
    - 为什么要这样做?
    - 这些方法的本身优势是什么?

    这个时候,我们才接近了分析的的本质,我们可能沿用这些方法,亦或找到更好的方法,不管怎样,都变得更通透。
    展开
     1
     7
  • Dimple
    2019-12-04
    对比一下整个流程,发现现在自己做的还是太草率了。

    我也知道写代码其实是整个开发过程中最简单的一件事情,只要前期准备工作做的好,把该分析的都分析清楚,写代码自然就是水到渠成的事情。

    但是我现在的做法是:

    1. 拿到需求之后,先判断需求是否可以同项目中复用;
    2. 然后拿一个小笔记本把涉及到的需求先设想下,包括类、DB等设计(用法很粗糙,没老师这么细致)
    3. 用伪代码先把小流程实现
    4. 写代码

    这里的薄弱环节就是不知道如何更好的使用设计模式,从第三步直接到了第四步,而不存在软件工程中UML的设计,导致很多时候代码写了很多,也一直是在做面向过程的事情,而不是面向对象。

    课程真的很赞,已经不能再夸了。好好跟着课程学习,收获满满,和同学们一起进步
    展开
    
     6
  • 大大。
    2019-12-04
    争哥:设计了一个最顶层的 ApiAuthencator 接口类,为什么要设计出一个顶层的接口,虽然是面向接口编程,但是写成接口,意味着还会有其他的不同实现吗,如果有其他不同的实现,那么接口中的第二个参数的ApiRequest也不一定会适用不同的那个实现的传参,不知道说明白没有

    作者回复: 你说得很好,多谢指出啊,确实没必要搞个接口,ApiRequest的设计也依赖了具体的url实现,所以也不是很通用。

    
     6
  • Peter Cheng
    2019-12-04
    看代码,我也是看的云里雾里的,希望老师能抽空将课程的代码写到github上

    作者回复: 好的 我放到github上 github上你搜wangzheng0822

     6
     6
  • Monday
    2019-12-05
    1、token加密采用md5
    2、执行测试类即可
    花了一小时完成了课后题,望纠正,一起学习.
    上代码: https://gitee.com/MondayLiu/geek-design.git
    
     5
  • 编程界的小学生
    2019-12-04
    用这种需求分析需求设计的方式,你告诉我一个方法怎么可能超过五十行?编程规范都说方法单个不超过五十行,八十行的。到头来为什么还是超过?就是因为之前都是面向过程编程,token,url等操作都放到一个类的一个方法里面,要全面相过程编程。争哥的这种需求分析需求设计的方式值得学习和效仿,真的香!
    
     5
  • Arthur.Li
    2019-12-21
    1. 面向对象分析
    * 产出是详细的需求描述

    2. 如何进行面向对象设计
    * 产出是类
    * 划分职责进而识别出有哪些类
        * 根据需求描述拆解小功能点(单一职责),罗列出来
        * 找到功能相近、操作同样属性的可能归到一个类
        * 复杂的需求需要先拆分模块,然后再用这个方法找类

    * 定义类及其属性和方法
        * 需求描述中动词作为候选方法、名次作为候选属性
        * 并不是所有名次都被定义为类的属性,不属于这个类的可以通过传参

    * 定义类与类之间的交互关系
        1. 泛化(Generalization)
        简单理解为继承关系
        2. 实现(Realization)
        一般是指接口和实现类之间的关系
        3. 关联(Association)
        一种非常弱的关系,包含聚合、组合两种关系。如果 B 类对象是 A 类的成员变量,那 B 类和 A 类就是关联关系。
        4. 聚合(Aggregation)
        一种包含关系。A 类对象包含 B 类对象,B 类对象的生命周期可以不依赖 A 类对象的生命周期,比如课程与学生之间的关系。`public class A { private B b; public A(B b) { this.b = b; }}`
        5. 组合(Composition)
        一种包含关系。A 类对象包含 B 类对象,B 类对象的生命周期跟依赖 A 类对象的生命周期,B 类对象不可单独存在,比如鸟与翅膀之间的关系`public class A { private B b; public A() { this.b = new B(); }}`
        6. 依赖(Dependency)
        比关联关系更加弱的关系,包含关联关系。
    * 将类组装起来并提供执行入口
        * 独立系统的话可以是main函数
        * 可以是一组给外部调用的API接口

    整体看下来对真正面向对象编程好像有了正确的理解, 不过单独自己去实现的时候,又不不会那么周到,还是文中所说,需要练习和经验。
    展开
    
     4
  • 落叶飞逝的恋
    2019-12-04
    组合关系:强调部分与整体的关系,其中包括两种情况,关联性强(大雁与翅膀)的与关联性弱(学生与班级)的。
    依赖关系:强调对象与对象的临时关系,人开车。
    
     4
  • 南山
    2019-12-04
    需求分析过程中,或者分析完,不要直接就想着数据库表结构怎么设计。
    基本是按照老师说的这个流程分析下来,再对外暴露接口,最后是如何存储,存储的结构视存储方式而定,比如存到DB,Redis,MongoDB等等,还有可能会切换实现。
    整体就是做好需求分析拆解,根据功能边界模块划分,模块内部还可以分子模块,再做好每个模块内部功能分析实现,以及模块之间的协作。
    
     4
  • 密码123456
    2019-12-04
    我觉得,鉴权和url解析的类就是充血模型。就是domain,就是领域层
    
     4
  • 兔2🐰🍃
    2019-12-04
    有个问题就是:DefaultApiAuthencatorImpl 类里的构造函数名应该和类名一样的吧,还是说java哪个版本的新特性?

    作者回复: 写错了,我改下,抱歉。

    
     3
  • 付坤
    2019-12-04
    针对以往的贫血模型的开发经验,基本就是通过数据建模来实现的,都是先把需求拆分出实体,针对实体定义数据字段,也就是属性,再梳理出方法。这种思路就很难引导自己去进行抽象。最后出来的代码也就是面向过程了😂
    
     3
  • Geek
    2019-12-04
    打卡,需要消化一下今天的课程
    
     3
  • 帆大肚子
    2019-12-07
    目前我觉得需要学会的是转化自己的面向过程编程的思想
    
     2
  • 大土豆
    2019-12-04
    把UML的6种关系给省略成4种,这知识太干了。就喜欢老师这种实战派。
    
     2
  • chanllenge
    2019-12-04
    写的太好了,这一次一定要把设计模式学会
    
     2
我们在线,来聊聊吧