《代码之髓》笔记
如果程序包涵代码和数据两部分:
面向过程编程 就是以代码为主,用代码控制数据,描述解决问题的方法。
面向对象编程 就是以抽象数据为主,所有处理都围绕数据展开,用数据控制代码,依赖抽象编程
面向对象软件开发的优点:
代码开发模块化,更易维护和修改
代码复用
增强代码的可靠性和灵活性
增强代码的可理解性
程序语言是为了寻求便捷而诞生的,正是因为对便捷的不同需求。 才促成了各种程序语言的发明。
语言设计的取舍:易用性与功能,安全性与效率,稳定性与可扩展性。
C:结构化编程 + 高效 + 功能强大 + 易于学习
诞生于1972年
the c programming language 1978由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言
1989.12 第一个完整的C语言标准,简称“C89”,不过人们也习惯称其为“ANSI C”。
最新标准在2011年12月8日发布,称为ISO/IEC9899: 2011,简称为“C11”。
C++, 1979年发明,最初称“带类的C”,1983年正式更名为C++
重视代码执行效率,语言规范相应的非常复杂。
JAVA 1991年构想,92年初步实现,95年公开发布。
目标是实现体系结构中立,而万维网的发展成就了JAVA,因为万维网需要可移植程序。JAVA对网络编程的意义就如同C对系统编程的意义一样:都是改变世界的革命性力量。
比较总结:
2. 编程语言知识点
1 . 流程控制:
使用if...else , while, break,continue 代替 过于强大、结构差、不便阅读的goto。
同时增加 for, switch,以及后续的foreach 让代码更简洁、清晰。
2. 函数:
因为随着程序代码变得越来越庞大,把握全局逐渐变得困难起来,同时有可能需要多次用到非常相似的操作,所以促成了函数 的诞生。
将代码的一部分视作一个有机整体,切分出去并为之命名的程序设计机制(便于理解和可重复使用,早期有子程序的称谓)。函数的实现需要在函数调用完成后返回原来的位置,同时函数还会嵌套乃至递归调用,目前普遍使用栈结构来实现。
只有代码行数少了,才能很容易就把握到每一行执行什么功能。减小出错概率。同时有助于理清思路,把握全局。
优秀的代码书写应该是每个函数仅实现一个功能,就如同类的单一职能原则一样,这是一个度的把握。一般要求一个函数的代码行数绝不能超过100行。一般不宜超过一个屏幕高。就如横向上一行代码不宜太长一样(不要产生滚动条)。同时参数列表也不易太长,否则可考虑通过某种数据组织形式整合一下。
以上两项是面向结构编程的基础。结构化程序设计的初衷正是通过导入这些功能从而使代码结构的理解变得简单。
3. 错误处理:
常见的处理方法有两种:
使用返回值及引用参数传达出错信息。
- C,GO采用这一模式
使用可追加错误类型和可主动触发错误的异常处理机制。
- C++ ,JAVA,C# 使用throw , try ... catch
- JAVA,C# 中 可以使用try ... catch ... finally。使用finally,出口只有一个,实现成对操作的无遗漏执行。
- JAVA 采用检查型异常,要明确声明可能抛出的异常,因为"The Trouble with Checked Exceptions",所以C#未引人。
- swift此前采用c的模式,2015开发者大会上提到将引入异常处理机制。
4. 命名和作用域(动态作用域、全局作用域、静态作用域),命名空间。
5. 类型:数据如何读取,需要依赖人们为数据附加的类型信息。
基本数据类型:
- CPU对操作数的存放方式:Little_endian(从低字节到高字节)和Big_endian(从高字节到低字节)。
- 以2进制表示10进制,约3.32(log10 / log2)个bit位表示一位。
- 整形:最高位为符号位。负数采用补码的方式,从而将减法转变为加法。(补码:除符号位外 按位取反 再 加 1 )
- 浮点:
以32位为例:
最高位为符号位,
之后8位是表示位数的指数部分(0~255,减去127,得到-127~128,-127表下溢出:0,128表上溢出:无穷小或无穷大,剩下的为位数)
剩下23位为尾数部分,表示小数点以下的部分(通过移动小数点使整数部分变成1后的小数部分)。
如: 1.75 二进制:1.11 ,无需移位, 符号位:0,指数部分 0111,1111(127),尾数部分:110,0000,0000,0000,0000(0.5 + 0.25)
3.875 二进制:1.1111 * 2, 符号位:0,指数部分 1000,0000(128右移一位),尾数部分:111,1000,0000,0000,0000
范围 :2-126 / 3.32 ~ 2127 / 3.32 约10-38~1038
精确度:23/ 3.32 ,6~7位有效数字
64位则指数部分为11位
范围 :-21022 / 3.32 ~ 21023 / 3.32 约10-308~10308
精确度:52/ 3.32 ,15~16位有效数字
自定义类型:结构,联合,枚举,类。使用基本数据类型通过组合定义新的类型。
泛型、模版
动态类型
6. 容器(数据结构):
7. 对象与类
面向对象编程里的 对象是现实世界的模型。归纳并建立模型的方式多种多样,语言不同,选择也不同,类是最方便的,却不是必须的。
JS中通过将函数和变量放入散列,以实现将相关联的函数、变量集中到一起的功能。
函数式语言里,则会采用闭包的形式。
perl 使用包的形式
访问权限:public private protected internal,java中有前三种及缺省模式
访问控制的作用:功能上实现封装,代码上解耦
具体:通过隐藏对象的字段来保护其内部的状态
禁止对象之间的不良交互提高模块化
提高代码的可维护性,与外界的交互点越少,越好管理
8.继承
采用封装来建立抽象数据模型,但仅仅只有封装还不够,事物之间是普遍联系的,还需要继承和多态来描述他们之间的关系
继承可以重用基类代码,需要谨慎使用,否则代码可读性降低,而且扩展困难。使用中要遵守里氏替换原则
C++为多重继承,多重继承使用方便,但会产生冲突,JAVA的解决办法就是只容许单继承,用接口实现多重继承的功能。同时单继承便于统一管理内存。
9. 抽象类,接口
抽象类可以有一个抽象方法,而接口则所有方法都是抽象方法,java1.8中为接口增加了默认方法和静态方法。可以增强代码的扩展性,简化了代码实现,同时也扩展了函数式接口的功能。
多态是指 从基类继承并进行扩展的一系列子类,相互之间是不同的,但对于基类而言,他们依然还是基类的一个实例,即是他们都可以赋值给一个基类的引用变量,同理也可以赋值给抽象类和接口,后者是面向接口编程的基础。