对程序设计的一些感悟
2016-03-22 11:15
369 查看
从2002年接触C语言开始,不知不觉程序设计已经伴随我14年了,这期间或多或少的使用了C,C++,C#,Java,PHP,JavaScript, bash, VBA这些常见的开发语言,可悲的是才疏学浅,只是略懂而已。
一直以来,我有一个习惯,就是在理解一个抽象概念的时候,一定要找到这个概念的一个具体实现。数据结构和算法就是抽象的概念,我们不妨用C系语言的具体实现来重新定义程序,那就是:程序=结构体+函数。
数据结构和算法是彼此影响的,在设计的时候,很难严格的分阶段进行。如果说那个更重要,我会毫不犹豫的说:数据结构要比算法重要!。这是因为,数据结构设计的好坏,直接影响到算法的实现难易、优雅程度。Linux之父也阐述过类似的观点。
在机器指令级别上,大多数机器都为函数定义、调用(CALL指令)、数据结构定义提供了直接的支持。
数据结构和算法的结合方式,造就了形形色色的编程语言和编程思想。
(1)函数必须施加到特定的数据结构上
任何一个函数的内部,都可以通过一个特定的指针(如this)来得到要对齐进行操作的数据结构。
(2)函数(地址)本身就是数据结构的成员
任何一个函数都被一个数据结构的成员引用,没有独立存在的函数。
Java,JavaScript,C#就是纯面向对象的语言,在这些语言里,(1)函数一定是成员函数;(2)函数内部一定有一个指向数据结构的指针。
在使用纯面向对象的语言进行编程时:
(1)每定义一个函数时,首先要确定这个函数是哪个类(或者对象)的成员;
(2)每调用一个函数时,首先要确定函数内的this指针到底指向了哪个对象。
在使用JavaScript时,注意:一个对象的成员函数内的this指针可能指向另外一个对象。
C++,JAVA,PHP等采用的是基于类的实现方式,在这些语言里,使用对象之前必须要定义描述对象的类型。在这种方式下,子类对象拥有父类对象的完整副本,父类对象、多个子类对象、彼此独立。
在基于类的语言中,只有父类子类的概念,没有父对象、子对象的概念。
JavaScript则采用了基于基于原型的方式。在JavaScript里,没有类的概念,任何一个对象内部都有一个指向父对象的指针proto。子对象只是包含了父对象的指针,并没有父对象的副本。所有的子对象共享一份父对象。
在基于原型的语言中,没有类的概念,只有父对象、子对象的概念。
PHP,JavaScript则是动态类型语言,大多数解释性语言都采用动态类型。运行时由解释器负责根据实际的数据来确定存储的具体类型。
无论静态类型还是动态类型的语言,其程序在执行的时候,任何数据都必须是确定的类型。
1 程序设计的本质没变
程序=数据结构+算法,这是对程序最本质的、最切中要害的、最简洁的阐述。一直以来,我有一个习惯,就是在理解一个抽象概念的时候,一定要找到这个概念的一个具体实现。数据结构和算法就是抽象的概念,我们不妨用C系语言的具体实现来重新定义程序,那就是:程序=结构体+函数。
数据结构和算法是彼此影响的,在设计的时候,很难严格的分阶段进行。如果说那个更重要,我会毫不犹豫的说:数据结构要比算法重要!。这是因为,数据结构设计的好坏,直接影响到算法的实现难易、优雅程度。Linux之父也阐述过类似的观点。
在机器指令级别上,大多数机器都为函数定义、调用(CALL指令)、数据结构定义提供了直接的支持。
数据结构和算法的结合方式,造就了形形色色的编程语言和编程思想。
2 纯面向对象
纯面向对象把算法、数据结构进行了两方面的彼此联系。(1)函数必须施加到特定的数据结构上
任何一个函数的内部,都可以通过一个特定的指针(如this)来得到要对齐进行操作的数据结构。
(2)函数(地址)本身就是数据结构的成员
任何一个函数都被一个数据结构的成员引用,没有独立存在的函数。
Java,JavaScript,C#就是纯面向对象的语言,在这些语言里,(1)函数一定是成员函数;(2)函数内部一定有一个指向数据结构的指针。
在使用纯面向对象的语言进行编程时:
(1)每定义一个函数时,首先要确定这个函数是哪个类(或者对象)的成员;
(2)每调用一个函数时,首先要确定函数内的this指针到底指向了哪个对象。
在使用JavaScript时,注意:一个对象的成员函数内的this指针可能指向另外一个对象。
<script type="text/javascript"> var a = { name: "a", f: function(){ alert(this.name); } }; var b = {name: "b"}; a.f.apply(b); </script>
3 基于类与基于原型
面向对象的实现主要有两种方式,一是基于类、二是基于原型。C++,JAVA,PHP等采用的是基于类的实现方式,在这些语言里,使用对象之前必须要定义描述对象的类型。在这种方式下,子类对象拥有父类对象的完整副本,父类对象、多个子类对象、彼此独立。
#include <stdio.h> class A { public: int x; }; class B : public A { }; int main() { A a; a.x = 10; B b; b.x = 20; printf("%d,%d\n", a.x, b.x); return 0; }
在基于类的语言中,只有父类子类的概念,没有父对象、子对象的概念。
JavaScript则采用了基于基于原型的方式。在JavaScript里,没有类的概念,任何一个对象内部都有一个指向父对象的指针proto。子对象只是包含了父对象的指针,并没有父对象的副本。所有的子对象共享一份父对象。
<script type="text/javascript"> var a = {}; var b = {}; a.__proto__.x = 10; alert(b.x); alert(Object.x); </script>
在基于原型的语言中,没有类的概念,只有父对象、子对象的概念。
4 静态类型和动态类型
传统的C/C++是静态类型语言的典型代表,对于编译型语言来说,编译时(程序运行之前)必须确定数据的类型,所以只能采用静态类型。PHP,JavaScript则是动态类型语言,大多数解释性语言都采用动态类型。运行时由解释器负责根据实际的数据来确定存储的具体类型。
无论静态类型还是动态类型的语言,其程序在执行的时候,任何数据都必须是确定的类型。
5 运行时可变的数据结构
JavaScript的对象属性、数组元素可以在运行时动态增减,PHP的对象成员、数组元素也可以运行时动态增减。这种运行时可变的数据结构给编程带来了很大的便利。哈希表是实现这种可变数据结构的关键。相关文章推荐
- Socket开发框架之框架设计及分析
- sellect、poll、epoll
- Theano(6):Theano条件语句,IfElse vs Switch
- 同时点击buttons
- 手机截屏
- xampp配置虚拟主机,和一般配置虚拟主机一样
- linux 网卡的eth0变为eth1的解决方法
- monkeyrunner之一小白首次使用 - 小白菜123 - 博客园
- Android中使用HTTP服务
- NSString的详细用法
- [bzoj3994][SDOI2015]约数个数和
- 5-28 猴子选大王 (20分)
- First.cc分析
- 用keytool 生成证书配置tomcat ssl双向认证
- Java开发中的23种设计模式
- UIScrollView不能响应UITouch事件的解决办法
- Android应用的正确退出“姿势”
- Python装饰器九步入门
- socket测试
- 高仿360手机卫士应用源码