编程语言共性:元素+语法+映射
元素:标识符保留字符号
数据:类型对象值常量和变量
操作:运算运算符表达式语句
流程:流程控制顺序选择循环
函数:函数参数调用返回值
函数蕴含了1.(映射)简化2.复用两种非常重要的思想
函数其实是代码复用的一种最原始的体现。
简化举例:
1.一条调用语句代表了n条语句
2.吃苹果代表了现实世界的吃苹果
文字->现实世界
有穷集->无穷集
基本元素、规则(有穷集)->基本元素+规则(无穷集)->现实世界(无穷集)
例子1:自然数(元素+语法+映射)
最简单的语言:自然数-最简单的语言:自然数->现实世界数量的概念
基本元素:0,1,2,3,4,5,6,7,8,9
语法:形成一个n个字符的序列
映射:一一映射
基本元素10个、语法1条(有穷集)->自然数(无穷集)->现实世界数量的概念(无穷集)
代码复用3个级别:
1.本项目内代码复用。
2.多个项目的代码复用。
3.某一领域内代码复用。
---<面向对象>---5个核心词:类、对象、封装、继承、多态
//是计算机编程技术发展到一定阶段后的产物。
面向对象是一种软件设计思想。是一种对现实世界理解和抽象的方法。
对象多如狗。核心是对象。对象是对现实世界事物的抽象。
封装、继承、多态是面向对象的3大特征。3大特征具有层次性。
3个特征一起才能较好地反映客观世界。
原因:面向过程的思想难以实现越来越复杂的系统。开发不高效。
优势:面向对象通过不同层次抽象来简化复杂系统设计,并提供不同级别的复用。
代码复用3个级别:
1.本项目内代码复用。函数,继承。
2.多个项目的代码复用。类,继承。
3.某一领域内代码复用。框架。
把现实世界的事物抽象成对象。相似的对象抽象成为类。
类被实现为一种数据类型,而对象是该数据类型的一个实例。
(或抽象数据类型,以示它和面向过程中基本数据类型、结构体等类型的区别)
(如:我们一说抽象数据类型,就知道指的是类而不是结构体。)
类和对象关系:
(1)类是抽象,对象是具体。
(2)通过抽象的类定义具体的对象。
(3)1个类对应n个对象。
//具体和抽象都是相对的。类相对对象是抽象,对象相对现实世界的事物是抽象。
---<封装>---
划分边界,对象成为独立的个体,有了对象内和对象外。对象内高内聚,对象之间低耦合。
//划分边界,产生个体,有了内外。再谈高内聚和低耦合。
封装是通过对象实现和体现的。
装:对象就像一个容器,将相关的数据和方法装在一起。
封:对象作为一个整体,划分了边界,对象内和对象外。只对外提供必要的服务。
---<封装的优点>
划分边界,高内聚,低耦合。
使用简单:使用者只用关注对象提供的服务。(公有的部分)
便于管理,信息隐藏,减少错误。
//---这导致很多人,比如以前的我以为面向对象的特征还包括抽象或类、对象
//-1- 其实如果理解了对象和封装的关系,类、对象和封装意思差不多的。
//对象、封装本来就是一种重复的说法,一般说特征的时候我们只用封装就可以了。
//-2- 至于抽象,抽象思想的应用范围非常广泛,应用于各种科学领域。
//抽象可不是面向对象的特有的,我们一般说面向对象使用了抽象思想。
结论:面向对象3大特征是封装,继承和多态。对象多如狗。3个特征具有层次性。
//面向对象的特征包括对象或抽象这种说法当然也正确,3大特征的说法更清晰易理解。
---非常重要:
怎么说都正确。正确理解面向对象才是重点@_@!..
---<继承>
来源:现实事物间的继承关系抽象成类之间的继承关系。、
表现:类之间的继承关系。子类继承父类的东西。通过权限控制继承。
基础:继承基于类(没有类哪来的类之间的继承关系)。
//通过权限控制,控制继承和访问。private不能被继承,protected和public可以被继承。
---<多态>
来源:相同的消息,不同的对象有不同的行为。
表现:子类可以覆盖父类的方法表现出多态,或者不覆盖不表现多态。非常灵活。
基础:多态基于继承。
---<硬编码和软编码>
硬编码将程序风险部分写在源代码中,软编码将风险部分暴露在配置文件中。
如果风险部分需要改变,则硬编码必须修改源码,重新编译整个程序并重新部署。
软编码只需要修改配置文件中的参数,不需要修改源码。
优缺点:硬编码效率低下,太麻烦。如果可以使用软编码,绝对不要使用硬编码。
案例1:数据库迁移。
1.将数据从旧库迁移到新库。//此期间程序能够正常运行
2.修改程序,使用新库。//此期间程序必须终止运行
硬编码:
修改程序时,必须修改源代码,重新编译并部署程序。
占用时间长,影响程序正常运行。太麻烦,效率低下。
软编码:
只需要修改配置文件,设置成新的数据库。占用时间非常短,几乎不影响程序正常运行。
1.什么是面向对象?
面向对象是一种软件设计思想,核心是对象,有封装,继承,多态三大特征。
2.什么是对象?
对象在代码中,指的是一种代码单元,它具有属性和方法,是一种相对独立的单位。
3.软件设计?
软件设计简单来说,就是为满足现实世界的需求,设计出相应的编程语言描述的逻辑。
软件设计的起点:
现实世界
软件设计的终点:
编程语言描述的逻辑。
为了提高开发效率,软件设计的2个主要目标:1.简化设计 2.代码重用
软件的复杂程度:这里简单的用代码行数来表达。比方一个普通的项目需要10万行代码
例子1:
2018年你从零开发了一个10万行代码的项目,花了1年时间。
2019年你又从零开发了一个10万行代码的项目,花了1年时间。
思考:
你在开发的过程中,发现2个项目,存在很多功能上重复的代码,显然没必要重复编写。
关键在于,怎么处理这些可能被再次使用的代码。
需要提供一种代码重用的机制。
例子2:
1.有一天你需要把地里的杂草除掉。为此你做了一个锄头,用锄头把草除掉了。
2.又有一天你需要种树。你发现自己需要挖坑,哦你想起来上次除草做了个锄头,
锄头可以挖坑,于是你把锄头拿了过来,挖坑种树。
思考:
显然我们为了种树,只需要拿出上次的锄头,这样极大的提高了生产效率。
没必要再重新制作一个新的工具。因为锄头完全可以满足我们的需求。
比喻:
这里用现实世界和代码开发做了一个比喻。
注意:只有在2者之间存在相似的地方,比喻才是恰当的。
4.再谈对象
对象,实现了软件设计2个主要目标。1.简化设计 2.代码重用。
1.简化设计方面
软件设计的起点,是现实世界,终点是代码。也就是说代码来源于现实世界。
我们很容易建立现实事物和代码世界中对象这种代码单元的映射。尽管有时候不是这样的。
换种说法,我们很容易将现实事物,转化为代码中的对象。
例子:
现实世界:员工,有工资,工龄,职位,可以加薪,升职。
---<我们非常容易就可以将现实世界中的员工映射到代码世界中>---
代码世界:
Employee类
属性:salary,workYear,position
方法:riseSalary();risePosition();
注意:将现实事物映射到代码世界的结果并不唯一,我们想表达的只是对象的产生让实现这种映射很容易。
尽管有时候不是这样的。
2.代码重用方面
对象中的继承,提供了一种代码重用的方法。