最近在看翁恺老师的面向对象程序设计,觉得与之前学习c语言时的面向过程着实差距很大。两者的差距自不必多说,但具体区别在哪,这里举一个程序的两种写法来说明。
先从我所熟悉的面向过程说起,面向过程与我惯于思考问题的过程相似,即去分析想实现某个目标需要做的各个步骤,然后实现每个步骤,从而达成最终目标。例如,一个自动售票机程序,我们需要做的各个步骤是:
1、投入硬币,
2、购买车票,
3、查询余额。
于是,我们的程序源代码可以是这样:
1 #include2 3 const int PRICE = 1; 4 int balance = 0; 5 6 void insertMoney(int amount); //投入硬币 7 void showBalance(); //查询余额 8 void chooseTicket(); //选择车票 9 10 int main()11 {12 int amount;13 printf("Please insert coins:\n");14 scanf("%d",&amount);15 16 insertMoney(amount); //投入硬币17 18 chooseTicket(); //选择车票19 20 showBalance(); //查询余额21 22 return 0;23 }24 25 void insertMoney(int amount)26 {27 balance += amount;28 }29 30 void showBalance()31 {32 printf("The balance is %d\n", balance);33 }34 35 void chooseTicket()36 {37 int ch;38 printf("Which ticket do you want to buy? \n1. xx2xx\n2. yy2yy\n");39 scanf("%d", &ch);40 balance -= PRICE;41 }
接下来是关于对面向对象的描述,翁恺老师讲对象就是一个蛋清包裹着蛋黄,从对象的角度出发,售票机的蛋清是一些系列操作,蛋黄是内部的数据。例程如下:
1 /* 2 * TicketMachine.h 3 */ 4 5 class TicketMachine{ 6 public: 7 void insertMoney(int amount); //投入硬币 8 void showBalance(); //查询余额 9 void chooseTicket(); //选择车票10 private:11 int balancce;12 const int PRICE;13 }14 15 /*16 * TicketMachine.cpp17 */18 19 #include "TicketMachine.h"20 #include21 using namespace std;22 23 void TicketMachine::insertMoney(int amount)24 {25 balance += amount;26 }27 28 void TicketMachine::showBalance()29 {30 cout << "The balance is " << balance << endl;31 }32 33 void TicketMachine::chooseTicket()34 {35 int ch;36 cout << "Which ticket do you want to buy? \n1. xx2xx\n2. yy2yy" << endl;37 cin >> ch;38 balance -= PRICE;39 }40 41 /*42 * main.cpp43 */44 45 #include "TicketMachine.h"46 47 int main()48 {49 TicketMachine test;50 test.insertMoney(100); //插入硬币10051 test.chooseTicket(); //选择车票52 test.showBalance(); //显示余额53 return 0;54 }
但是自动售票机的类只有一个,对象也只有一个,不能体现出对象之间互相交流信息的关系。我们可以举一个更为复杂的系统,例如一个棋类对弈游戏。
用面向过程的角度来考虑这个程序,我们需要做的步骤如下:
1、开始游戏,
2、黑子先走, 3、绘制画面, 4、判定输赢, 5、轮到白子, 6、绘制画面, 7、判定输赢, 8、返回步骤2, 9、输出最后结果。用面向对象的角度考虑,我们可以考虑一下三个类:
1、黑白双方,这两方的行为是一模一样的,
2、棋盘系统,负责绘制画面, 3、规则系统,负责判定诸如犯规、输赢等。即面向对象不需要考虑步骤的实现,需要关注对象,以及对象之间的信息交换。
关于各自的优缺点,会等面向对象掌握的比较熟练以后来补充。