为什么要解耦呢?
举个例子:
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、 各个类能够同时开发