摘要:系統中循環引用系統中存在循環引用的壞處從直觀上來看類中耦合了類從程序的角度上看假如類的方法做了修改就會導致類的做出相應的修改并且還會導致一系列調用的方法也改變另一方便如果類的做出修改也會導致類產生相同的副作用是否可以避免循環引用的出現層本身
系統中循環引用 系統中存在循環引用的壞處
public class A{ private B b; public void methodA(){ //dosomthing b.methodA(); //dosomthing } public void methodB(){ } } public class B{ private A a; public void methodA(){ } public void methodB(){ //dosomthing a.methodB(); //dosomthing } }
從直觀上來看,類A中耦合了類B,從程序的角度上看,假如類A的methodB()方法做了修改,就會導致類B的methodB做出相應的修改, 并且還會導致一系列調用B.methodB()的方法也改變;另一方便如果類B的methodA()做出修改也會導致類A產生相同的副作用.
是否可以避免循環引用的出現(Service層本身根據不同的業務職責是可以分成多個層,只要確保在同一層里面的Service不會互相引用(也不應該引用),復雜的業務需求應當由更上層的Service提供) 這個思路主要是,同層是不能依賴的,因為存在依賴肯定就會導致相互依賴。如果兩個類存在相互依賴,可以產生一個第三者同事依賴這兩個類來解決兩個類的相互的依賴關系,但是這是一種很理想的情況,實際上如果做到這樣,容易整個系統的抽象層次就會變得無比的多,會加大系統的復雜度
public Class DaoA{ pubic void queryStudent(); } public Class ServiceA{ pubic void queryStudent(){ //dosomething //DaoA.queryStudent(); //dosomething } } public Class DaoB{ pubic void insetStudent(); public void updateStudent(); } public Class ServiceB{ pubic void insetStudent(){ ServiceA.queryStudent(); DaoB.insetStudent(); } pubic void updateStudent(){ //dosomething DaoB.updateStudent(); //dosomething } }
ServiceA是對學生查詢業務的一個抽象,ServiceB是對學生新增業務的一個抽象。并且由于業務要求,在新增學生的時候必須要先查詢學生是否存在,因為ServiceA.queryStudent()里面已經封裝了查詢業務,所以直接調用該方法就行了.但是因為同層之間不能相互引用,所以必須出現第一個第三者,同時修改ServiceB的方法
public Class ServiceB{ pubic void insetStudent(){ DaoB.insetStudent(); } } public Class ServiceC(){ pubic void insetStudent(){ ServiceA.queryStudent(); ServiceB.insetStudent(); } }
所以在service上面又加了一層,必然系統的復雜度就上來了所以我的想法是:同層次是允許相互依賴的
哪一層才允許相互依賴如果出現相互依賴的層次越底層,那么由1引起的副作用對系統的影響就越大。從大的SOA架構上來看的話底層的原子服務是不能相互依賴的,到了上層的組合服務層,是允許相互依賴的;對于某一個原子服務,Dao層是不允許相互依賴的,但是service是允許相互依賴的
后記ServiceA.queryStudent()這一層封裝的由來
ServiceB當然可以不必依賴ServiceA,只需要把ServiceA.queryStudent()里面的方法直接copy一份,直接依賴DaoA.但是如果系統其它地方也需要用到這個queryStudent邏輯,那么它也只能再copy一份,所以為了提高代碼的復用性在ServiceA中抽象一個queryStudent方法(當然不必等到很多場景下需要這一個query邏輯才抽象queryStudent方法,ServiceA本身可以根據自身的業務提前抽象)
合理的抽象層次
和1一樣,當發現很多場景需要同時調用ServiceB.insetStudent和ServiceB.updateStudent方法完成自己的業務,因為在很多時候ServiceB就是一個RPC服務了,所以為了性能考慮,就需要把insetStudent和updateStudent方法統一成一個方法,剛開始這一層模塊內部的組合服務層是很薄的,沒有必要獨立出去,隨著業務場景的增加組合借接口就會慢慢增多,這個時候就可以把這些模塊內部的組合服務多帶帶抽象,它的抽象層次是比原來的service是要高一層,并且可以多帶帶部署和發布
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66000.html
摘要:靜態初始化簡化的語法格式動態初始化動態初始化只指定數組的長度,由系統為每個數組元素指定初始值。也就是說,數組引用變量是訪問堆內存中數組元素的根本方式。 順序結構 程序從上到下逐行地執行,中間沒有任何判斷和跳轉。 分支結構 if條件語句 if語句使用布爾表達式或布爾值作為分支條件來進行分支控制。 第一種形式: if(logic expression) { ...
摘要:所謂的內存泄漏簡單來說是不再用到的內存,沒有及時釋放。如果一個值不再需要了,引用數卻不為,垃圾回收機制無法釋放這塊內存,從而導致內存泄漏。 前言 程序的運行需要內存。只要程序提出要求,操作系統或者運行時就必須供給內存。所謂的內存泄漏簡單來說是不再用到的內存,沒有及時釋放。為了更好避免內存泄漏,我們先介紹Javascript垃圾回收機制。 在C與C++等語言中,開發人員可以直接控制內存的...
摘要:所謂的內存泄漏簡單來說是不再用到的內存,沒有及時釋放。如果一個值不再需要了,引用數卻不為,垃圾回收機制無法釋放這塊內存,從而導致內存泄漏。 前言 程序的運行需要內存。只要程序提出要求,操作系統或者運行時就必須供給內存。所謂的內存泄漏簡單來說是不再用到的內存,沒有及時釋放。為了更好避免內存泄漏,我們先介紹Javascript垃圾回收機制。 在C與C++等語言中,開發人員可以直接控制內存的...
閱讀 3541·2021-11-18 10:02
閱讀 3110·2019-08-29 18:34
閱讀 3398·2019-08-29 17:00
閱讀 431·2019-08-29 12:35
閱讀 758·2019-08-28 18:22
閱讀 1934·2019-08-26 13:58
閱讀 1672·2019-08-26 10:39
閱讀 2678·2019-08-26 10:11