程序运行过程中会遇到各种错误。
有的是由于程序编写出现问题的,这种错误通常称之为bug,这是必须修复的。
有的是由于用户输入错误造成的,这种错误可以检查用户输入来做相应处理。
还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。
程序运行过程中会遇到各种错误。
有的是由于程序编写出现问题的,这种错误通常称之为bug,这是必须修复的。
有的是由于用户输入错误造成的,这种错误可以检查用户输入来做相应处理。
还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。
数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能。我们接下来会讨论多重继承、定制类、元类等高级概念。
元认知能力(metacognition):awareness and understanding of one’s own thought processes.即对自己思考过程的认知与理解。
认知能力好比是马,而元认知能力是马车。
回想一下自己的生活,有多少次是马随意地拉着马车跑,而不顾马车夫的指令。这正是元认知能力的不够,导致无法好好控制认知带来的结果。
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
由于这一章在C++中学的不错,所以内容较少。
API(Application Programming Interface)提供了对某个问题的抽象,以及客户和解决该问题软件组件之间进行交互的方式。
组件通常以软件类库的形式分发,可以在多个应用程序中使用。目前的应用程序往往是由很多API建立而成,而这些API往往依赖于其他API。
API的目的是为某个组件的功能提供一个逻辑接口,同时隐藏该模块的具体实现。即代码只能通过该API的公共接口进行访问。也就是说,提供了一个抽象的接口,所以更多的将API理解为Abstract Programming Interface。
在C++中一般包含三个部分:
1.一个或多个头文件,定义了接口,使得客户端能够对其进行编译。开源API还包括其.cpp
文件。
2.库文件,某个API的特定实现可以被链接到用户程序的库文件中。可以为静态库,如Windows下的.lib
文件和Linux,Mac OS下的.a
文件。又或者是动态库,如Windows下的.dll
文件和Linux,Mac OS下的.so
文件。
3.辅助文档,如何使用API的概述信息。通常包括为API中所有的类和函数自动生成的文档。
1.API是给开发者设计的接口。 设计拙劣的API很有可能让你的用户转向竞争者的怀抱。
2.多应用共享一个API。 一旦出错,造成的影响巨大。
3.修改API时必须保证向后兼容。 在计算机中指在一个程序或者类库更新到较新的版本后,用旧的版本程序创建的文档或系统仍能被正常操作或使用,或在旧版本的类库的基础上开发的程序仍能正常编译运行的情况。
4.API必须有良好的设计、文档、回归测试,并且保证发布之间的稳定性。
SDK(软件开发工具包)为安装在计算机特定平台的包,目的是使用一个或多个API来构建应用。除了上述API所要求的东西之外,还要包含支持其他帮助使用API的资源。
在设计API时,应该阐述在选定问题域内有意义的深层概念,而不是公开底层实现细节。当你把API文档提供给一位非程序员是,他应该能够理解接口中的概念并且知道他的工作机制。一种API不仅仅只有一种方式建模,每种方式都可以提供良好的抽象和易用的接口,关键是API应该有一致且合理的支撑体系。
这边先介绍一下UML类图。UML规范定义了一组面向对象软件系统的可视化建模符号。类用方框表示,该方框被分成三个区域,上层为类名,中层为列出类的属性,下层区域为类的方法。
方框中每条记录都可以添加前缀符,来对因属性或方法的可见性。+
表示共有类成员,-
表示私有类成员,#
表示受保护的类成员。
类之间的关系可以用多种样式的连接线和箭头表示。
关联:两个类之间的简单的依赖关系,两者互不从属于对方,用实线表示。带有方向,UML用开放箭头表示方向,比如“>”。
聚合:“has-a”关系,或者整体与部分的关系,两个类互不从属对方。用空心菱形的直线表示。
组合:“contain-a”关系,部分和整体具有统一的生存期。用带有实心菱形的直线表示。
泛化:类之间的父子关系,用带空心三角箭头的直线表示。
对象间的各种关系可以在某个对象边用注释定义,这样就能分辨出他们的关系是一对一还是多对一还是多对多。常见的一些关系有:0..1
表示零个或一个实例,1
表示一个实例,0..*
表示0个或多个实例, 1..*
表示一个或多个实例。
随着代码越写越长,越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样件,每个文包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
我们首先要搞明白计算机(Computer)和计算(Compute)的概念。
在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。
而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。