面向对象的php之类解耦的好处
2015-10-06 15:25
686 查看
为什么要解耦呢?
举个例子:
getScore($student){
}
假如一个课程类,里面有一个获取学生分数的的方法getScore()。该方法要求传入一学号。
在这个方法中,就跟学生类student耦合了。
因为在getScore方法中,需要$student->getNum();
假如现在学生类被类作者改变了,取消了getNum()这个方法,那么你这个方法,就需要重新写了。
当开发人员只有很少人时,这个耦合带来的影响是比较小的,因为我们大概都知道在哪里用了,改起来也不麻烦。
但是当项目比较大,开发人员多起来的时候,改动一个,几乎就需要改动很多类了。
解耦比较好的方法,就是需要什么,就要求什么:
getScore($StudentId){
}
这样,当学生类变动的时候,就不需要担心自己的类需要改变了。
这里有出现了几个问题:
1、 学生类不符合开闭原则,如果学生类符合开闭原则,那么我们这个耦合关系也没问题。
需求是经常变更的,在开发项目过程中,完全做到开闭原则是不可能的。很多项目在开发过程中,也是需要不断地重构。
2、 如果所有类都解耦,那么是否是一个类修改了,那么其他地方都无需改变了呢?
有些改动是不影响其他地方,比如getNum()方法里面加了一个判断,这样只是更改了这个方法,在地方来说,依然调用的是getNum(),所以是不会改变的。
但是很多时候,其他地方也是需要改动的。不过这个时候,改动的,只是场景方法中而已。比如现在删除了学生类中的getNum()方法。在getScore($StudentId)里面就无需改变的。但是在场景中,还需要改变获取学号的方法,然后再传进去这个getScore中。
3、 像上面的getScore方法,如果在方法里面修改获取学号,也只需要修改一次,但是如果解耦的话,就需要所有场景都需要修改。
的确是这样的。但是如果类能够解耦的话,这个类的开发人员无需了解另外一个类具体功能功能是什么。当有多个人同时开发的时候,两个类就能并行开发,而无需担心需要哪个类先开发完才能继续开发下一个类。
在像c++,java语言中,类解耦能够使类不需要再重编译。要知道,中大型项目编译起来,往往是几个小时(甚至是几天)。所以类解耦,能够让类无需重编译,减少编译时间。
综合起来就有以下优点:
1、 在c++,java这种语言中,能够减少编译时间
2、 各个类能够同时开发
举个例子:
getScore($student){
}
假如一个课程类,里面有一个获取学生分数的的方法getScore()。该方法要求传入一学号。
在这个方法中,就跟学生类student耦合了。
因为在getScore方法中,需要$student->getNum();
假如现在学生类被类作者改变了,取消了getNum()这个方法,那么你这个方法,就需要重新写了。
当开发人员只有很少人时,这个耦合带来的影响是比较小的,因为我们大概都知道在哪里用了,改起来也不麻烦。
但是当项目比较大,开发人员多起来的时候,改动一个,几乎就需要改动很多类了。
解耦比较好的方法,就是需要什么,就要求什么:
getScore($StudentId){
}
这样,当学生类变动的时候,就不需要担心自己的类需要改变了。
这里有出现了几个问题:
1、 学生类不符合开闭原则,如果学生类符合开闭原则,那么我们这个耦合关系也没问题。
需求是经常变更的,在开发项目过程中,完全做到开闭原则是不可能的。很多项目在开发过程中,也是需要不断地重构。
2、 如果所有类都解耦,那么是否是一个类修改了,那么其他地方都无需改变了呢?
有些改动是不影响其他地方,比如getNum()方法里面加了一个判断,这样只是更改了这个方法,在地方来说,依然调用的是getNum(),所以是不会改变的。
但是很多时候,其他地方也是需要改动的。不过这个时候,改动的,只是场景方法中而已。比如现在删除了学生类中的getNum()方法。在getScore($StudentId)里面就无需改变的。但是在场景中,还需要改变获取学号的方法,然后再传进去这个getScore中。
3、 像上面的getScore方法,如果在方法里面修改获取学号,也只需要修改一次,但是如果解耦的话,就需要所有场景都需要修改。
的确是这样的。但是如果类能够解耦的话,这个类的开发人员无需了解另外一个类具体功能功能是什么。当有多个人同时开发的时候,两个类就能并行开发,而无需担心需要哪个类先开发完才能继续开发下一个类。
在像c++,java语言中,类解耦能够使类不需要再重编译。要知道,中大型项目编译起来,往往是几个小时(甚至是几天)。所以类解耦,能够让类无需重编译,减少编译时间。
综合起来就有以下优点:
1、 在c++,java这种语言中,能够减少编译时间
2、 各个类能够同时开发
相关文章推荐
- Zend Guard Run-time support missing问题的解决
- phpexcel 的摘录
- Thinkphp 模块设置 及应用目录修改
- zend framwork项目基本操作
- Socket学习:模拟FTP软件
- php常用的正则匹配
- thinkphp-关于模板里 IP 地址的引用实例
- PHP数据类型转换(字符转数字,数字转字符)
- thinkphp学习笔记1
- Yii2-保存数据库,获取最后添加的id
- FragmentPagerAdapter和FragmentStatePagerAdapter之间的差别、监听器OnPageChangeListener
- symfony报错:Warning: ob_start(): function ” not found or invalid function name Symfony
- [转]PHP经验——PHPDoc PHP注释的标准文档
- php常用验证函数
- YII1.1源码解读(1)
- php的经典分页
- 验证码生成中"图像因本身错误无法显示的"错误解决办法
- 纯PHP实现定时器任务(Timer)
- PHP setcookie()用法
- DooDigestAuth php(后台)授权管理类 web浏览器授权