总结

编程语言实质:

编程的目的:用计算机来解决现实世界的问题。

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



编程的核心要素:





什么是面向对象编程?

面向对象 (Object Oriented,OO) 的思想对软件开发相当重要,它的概念和应用甚至已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD 技术、人工智能等领域。面向对象是一种 对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

面向过程 (Procedure Oriented) 是一种 以过程为中心 的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是 封装、继承、类。

无论是在软件开发还是在实际工作中,深入地理解软件开发的思想都非常有必要。



面向对象的三要素(特征):

  1. 封装,封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏。

  2. 继承,继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承概念的实现方式有三类:实现继承、接口继承和可视继承。

  3. 多态,多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,覆盖,重载。



面向对象设计的目的

强内聚,低耦合,从而使系统易扩展、更强壮、可移植、更简单。

设计模式

三大类23种基本设计模式

  1. 创建型模式,共五种:工厂方法模式(一个工厂类ReturnNew子类)、抽象工厂模式(一个厂一个子类)、单例模式(恶汉,懒汉)、建造者模式(组合)、原型模式(Cloneable浅接口,Serializable深接口)。

  2. 结构型模式,共七种:适配器模式(新接口用老实现类)、装饰器模式(同代理,增强)、代理模式(方法前后)、外观模式(计算机包括…)、桥接模式(中间表)、组合模式(树)、享元模式(共享池)。

  3. 行为型模式,共十一种:策略模式(Calculator子类)、模板方法模式(大象装冰箱)、观察者模式(观察者列表)、迭代子模式、责任链模式、命令模式(一层接一层)、备忘录模式(备忘录类包含被备忘录对象)、状态模式(IF)、访问者模式(访问外观模式)、中介者模式(join)、解释器模式(解释公式)。



框架VS工具

工具好比是搓衣板,框架好比是洗衣机,搓衣板只能搓衣服;洗衣机除了洗衣服还能脱水 甩干 加香 定时 定次...,工具其实只干了框架一部分的活,框架整体解决你的问题。



面向对象设计的基本原则

  • Single Responsibility Principle:单一职责原则

一个类应该只有一个发生变化的原因

  • Open Closed Principle:开闭原则

一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭

  • Liskov Substitution Principle:里氏替换原则

所有引用基类的地方必须能透明地使用其子类的对象

  • Law of Demeter:迪米特法则

只与你的直接朋友交谈,不跟“陌生人”说话

  • Interface Segregation Principle:接口隔离原则

客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上

  • Dependence Inversion Principle:依赖倒置原则

上层模块不应该依赖底层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象



总结:从计算机编程的发展历程,引发人类创新、创造性思考;而程序设计也逐步向规范化、工程化发展;设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。

作业一:

  • 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?



依赖倒置原则(Dependence Inversion Principle, DIP),包含如下的三层含义:

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象

  2. 抽象不应该依赖细节

  3. 细节应该依赖抽象

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来实现。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是底层模块,负责基本的原子操作;假如修改A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

DIP的本质:通过抽象(抽象类或接口)使各个类或模块实现彼此独立,不互相影响,实现模块间的松耦合。

DIP的好处: 采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

精简定义:面向抽象(抽象类或者接口)编程。



在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。

在软件设计中,高层模块依赖底层模块就像演艺公司依赖演员,底层模块对高层模块来讲不应该是强制被依赖的,也就是说当高层模块需要时进行对底层模块的调用。

作业二:

  • 请描述一个你熟悉的框架,是如何实现依赖倒置原则的?



熟悉Spring框架的人都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念。

IoC是spring的核心,贯穿始终,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。

作业三:

  • 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。

优化后的类图如下图,CacheServiceImpl 类实现两个接口,IApplicationCacheService接口包含 get put delete 暴露给应用程序,IRemoteCacheService接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法





李智慧 - 架构师训练营 第二周相关推荐

  1. 李智慧 - 架构师训练营 第一周

    总结 什么是软件架构? 什么是架构师? 如何做软件架构? 4+1视图模型 什么是模型? 为什么要建造模型? UML建模 作业 总结 架构师职责 架构师能力 什么是软件架构?  什么是软件架构,了解其 ...

  2. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  3. .NET 云原生架构师训练营(系统架构)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记

    2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

    2.3.1 Web API -- REST && RESTful 什么是 REST,什么是 RESTful RESTful API 设计 RESTful 成熟度模型 什么是 REST, ...

  6. .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记

    2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core ...

  7. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

    2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

    2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/ ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  10. 到「黄埔学院」去:打造AI首席架构师,第二期限量招募!

    今年 1 月,百度联合"深度学习技术及应用国家工程实验室"成立黄埔学院,旨在为产业培养第一批"首席AI架构师".黄埔学院一期学员历时半年的学习和交流,6 月 1 ...

最新文章

  1. mysql 多线程_数据库选型之MySQL(多线程并发)
  2. 统计完全二叉树的节点数
  3. 通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)
  4. centos 7 修复mysql,快速修复Centos7 系统时区!
  5. SSIM(structural similarity index),结构相似性
  6. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)
  7. ubantu之Git使用
  8. 求1-100的所有数的和
  9. JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
  10. python嵌套循环_关于Python嵌套循环代码优化
  11. Hyper-V常见故障汇总
  12. java案例教程_JAVA基础案例教程 PDF 下载
  13. 安装多个 PHP 版本(PHP7, PHP5)
  14. Java字节码技术javassist
  15. Python对YouTube视频统计趋势数据集分析
  16. 基于长短期记忆神经网络的蛋白质二级结构预测
  17. 第一个iOS应用 —— Hello world!
  18. IOS开发学习笔记(一)
  19. Esxi5.5添加4T报错的问题
  20. Android 新增API Autofill

热门文章

  1. 零度飘逸LDPY GhostWin7 Sp1纯净选择版V7.0(驱动增强版)
  2. ?username=王二麻子age=18转换成对象?
  3. 获取一组坐标的中心点
  4. 尚学堂视频笔记四:常用类
  5. RPC开发系列九:优雅启动
  6. 西南大学计算机科学学院官网,西南大学计算机与信息科学学院研究生导师简介-李艳涛...
  7. PostScript语言教程(一、介绍)
  8. 计蒜客 青出于蓝胜于蓝 【DFS序 + 树状数组】
  9. 曹金明:Zynga大败局--数据控是如何把游戏做败的
  10. 微信开放平台的使用介绍,配置流程