定義:一個對象應該對其他對象保持最少的了解。
問題由來:類與類之間的關係越來越密切,耦合度越來越大,當一個類發生改變時,對另外一個類的影響也越大.
解決方案:盡量降低類與類之間的耦合.
自從我們接觸到編程開始,就知道了軟件設計的總的原則,低耦合,高內聚,無論是面向對像或者面向過程,耦合度盡量低,才能提高代碼的複用率。但是編程怎麼編程低耦合呢?
無論邏輯怎麼複雜,對於依賴的類來說,都盡量將邏輯封裝在類的內部,對外除了提供的public方法,不對外洩露任何信息。還有一個更加簡單的定義:只與直接的朋友通信。首先解釋一下什麼是直接的朋友;每個對像都會與其他對象發生耦合關係,我們就說這兩個對象之間有耦合關係,我們就說這兩個對像有朋友關係,耦合發生的方式有很多,依賴,關聯,組合,聚合等等。其中,我們稱出現成員變量,方法參數,方法返回值的類稱為直接的朋友,而出現在局部變量中的類為不是直接的朋友,也就是說,陌生的類最好不要作為局部變量的形式出現在類的內部;
舉一個例子,在一所學校,裡面有老師若干名,依次編號。下面有學生若干名,一次編號。現在要求打印出所有的老師和學生的ID.
先來違反低耦合高內聚原則
代碼如下。
package test1;import java.util.ArrayList;import java.util.List;class Teacher{privateString id;publicvoidsetId(String id) {this.id=id;}publicString getId() {return id;}}class Student{private String id;public void setId(String id) {this.id=id;}public String getId() {return id;}}class StudentManage{publicList<Student> getAllStudent() {List<Student> list=newArrayList<Student>();for (int i=0;i<100;i++) {Student student=new Student();student.setId("學生學號是"+i);list.add(student);}return list;}}class TeacherManage{publicList<Teacher> getAllTeacher() {List<Teacher> list=newArrayList<Teacher>();for (inti=0;i<100;i++) {Teacher teacher =new Teacher();teacher.setId("老師編號"+i);list.add(teacher);}return list;}public void printAllPerson(StudentManagestudentmanager) {List<Student>list1=studentmanager.getAllStudent();for (Student s:list1) {System.out.println(s.getId());}List<Teacher>list2=this.getAllTeacher();for (Teacher t:list2) {System.out.println(t.getId());}}} public classClient {publicstaticvoidmain(String[] args) {TeacherManagetm=newTeacherManage();tm.printAllPerson(new StudentManage());}}現在這個設計的主要問題出現在TeacherManage類中,根據低耦合高內聚法則,只與直接的朋友進行通信,而Student類並不是TeacherManage類中的直接朋友,應避免類中出現這樣非直接朋友關係的耦合。
修改之後代碼如下:
package test2;import java.util.ArrayList;import java.util.List;class Teacher{privateString id;publicvoidsetId(String id) {this.id=id;}publicString getId() {return id;}}class Student{private String id;public void setId(String id) {this.id=id;}public String getId() {return id;}}class StudentManage{publicList<Student> getAllStudent() {List<Student> list=newArrayList<Student>();for (int i=0;i<100;i++) {Student student=new Student();student.setId("學生學號是"+i);list.add(student);}return list;}public void printAllStudent() {List<Student>list1=this.getAllStudent();for (Student s:list1) {System.out.println(s.getId());}}}class TeacherManage{publicList<Teacher> getAllTeacher() {List<Teacher> list=newArrayList<Teacher>();for (inti=0;i<100;i++) {Teacher teacher =new Teacher();teacher.setId("老師編號"+i);list.add(teacher);}return list;}publicvoidprintAllTeacher() {List<Teacher> list2=this.getAllTeacher();for (Teacher t:list2) {System.out.println(t.getId());}}}public classClient {publicstaticvoidmain(String[] args) {TeacherManagetm=newTeacherManage();tm.printAllTeacher();StudentManagesm=newStudentManage();sm.printAllStudent();}}修改後,學生新增加了學生ID的方法,老師直接來調用即可。從而避免了與學生髮生耦合。低耦合高內聚原則的初衷是降低了類之間的耦合,由於每個類減少了不必要的依賴,因此的確可以降低耦合關係,但是凡事有個度,雖然可以避免與非直接的類通信,但是要通信,必然會通過一個“中介”來發生關係。採用此法則可以做到結構清晰,高內聚低耦合、
耦合性與內聚性是模塊獨立性的兩個定性標準,將軟件系統劃分模塊時,盡量做到高內聚低耦合,提高模塊的獨立性,為設計高質量的軟件結構奠定基礎。
有個例子很容易明白:一個程序有50個函數,這個程序執行得非常好;然而一旦你修改其中一個函數,其他49個函數都需要做修改,這就是高耦合的後果。
總結
以上就是本文關於高內聚低耦合法則實例代碼解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!