美文网首页
架构师训练营第2周学习总结

架构师训练营第2周学习总结

作者: 丿追灬 | 来源:发表于2020-09-23 22:22 被阅读0次

追溯历史看编程本质和未来!!!

编程发展史!!!

1.最早探索人:德国大佬莱布尼茨提出计算可执行演算规则,就可计算出事务的各种结果,类似编译后执行可执行文件就可以算出想要的逻辑应用

2.法国人雅卡发明可编程织布机,开始将打孔纸带用于计算机编程

3.英国人Ada写出人类第一个软件程序,随后到图灵,冯若依曼都在试图创造一种通用的计算机,然后开启编程新型行业


编程本质

用计算机来解决现实世界的问题(专业术语:领域问题)


编程过程 (领域问题抽象成模型)

在计算机所能理解的“模型”(解空间)和现实世界(问题空间)之间,建立一种联系


编程语言

一种抽象的机制,把领域问题分析抽象成一个模型然后用编码方式实现出来

模型与现实世界对象一一对应,与代码模型一一对应


跳出技术表面跳出去思考技术背后的规律,面向对象编程更能体现出现实世界的问题!!!

面向对象编程不是使用面向对象的编程语言进行编程,而是利用多态特性进行编程。

什么是面向对象编程?

1: 万物皆为对象(我们关注的需要解决的问题本身皆为对象)

2.:程序是对象的集合,它们通过发送消息来告知彼此所要做的。

3:每个对象都有自己的由其他对象所构成的存储。

4:每个对象都拥有其类型。

5:某一特定类型的所有对象都可以接收同样的消息。


面向对象三要素

    封装性(Encapsulation) 隐藏实现

        1:隐藏实现细节(访问控制)

        2:定义接口

    继承性(Inheritance) 接口的重用

        1:IS-A关系

        2:HAS-A关系(组合)

多态性(Polymorphism) 对象互换的魔法

        3:后期绑定(虚函数)

        4:向上转形(Up Casting)

面向对象设计的目的

        1. 强内聚、低耦合,从而使系统

        2. 易扩展 - 易于增加新的功能

        3. 更强壮 - 不容易被粗心的程序员破坏

        4. 可移植 - 能够在多样的环境下运行

        5. 更简单 - 容易理解、容易维护

面向对象设计的原则

        1 为了达到上述设计目标,有人总结出了多种指导原则

        2 “原则”是独立于编程语言的,甚至也可以用于非面向对象的编程语言中。


设计模式,框架, 工具

1. 设计模式是用于解决某一种问题的通用的解决方案。

2.用来实现某一类应用的结构性的程序, 是对某一类架构方案可复用的设计与实现,用框架保证架构的落地

3.用工具提高开发效率


介绍完发展史,面向对象,设计模式,框架,工具后介绍了一个电话拨号的案例,个人感觉设计的还可以,意味着有很多面向对象设计的东西需要学习,后面再讲解时,对象之间强依赖, 僵硬的增加需求就需要写if else增加逻辑,需要对代码进行修改,脆弱的改一处地方还要改别的地方,不可移植的



想想在工作期间有好多臭味的代码,各种if else 的分叉,各种强依赖,耦合在一起,改一个地方影响各种耦合的地方,并且没办法解耦合出来,只能在错误的基础上继续维护,这种臭味的糟糕的代码给机器跑的,给人看的,人看起来头疼很费事

有臭味的程序

        1:僵硬 - 不易增加、修改:

        2: 增加一种 Button 类型,就需要对 Button 类进行修改;

        3: 修改 Dialer,可能会影响 Button。

        4:脆弱 - switch case/if else语句是相当脆弱的。

        5: 当我想修改 Send 按钮的功能时,有可能不小心破坏数字按钮;

        6: 当这种函数很多时,我很有可能会漏掉某个函数,或其中的某个条件分支。

        7:不可移植 - 设想我们要设计密码锁的按钮,它只需要数字按键,但 Button 的设计使它              必须“附带”一个“Send”类型的按钮。

设计一个好的程序必须是下面这样的

        1.易扩展的,只需要改少量代码就能新增功能

        2.强壮的,不容易被粗心的程序员破坏

        3.可移植的,能够在多样的环境下运行

        4.更简单,容易理解、容易维护


怎样设计好一个程序

OOD 原则一:开/闭原则(OCP)(面向抽象接口编程)

OCP - Open/Closed Principle

• 对于扩展是开放的(Open for extension)

• 对于更改是封闭的(Closed for modification)

• 简言之:不需要修改软件实体(类、模块、函数等),就应该能实现功能的扩展。

电话拨号案例优化

改进button第一种方法

使用多台,各种button继承button可以实现不改动源代码增加buttongon功能扩展.但是当dialer修改时需要修改button,button也不是可以移植的,仍需优化

改进button第二种方法使用策略模式

客户端应用程序不直接依赖要依赖的目标对象,而是通过定义一个策略接口.去依赖策略接口,目标依赖对象去实现策略接口,这样客户端便不会直接依赖目标对象,如果要增加功能时只需要增加策略实现类就可以了

因为适配器传过来的参数是一个int的token,Dailer变的脆弱了,所以需要在Dailer里进行 swich case,依然需要优化

改进button第三种方法使用适配器模式

通过适配器实现buttonServer接口,通过对buttonServer的接口调用转换成对适配器的接口调用,这样Dailer里就不需要写 swich case 了

这种设计不够灵活,button 只能调用一个buttonServer,button 按下时如果还有别的操作,就处理不了了

改进button第三种方法使用观察者模式

把策略接口改成listener接口,在Button里面addListener,在实现里for循环listener调用每一个listener的buttonPressed接口


依赖倒置原则(DIP)

DIP - Dependency Inversion Principle

1. 高层模块不能依赖低层模块,而是大家都依赖于抽象;(先开发接口,后实现接口)

        一个接口是属于高层模块的,高层模块会根据自己的使用场景进行接口设计和抽象,service高层模块定义的一个接口,低层模块dll去实现这个高层接口是依赖倒置,倒置了开发者的层次关系

        低层模块不能按照高层定义的接口进行实现,而自己可以写一个接口写一个实现供高层去调用不属于依赖倒置

        在高层模块里不能直接依赖具体的低层实现类

2.抽象不能依赖实现,而是实现依赖抽象。

DIP 倒置了什么?

        1模块或包的依赖关系

        2.开发顺序和职责

软件的层次化

        1.高层决定低层

        2.高层被重用


好莱坞原则

    框架调用我们的代码,我们不能调用框架代码

里氏替换原则(衡量继承是否合理的原则)

1.A类替换B类后程序代码可以正常运行,则A类是B类的子类,符合里氏替换原则

2.主要还是父类的场景子类是否都可以正常运行,能运行符合原则 ,不能运行不符合原则

3.子类的访问控制权限不能比父类严格

4. 对于违反原则的可以提取共性到父类,更好的方法是将继承改成组合,将父类变成自己的成员变量,可以调用成员变量的方法,减少不必要的继承,应该优先使用组合,然后使用继承



单一职责原则

一个类应该只有一个引起他变化的原因,如果一个类引起他变化的原因过多,这个类的职责就不是单子的

违反职责的后果:

    1.脆弱性-把绘图和计算功能耦合在一起,当修改其中一个时,另一个功能可能会意外受损。

    2.不可移植性-计算几何应用只需要使用“计算面积”的功能,却不得不包含 GUI 的依赖。

接口分离原则

实现类实现两个接口,不同的应用程序可以依赖不同的接口

设计一个接口从客户的需要出发,强调不要让客户看到他们不需要的方法。

相关文章

网友评论

      本文标题:架构师训练营第2周学习总结

      本文链接:https://www.haomeiwen.com/subject/twxoyktx.html