对程序设计的一些感悟

从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的对象成员、数组元素也可以运行时动态增减。这种运行时可变的数据结构给编程带来了很大的便利。哈希表是实现这种可变数据结构的关键。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值