您的位置:首页 > 其它

对程序设计的一些感悟

2016-03-22 11:15 369 查看
从2002年接触C语言开始,不知不觉程序设计已经伴随我14年了,这期间或多或少的使用了C,C++,C#,Java,PHP,JavaScript, bash, VBA这些常见的开发语言,可悲的是才疏学浅,只是略懂而已。

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的对象成员、数组元素也可以运行时动态增减。这种运行时可变的数据结构给编程带来了很大的便利。哈希表是实现这种可变数据结构的关键。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: