C++编程杂谈之二:面向工具
副标题#e#
软件开拓是一个极其巨大的进程,一段小的代码我们可以快速、精确的完成,可是当你面临的是一个复杂的软件系统的时候,你是否有不知所措的感受呢?
在我们利用C的年月内里,编程思想是布局化的,你的C语言老师大概会不绝的辅导你奈何利用布局化的要领来完成一段措施,同时,你大概也知道在软件开拓中的一个重要定律(Wirth定律):
措施 = 算法 + 数据布局
在布局化设计中人们凡是是这样来对待这个定律的:
措施 =(算法) + (数据布局)
譬喻:(我仍然利用C++尺度库来写下面的代码,利便和今后的代码比拟)
#include <iostream>
using namespace std ;
typedef struct Student
{
char strname[50]; //姓名
int math; //数学分数
int chinese; //语文
int total; //总分
}STUDENT;
void InitData(STUDENT* some)
{
//////////////////////////////////////
//初始化数据
some->strname[0] = '\0';
some->math = 0;
some->chinese = 0;
some->total = 0;
}
void InputData(STUDENT* some)
{
///////////////////////////////////////
//获取输入
cout<<"enter name"<<endl;
cin>>some->strname;
cout<<"enter math"<<endl;
cin>>some->math;
cout<<"enter chinese"<<endl;
cin>>some->chinese;
//////////////////////////////////////
//计较总分
some->total = some->math + some->chinese;
}
void PrintData(STUDENT some)
{
cout<<some.strname<<"''''s total mark is:"<<some.total<<endl;
}
//上面的部门可以单独放在一个头和CPP中
main()
{
STUDENT someone;
InitData(&someone);
InputData(&someone);
PrintData(someone);
}
#p#副标题#e#
到今朝为止,措施的分别变得相对简朴了,团队的开拓才成为大概。在面向工具中,所存在的Wirth定律与上面的布局很是雷同:
工具 = (算法 + 数据布局)
措施 = 工具 + 工具
外貌上好像二者之间并没有太大的不同,但就是这个不同为我们带来了庞大的厘革。
有这样一句话:“编程是在计较机中反应世界”,我以为再贴切不外,面向工具(Object-Oriented)对这种说法的浮现也是最优秀的,好比在前面的例子中,我们设计的数据布局是一个学生后果的表示,而对数据布局的操纵(函数)是疏散的,固然这些操纵是针对这种数据布局而发生的。为了打点大量的数据,我们不得不小心翼翼地利用它们。
面向工具中一个重要的观念就是类(class)C++中是它。类和struct数据布局最大的差异就是提供了限制级别(可见性)的掩护——我们先抛开巨大的担任与多态不谈。正是通过这种方法,我们可以对数据成员提供很是有效的掩护,同时使数据布局更切合现实行为。
在面向工具的观念中,前面的数据布局暗示如下:
#include
using namespace std;
class Student
{
private:
//属性
char strname[50]; //姓名
int math; //数学分数
int chinese; //语文
int total; //总分
public:
//要领
char* getname(){ return strname; };
int getmath(){ return math; };
int getchinese(){ return chinese; };
int gettotal(){ return total; };
Student();
void InputData();
void PrintData();
};
Student::Student()
{
//////////////////////////////////////
//初始化数据
strname[0] = '\0';
math = 0;
chinese = 0;
total = 0;
}
void Student::InputData()
{
///////////////////////////////////////
//获取输入
cout<<"enter name"<<endl;
cin>>strname;
cout<<"enter math"<<endl;
cin>>math;
cout<<"enter chinese"<<endl;
cin>>chinese;
//////////////////////////////////////
//计较总分
total = math + chinese;
}
void Student::PrintData()
{
cout<<strname<<"''''s total mark is:"<<total<<endl;
}
int main()
{
Student someone;
someone.InputData();
someone.PrintData();
}
#p#分页标题#e#
我们先不去体贴类的实现细节,此刻比拟一下main函数中的挪用进程,每种要领和相应的数据布局接洽在了一起,对外部的挪用来说,我们不需要去体贴数据布局和相应算法的干系,因为他们已经关联在了一起。也许这个例子不足说明问题,也许我的说明暗昧不清,可是你想象一下:假如我们对一个物体,好比狗来建模,我们需要确定其属性(颜色、巨细)和行为(跑、叫),我们必定但愿这些都与狗这个模子关联在一起:
Class dog
(属性)
Color
Size
(行为)
Run
yelp
假如是布局话的:
Struct dog
Color
Size
(依赖干系)
Run(dog somedog) yelp(dog somedog)
显然后头的布局较量巨大,更不要说缺乏有效的成员属性掩护。别的一个面向工具的强大就是担任与多态,下一篇我们再来接头。
我但愿我前面的表达足够的清楚,面向工具不是这样一篇文章可以描写的清楚的,我这里只是描写了一个成长进程的单方面。我但愿它能成为一个引子,可以或许为初学者提供一些辅佐。