程序设计范型发展:
1.过程式程序设计
原始的程序设计范型是:确定你需要哪些过程,采用你能找到的最好的算法。
double sqrt(double arg) { //计算平方根的代码 } void fun() { double root = sqrt(2); // }
附:C++中,一个char变量具有某种自然的大小,正好能保存给定机器里的一个字符(通常是一个字节),int变量正好适合给定机器里的整数运算。C++能在基本类型之间完成任何所有有意义的相互转换。
2.模块程序设计
程序设计重点从有关过程转到对数据的组织。一集相关的过程与被它们所操作的数据组织在一起,通常被称作一个模块。
程序设计的范型变成了:确定你需要的哪些模块;将程序分为一些模块,使数据隐藏于模块当中。这一范型被作为数据隐藏原来而广为人知。
典型例子,定义一个堆栈:
【1】为堆栈提供一个用户界面(例如函数pushu()和pop())。
【2】保证堆栈的表示(例如,一个元素的数组)只能够通过用户界面访问。
【3】保证堆栈在被使用之前已经做了初始化。
namespace Stack //界面 { void push(char); char pop(); } void f() { Stack::push('c'); if(Stack::pop() != 'c') error("impossible"); }
这里Stack::限定词表面push()和pop()是来自Stack名字空间。这些名字的其他使用不会与之混乱。
Stack的定义可以通过程序的另一个单独编译的部分提供:
namespace Stack{ const int max_size=200; char v[max_size]; int top = 0; void push(char c){/*检查上溢并压入c*/} char pop(){/*检查下溢并弹出*/} }
该Stack模块的关键点是,用户完成隔离于Stack的数据表示之外,隔离的方式通过写出Stack::push()和Stack::pop()代码实现的。用户不必知道Stack是用数组实现的,这个方式实现可以修改而不会影响用户的代码。
模块化是一切成功大型程序的一个最基本特征。
3.用户定义类型
基于模块的程序设计,趋向于以一个类型的所有数据为中心,在某个类型管理模块的控制之下工作。例如,如果希望有很多堆栈——而不是像前面只用一个由Stack模块提供的堆栈——我们就可能会定义一个堆栈管理器,具有如下界面:
namespace Stack{ struct Rep; typedef Req& stack; stack create(); void destroy(stack s); void push(stack s ,cha c); char pop(stack s); }
以某种方式实现Stack。可以是先预先分配几个堆栈,而让Stack::create()递交出到某个尚未使用的堆栈的引用。而Stack::destroy()则将一个堆栈表示标记为未使用,以是Stack::create()能够重用它
namespace Stack{ //表示 const int max_size=200; struct Rep{ char v[max_size]; int top; }; const int max=16; //最大堆栈数 Rep statcks[max]; boolean used[max]; typedef Rep& stack; } void Stack::push(stack s, char c){} char Stack::pop(stack s){} Stack::stack Stack::create()(){