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