58cms教你认识什么是面向对象
2019-03-10 浏览:229次 作者:成都晨宇网络科技公司
在程序设计中,我们需要用一些标准来区分良好的设计和糟糕的设计。而其中的两种标准——可读性和重复性,相对较容易评估。其他标准,如灵活性和健壮性,则更难明确。我们通过面向过程和面向对象的比较,来讨论程序中的职责、内聚、耦合,最终明白为什么要这么做。
一.面向对象和面向过程
面向对象和传统过程式代码有什么区别呢?很多人认为面向对象就是包含对象,有类。
例如:$person=new
Person()就是面向对象。事实上,这种说法并不准确。如果你注意很多开源系统的源代码,他们宣称自己的代码都是过程化的编码,但里面也有mysql.class.php这种文件或者是$db
=newDB()这样的代码。所以说:虽然你有类文件,有创建对象,但还是过程化的写法。
面向对象和过程化编程的一个核心区别是如何分配职责。过程式编程表现为一系列命令和方法的连续调用。控制代码根据不同的条件执行不同的职责。这种自顶向下的控制方式导致了重复和相互依赖的代码遍布于整个项目。面向对象则将职责从代码中移到专门的对象中,尽量减少相互依赖。
我的CMS内容管理系统,采用的面向对象的机制来开发的,在有些代码以及布局上是dede里面的内容。为什么是面向对象,因为他的开发理念是,Action.class.php
统一了各个业务逻辑规范,Model.class.php统一了各个数据库模型的规范;然后让所有的子类继承,而子类XxxAction.class.php
里面把所有的字段属性,进行了封装;通过不同的参数调用显示不同的效果,实现了多态。所以,面向对象是一种开发理念,而不是项目中是否包含类,包含对象。
下面我们来看一段程序
functionread($_file){
return'正在读取txt文件!';
}
functionwrite($_file){
return'正在写入txt文件';
}
$_file='txt';
echowrite($_file);
echoread($_file);
这段代码的是用过程化的形式编写出来,通过两个函数来操作文件,一个是写入文件的函数,一个是读取文件的函数。如果需求发生改变,现在需要操作.xml
文件,那么两个函数就需要一定量的修改。代码如下:
functionread($_file){
第2页共43页
if($_file=='xml'){
return'正在读取xml文件!';
}else{
return'正在读取txt文件!';
}
}
functionwrite($_file){
if($_file=='xml'){
return'正在写入xml文件';
}else{
return'正在写入txt文件';
}
}
$_file='txt';
echowrite($_file);
echoread($_file);
从改写的代码中,我们会发现一些问题:
1.代码需求变多的情况,if条件会异常多,导致代码维护性非常差。
2.在检查xml或者txt后缀的判断上,两个函数做了重复的操作,导致代码冗余。
3.总上所述,代码阅读、维护和扩展都会变的异常艰难。
下面采用面向对象的方式,来构建这个例子:
abstractclassHandler{
protected$_file;
protected$_content;
staticfunctiongetInstance($_file){
if($_file=='xml'){
returnnewXmlHandler();
}else{
returnnewTxtHandler();
}
}
abstractpublicfunctionwrite();
abstractpublicfunctionread();
}
classXmlHandler{
publicfunctionwrite(){
return'正在写入xml文件';
}
publicfunctionread(){
return'正在读取xml文件!';
}
}
classTxtHandler{
publicfunctionwrite(){
return'正在写入txt文件';
}
publicfunctionread(){
return'正在读取txt文件!';
}
}
$_handler=Handler::getInstance('xml');
echo$_handler->write();
echo$_handler->read();
二.面向对象的规范
1.职责
过程化的编码,控制代码的职责是判断文件格式,它判断两次不是一次。面向对象的编码,父类的职责是提供规范,判断格式也只有一次,并且不考虑细节。
2.内聚
内聚是一个模块内部各成分之间相关程度的度量。如果组件职责清晰、分工明确,那么代码较为好维护;如果代码之间关联太广,则维护性较差。(因为你想修改某部分代码的同时,要修改相关代码)。过程化的编码,xml
文件格式判断是分开在两个函数里判断,导致修改时要同时修改,这是低内聚。面向对象的编码,xml
文件格式判断是只在父类的静态方法里,修改一个地方即可,这是高内聚。
3.耦合
当系统各部分代码紧密绑在一起时,就会产生紧密耦合。高耦合使代码扩展和维护异常艰难,而低耦合基本都是分开的功能模块,维护和扩展都非常方便。过程化的编码,xml
处理分别包含在读和写两个函数中,也就是说,两个函数是紧密相连的,修改的时候,要同时修改,增加新文件判断,要同时新增,那么它就是高耦合。面向对象的编码,xml
处理只放在xml类中,没有和其他类相紧密结合,那么它就是低耦合。
4.设计的四个方向标
没有人能在设计的时候绝对正确。大部分人都要不停地修改代码,因为需求可能发生变化,或者我们加深了对问题的认识。修改代码的时候很容易失去控制。这里加个方法,那里加个类。导致代码和项目结构越发的混乱。
(1).代码重复:如果有,请放到父类或者公共类,合并到一起。
(2).类处理的太多:每个类最好保持独立性,能够尽量单独抽取出来还能使用。
(3).万能类:如果一个类把所有工作都做了,那么请分离,分出父类和子类,父类做规范,子类做实现。
(4).条件语句:如果发现一个类中,条件语句使用太过频繁,特别是同一种条件判断在多个方法中同时出现,那么就说明这个类需要拆分成两个或者更多。
注:成都晨宇网络科技公司自由网络,专业提供网站推广服务,有需要咨询欢迎联系我们在线客服。