数据
程序也是数据,但只有我们搞清楚数据和程序的区别,才可以说出这个「也是」。
在代码里,数据一般储存在变量中,为了便于交流和理解,变量有类型,类型决定着「变量的数据储存格式和范围」和「可以对数据进行哪些操作」。
比如数字类型表示可以对其进行加、减、乘、除四则运算,但我们必须要有两个数字类型的变量才能开始运算。字符串类型可以进行查找、拼接等操作,集合类型可以进行交集、并集、补集等操作。
对于集合类型,还决定着数据格式或者说结构是一堆东西,而不是一个。对于数字类型,它只能表示数字范畴内的东西,也就是 0123456789 这些。
函数
操作数据的过程可以称作函数。我们定义加法这种操作只能对两个数字执行,结果只能是一个数字,这也可以看作是两个数字与一个数字的关系,很像函数。函数的结果可以跟参数的类型不同,多个参数之间的类型也可以不同,取决于你想进行什么操作。
函数的定义:给定一个数集 A,假设其中的元素为 x。现对A中的元素 x 施加对应法则 f,记作 f(x),得到另一数集 B。假设 B 中的元素为 y。则 y 与 x 之间的等量关系可以用 y=f(x) 表示。我们把这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域 A、值域 C 和对应法则 f。其中核心是对应法则 f,它是函数关系的本质特征。
结构化
人们发现程序可以是结构化的,并非只能写成流水账。结构化就是找到程序块之间的关系,并且只是写出关系,剩下的计算机会自动根据关系执行程序。
程序块之间的关系有顺序、互斥、循环等,还有各种同步异步消息传递模型都可以看作是程序块之间的关系。流水账式的程序天然定义了顺序这种关系,上一行总是在下一行之前执行,但是在你读完代码之前不能看出某两段代码是根据条件互斥执行的,代码中没有明确写出关系,你只能根据隐含语义猜测。
如果代码是结构化的,只需要标记出程序的关系,计算机会理解关系并自动按关系行事,编写的时候省事多了,看代码的人也好理解,他可以一眼看到那些标记,不需要根据非字面意思去猜测程序的行为。
我们也应该尽可能杜绝隐含语义的、非字面意思的代码。当然在写代码时需要考虑好哪些功能是直接在语言字面上就有语义化的(核心对象)、哪些是集成语义的(业务代码)、哪些是隐含语义的(局部变量)、哪些是 hack(奇葩业务代码)。
副作用
一个函数的定义,从字面上可以看到名字、参数、返回结果。函数的名字应当能够体现它进行的操作。
如果函数的行为与名字、参数、返回等字面意思不一致,不一致的部分叫做副作用,比如在函数内修改了全局变量,而且这个全局变量影响到了调用者,这就是副作用。副作用会导致使用者误用这个函数,我们应当保证函数没有副作用。
一个没有副作用的程序是没有意义的。键盘输入就是副作用,屏幕显示也是副作用,可我们不能丢掉它们。
对象
函数总有副作用,面向对象的方式是把这些副作用分布到各个对象中,对象之间只能靠同步阻塞消息传递的方式通信(方法调用)。这个做法的坏处是你依然要时刻考虑副作用,虽然需要考虑的范围变小了。这也就是为什么要提倡单方法接口。
实体
几个函数的副作用加起来就是属性,又由属性和这些函数共同构成了实体,或者说是对象。
个人习惯在口头上提到的实体就是表达数据实体,不包含那些用来处理数据实体的方法。
方法
TODO
网友评论