软件设计师面向对象知识点:思考面向对象是什么?

软件设计师面向对象知识点:思考面向对象是什么?,第1张

软件设计师面向对象知识点:思考面向对象是什么?,第2张

先考虑一个现实问题, 大家都熟悉的手机发短信. 来看看早期(A 大约是汇编语言时代),中期(B 结构化),现在(C 面向对象)三种思想下的不同实现.
我说的是思想, 因为虽然现在大家使用着面向对象的工具,但是大部分程序员的思想依然没有面向对象. 比如现在我手下这群程序员里有面向对象分析和设计能力的也就一个..
用最面向对象java和C#也可以写出杂乱无章完全不面向对象甚至不结构化的程序.
注意到现在我们的手机号码分成移动和联通两种, 虽然对我们来说,不过是号码不一样收费不太一样,没多少区别,但是两家的短信接口可是完全不一样的.
假设程序要求 用户在界面上输入手机号码(TextBox1),输入一条短信内容(TextBox2),按确定(Button1),就可以把短信发到那个手机上
A 一步一步走,该干什么就干什么...看看伪代码:
st***号码 = TextBox1.Text;
st***内容 = TextBox2.Text;
int 第3位数字 = int.Parse(号码.Substring(2,1)); //把第3位取出来,用来判断是不是移动的手机 如 1390000000 就取出一个 9
if(第3位数字 > 3)
{
....
....
....//这里是一堆长长的代码用来发送***的短信...省略,我们这里只说程序的思想..不涉及技术细节
}
else
{
....
...
...//又是一堆长长的代码用来发送***的短信
}

B 写一个库,定义出发送***短信的函数和发送***短信的函数,还有判断的函数,假设函数原型分别是
发送移动短信(st***手机号码,st***内容);
发送联通短信(st***手机号码,st***内容);
bool 是否是移动号码(st***手机号码);
然后写程序如下:
if(是否是移动号码(TextBox1.Text))
发送移动短信(TextBox1.Text,TextBox2.Text);
else
发送联通短信(TextBox1.Text,TextBox2.Text);

C 定义一个抽象接口 "短信接收者", 由 "***"和 "***" 两个类分别实现接口. 各自实现发送短信方法.
然后构造一个 "手机工厂"(一时想不到好的名字,暂时叫这个吧) , 接收一个号码,返回一个 "短信接收者"接口(里面根据接收的参数,可能是***或***)
然后程序如下(一行..):
手机工厂.获取接受者(TextBox1.Text).发送(TextBox2.Text);
或写成这样清晰点:
st***号码 = TextBox1.Text;
st***内容 = TextBox2.Text;
手机工厂.获取接受者(号码).发送(内容);

OK,对于上面3段伪代码 大家有什么想法? 第3种是不是看起来有点 爽? 也许把,也仅仅是看起来那么一点爽,没什么大不了.
没错,面向对象是在大型的地方更能体现优势,一小堆是展现不出来的. 我们假设程序中一共有100个这样的地方(比如一个是发短信的,一个接短信的,一个打电话的,一个上网的.....)
那么对于A程序,很抱歉,非常要命,要在100个地方复制代码,复制100份,然后对其中99份做修改(或多或少,总要改点..)
B程序只是在每个调用的地方加几行,可以接受.
C程序在调用点也是加1行,同样也可以接受.
这个时候,结构化和面向对象共同的优点体现出来了,复用性 (教科书中讲面向对象总是说说复用是面向对象比其他方法的优势,其实结构化本身就是可复用的)
A方法差不多该抛弃了........这就是结构化发展起来以后, 非结构化很快面临淘汰地步的原因,因为在软件稍微大点,就出麻烦,写写单片机小模块还行.
软件在一天天变大变复杂,仅仅是变大变复杂而已? 当然不是. 也变得多变. 用户的需求时时在变.软件也容易变,.
回到刚才的问题, 现在不是有小灵通么? 你又需要多一种类型,变成 小灵通\移动\联通 3种类型.
那么对于 A ,灾难发生....修改程序的成本不比重新做一个少.
对于B 需要去100个调用的地方多加一个if来判断,然后多加一个对应小灵通的函数. 修改量有点大,不过也不是不行,因为毕竟现在的工具发达,你可以查找--替换.
不过程序是需要测试的,你替换一个地方,就需要多测试一个地方,成本高.
对于C 多加一个实现 接口的 "小灵通" 类 , 然后修改 "手机工厂"的 "获取接受者(st***号码)". 一共2处,测试也只要再测试 这个新类 还有一个方法.

C 方法 面向对象的优势在这个时候体现出来了.

有人这个时候出来*了,如果程序写的多了,经验丰富了,有人会看出我上面那些假设的漏洞,就是B 并不是的结构化方法, 因为 其实有更好的用一个函数来实现判断类型
那样就跟 C 一样,只要改很少的地方了.
没错, 那样C和B又公平平等了,C还是没什么优势. 请注意2点 第一: "面向对象" 不是指 面向对象 的 编程语法, 而是一种思想. 那样写其实 B 已经拿到了一点面向对象的思想了
只是封装在非面向对象的语法中. 第二 不面向对象的确可以写出低耦合的,高效的,可维护的,很牛逼的程序. 但是那是需要很高造诣的人来做的事. 因为没有类的封装性,名字空间的隔绝

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 软件设计师面向对象知识点:思考面向对象是什么?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情