一種軟體模塊間的通信方法和系統與流程
2023-09-09 16:16:50 2
本發明涉及軟體事件管理技術領域,更具體地,涉及一種軟體模塊間的通信方法及方法。
背景技術:
軟體工程中所指的耦合是指兩個或兩個以上的軟體模塊或線程的輸入與輸出之間存在緊密配合與相互影響,並通過相互作用從一側向另一側傳輸能量的現象。
現有技術在軟體開發中,各作業系統都存在沒有有提供成熟的技術供其中各個功能模塊間進行直接通信的問題;例如:在android的開發過程中通常會使用多個fragment來對界面元素來進行展示,但fragment件不能實現直接通信。原生系統通常是通過兩個需要發生通信模塊外的其他模塊的中轉才能實現通信,造成操作耗時且高內聚的技術問題。
現有技術為了解決各作業系統中各功能模塊間不能直接通信的問題都採用了調用原系統中現有函數來實現。但是現有解決上述問題的技術方案容易造成各模塊間的高耦合的問題。
所以,現有技術中亟需實現軟體中各獨立功能模塊間低耦合高內聚的通信方法。
技術實現要素:
本發明為克服上述問題或者至少部分地解決上述問題,提供一種軟體模塊間的通信方法及系統。
根據本發明的一個方面,提供一種軟體模塊間的通信方法,包括:
步驟1,獲取第一模塊的事件發送請求中所包含的標識hash值;
步驟2,利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;
步驟3,利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
進一步,所述步驟1還包括:利用定義為全局單例模式類的事件發送函數,確認第一模塊的事件發送請求所包含的事件是否存在於系統訂閱事件集合中。
進一步,所述步驟1前還包括:在軟體中各模塊接口函數的參數中添加與所述軟體中各模塊訂閱的各事件相對應的標識hash值。
進一步,所述各模塊接口函數通過標識前綴開頭且所述函數的參數包含至少一個事件。
進一步,所述全局單例模式類的事件發送函數以靜態格式存儲在內存中。
進一步,所述步驟2中調用所述第一模塊外其他模塊的接口函數中包含所述hash值的事件並發送的步驟進一步包括:在java中利用invoke方法,將所述第一模塊外其他模塊的接口函數中包含所述hash值的事件,發送給各包含所述hash值的事件所對應的模塊。
進一步,所述步驟1前還包括:
步驟0,基於系統中各訂閱事件的唯一標識,將當前軟體中各模塊中的訂閱事件關聯保存在訂閱事件集合中。
進一步,所述步驟0還包括:將所述訂閱事件集合靜態存儲在內存中。
進一步,所述步驟0還包括:將所述訂閱事件集合為map集合。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,包括請求獲取模塊、函數獲取模塊和事件發送模塊:
所述請求獲取模塊,用於獲取第一模塊的事件發送請求中所包含的標識hash值;
所述函數獲取模塊,用於利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;
所述事件發送模塊,用於利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
本申請提出一種軟體模塊間的通信方法,本發明所述方案具有如下有益效果:1、有效的實現了軟體作業系統中不能進行直接通信的各模塊的直接交互;2、降低了作業系統中各軟體模塊直接通信所造成的耦合。
附圖說明
圖1為根據本發明實施例一種軟體模塊間的通信方法的整體流程示意圖;
圖2為根據本發明實施例一種軟體模塊間的通信系統的整體框架示意圖;
圖3為根據本發明實施例一種軟體模塊間的通信方法的裝置的結構示意圖。
具體實施方式
下面結合附圖和實施例,對本發明的具體實施方式作進一步詳細描述。以下實施例用於說明本發明,但不用來限制本發明的範圍。
本具體實施例所指軟體模塊,是指在程序設計中,能夠單獨命名、獨立編譯且獨立地完成一定功能的程序語句的集合,包括程序代碼和數據結構。
在軟體設計過程中,通過會對軟體進行模塊化設計和劃分。所謂軟體的模塊化設計和劃分,是指在軟體設計過程中,為了能夠對系統開發流程進行管理,保證系統的穩定性以及後期的可維護性,從而對軟體開發按照一定的準則進行模塊的劃分。根據模塊來進行系統開發,可提高系統的開發進度,明確係統的需求,保證系統的穩定性。所述事件是指計算機領域的事件驅動。
如圖1,示出本發明一個具體實施例中一種軟體模塊間的通信方法的整體流程示意圖。總體上,包括:
步驟1,獲取第一模塊的事件發送請求中所包含的標識hash值;
步驟2,利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;
步驟3,利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
在本發明該具體實施例中,為了方便開發者全局方便的調用事件發送方法,將事件發送方法抽象成一個單例類。一個單例類全局有且僅有一個實例,這樣就可以確保整個系統只有一個投遞事件的實例存在。所設計的事件發送方法利用所在系統中的事件傳遞函數來進行事件的發送。本具體實施例設計的巧妙的地方就是對事件的發送主要是靠事件本身的標識hash值來進行區分(hash值可以理解為一個類的唯一標示符)。也就是發送方和接收方不需要建立任何耦合關係,我們事件發送系統會根據事件的hash值與訂閱者(訂閱模塊)訂閱的hash值進行匹配,如果匹配上了就會將事件發送到訂閱者(訂閱模塊)中去。本具體實施例所述方法在解決各模塊直接通信基礎上,還能夠實現能夠實現高耦合低內聚的有益效果。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述步驟1還包括:利用定義為全局單例模式類的事件發送函數,確認第一模塊的事件發送請求所包含的事件是否存在於系統訂閱事件集合中。
在本發明該具體實施例中,所述步驟1還包括:利用定義為全局單例模式類的事件發送函數,確認第一模塊的事件發送請求所包含的事件是否存在於系統訂閱事件集合中。本具體實施例中使用了一個集合列表用來維護當前系統中的所有訂閱事件。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述步驟1前還包括:在軟體中各模塊接口函數的參數中添加與所述軟體中各模塊訂閱的各事件相對應的標識hash值。
在本發明該具體實施例中,提供了一種軟體模塊間的通信方法,所述各模塊接口函數通過標識前綴開頭且所述函數的參數包含至少一個事件。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述全局單例模式類的事件發送函數以靜態格式存儲在內存中。
在本發明該具體實施例中,單例模式類由於本身是靜態的所以也是存儲在靜態區中,這樣就能夠方便其他類方便的進行獲取。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述步驟2中調用所述第一模塊外其他模塊的接口函數中包含所述hash值的事件並發送的步驟進一步包括:在java中利用invoke方法,將所述第一模塊外其他模塊的接口函數中包含所述hash值的事件,發送給各包含所述hash值的事件所對應的模塊。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述步驟1前還包括:
步驟0,基於系統中各訂閱事件的唯一標識,將當前軟體中各模塊中的訂閱事件關聯保存在訂閱事件集合中。
在本發明該具體實施例中,本方案設計的事件訂閱過程為了解耦沒有直接使用集合中的add方法來添加訂閱事件因為直接add會導致兩者之間的強耦合關係對不利於後期軟體的維護和擴展。為了能夠將事件註冊到集合中我們對需要註冊的事件添加一個自定義的標籤,有了這個標籤後我們後續可以通過反射的方式來解析所述自定義標籤,從而來找到需要訂閱的事件,然後將該事件存放到map集合中。通過上述方案的實施就能夠通過低耦合的方式將訂閱事件集成到map集合中去了。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述步驟0還包括:將所述訂閱事件集合靜態存儲在內存中。
在本發明該具體實施例中,本方案設計中為了使訂閱集合不被系統垃圾回收器進行回收,我們將本map集合設計成為靜態的,在申明集合的時候我們需要使用static來進行標記。被申明為靜態的集合虛擬機會將其保存到靜態區中,靜態區內存中的數據在整個應用的申明周期中是不會被銷毀的。
在本發明另一個具體實施例中,一種軟體模塊間的通信方法,所述步驟0還包括:將所述訂閱事件集合為map集合。集合列表我們使用的是map集合,使用map集合能夠提高後續對接收端的事件查詢效率。
在本發明另一個具體實施例中,給出一種軟體模塊間的通信方法的詳細實施例,本具體實施例就android軟體中fragment間的通信進行說明。
本方案為了解決上述問題特別設計了一套協助fragment之間通信的一套方法,通過本方案的實施能夠高效的在深層次之間的fragment通信,同時解決了fragment之間通信時高耦合的技術問題。
本方案的設計重點分為下面幾個部分來進行介紹。
整體設計本實施例將按照四個大的方面來進行陳述:接收端對接收事件的訂閱、事件發送、反射方式進行事件分發和事件接收。
1、接收端對接收事件的訂閱:
本步驟重點在於描述接收端如何將接收事件訂閱到本實施例的分發系統的。本方案中使用了一個集合列表用來維護當前系統中的所有訂閱事件。集合列表本實施例使用的是map集合,使用map集合能夠提高後續對接收端的事件查詢效率。
本方案設計中為了使訂閱集合不被系統垃圾回收器進行回收,本實施例將本map集合設計成為靜態的,在申明集合的時候本實施例需要使用static來進行標記。被申明為靜態的集合虛擬機會將其保存到靜態區中,靜態區內存中的數據在整個應用的申明周期中是不會被銷毀的。
本方案設計的事件訂閱過程為了解耦沒有直接使用集合中的add方法來添加訂閱事件因為直接add會導致兩者之間的強耦合關係對不利於後期軟體的維護和擴展。為了能夠將事件註冊到集合中本實施例對需要註冊的事件添加一個自定義的標籤@registertarget,有了這個標籤後本實施例後續可以通過反射的方式來解析@registertarget從而來找到需要訂閱的事件,然後將該事件存放到map集合中。
通過上述方案的實施本實施例就能夠通過低耦合的方式將訂閱事件集成到map集合中去了。
2、事件發送:
為了方便開發者全局方便的調用事件發送方法,本實施例將事件發送方法抽象成一個單例類。一個單例類全局有且僅有一個實例,這樣就可以確保整個系統只有一個投遞事件的實例存在。單例類由於本身是靜態的所以也是存儲在靜態區中,這樣就能夠方便其他類方便的進行獲取。
本實施例所設計的事件發送方法函數非常簡單就是post(event)來進行事件發送。本方案設計的比較巧妙的地方就是對事件的發送主要是靠event本身的hash值來進行區分(hash值可以理解為一個類的唯一標示符)。也就是發送方和接收方不需要建立任何耦合關係,本實施例事件發送系統會根據event的hash值與訂閱者訂閱的hash值進行匹配,如果匹配上了就會將事件發送到訂閱者中去。
通過上述介紹,本步驟主要是為了方便事件的發送所以設計成單例來獲取事件的發送實例然後使用post方法來將事件分發出去。
3、反射方式進行事件分發:
為了解耦事件發送、事件接收和事件分發總線之間的關聯性,本方案對事件的分發使用了反射的方式來進行實施。
解耦事件總線和事件訂閱之間的關係是通過反射方式來查找訂閱事件並將訂閱事件保存到map總線上。
具體是通過調用虛擬機提供的class.forname的方式來加載某一個類,加載一個類後系統會返回一個class對象a,然後本實施例通過調用a對象中的getmethod函數來反射出具體的訂閱方法,然後通過invoke來執行反射的方法。這樣本實施例就可以將訂閱事件保存到map總線中了。這樣就通過低耦合的方式保存了事件的訂閱到map總線中。事件map中對事件的保存時通過鍵值對來進行保存的,本實施例在對訂閱事件的保存的時候將鍵設置為事件的hash值,值設置為事件對象本身。這樣後期本實施例來對事件分發的時候就能夠通過hash值來快速查詢事件對象了。
當一個事件發送到事件總線上的時候本實施例首先通過gethash方法得到事件的hash值,然後拿到該hash值在map集合中查詢是否存在該hash值的事件。如果查詢到該事件說明本實施例有訂閱者訂閱過該事件,此時本實施例就需要找到訂閱者的具體位置。
為了方便本實施例查詢訂閱者的具體位置本實施例規定事件訂閱者的接收函數一定是以receiveevent前綴開頭的函數並且參數就是事件本身的一個函數。
這樣本實施例來對事件進行分發的時候本實施例可以通過class.forname的方式來加載某一個類,然後調用getmethods方法來獲取這個類中的所有方法集。然後再對該方法集進行遍歷判斷每一個方法是否以receiveevent開頭如果是的說明該方法就是本實施例的訂閱事件。然後再通過調用getparam方法來判定該方法的參數,獲取到參數後再通過調用gethash來得帶該參數的hash值。本實施例再進一步判定該hash值是不是和本實施例事件的hash值一致,如果是一致的說明這個函數就是本實施例需要分發到事件的函數對象了。
本實施例就可以通過反射中的invoke方法來反射的方式調用該函數同時將事件傳遞到該函數中。這樣就完成了一次事件的分發過程。
本實施例在通過上述所述的反射方式來調用事件的接收函數,將最終的事件分發到接收端。(事件的訂閱和分發均使用反射的方式來實現),這樣就完美的解決了之間的耦合關係。
4、事件接收:
事件的接收由於和事件分發總想是隔離的所以本實施例對事件接收這段進行了硬性規定必須以receiveevent的前綴開頭並且該函數的參數必須是一個event事件。這樣後期本實施例才能夠通過上述所述的方法找到事件接收的地方然後將事件分發到該處來。
也就是通過我麼自定義的規則來建立起之間的聯繫的,這樣處理的好處是能夠解耦事件分發和接受之間的耦合關係。這樣就能夠提高軟體系統的擴展和維護性。
本具體實施例設計了一套低耦合的事件訂閱和發送方法,通過使用本方案所述的方法能夠有效的解決深層級fragment之間的消息通信的問題。避免了傳統通信中需要多層級傳遞的問題,通過反射有效的解耦之間的耦合關係使得整個系統具有更強的擴展性和可維護性。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,包括請求獲取模塊a1、函數獲取模塊a2和事件發送模塊a3:
所述請求獲取模塊a1,用於獲取第一模塊的事件發送請求中所包含的標識hash值;
所述函數獲取模塊a2,用於利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;
所述事件發送模塊a3,用於利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,所述請求獲取模塊還用於:利用定義為全局單例模式類的事件發送函數,確認第一模塊的事件發送請求所包含的事件是否存在於系統訂閱事件集合中。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,還包括hash模塊,用於在軟體中各模塊接口函數的參數中添加與所述軟體中各模塊訂閱的各事件相對應的標識hash值。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,所述各模塊接口函數通過標識前綴開頭且所述函數的參數包含至少一個事件。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,所述全局單例模式類的事件發送函數以靜態格式存儲在內存中。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,所述函數獲取模塊還用於:在java中利用invoke方法,將所述第一模塊外其他模塊的接口函數中包含所述hash值的事件,發送給各包含所述hash值的事件所對應的模塊。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,還包括訂閱模塊,用於將所述訂閱事件集合靜態存儲在內存中。
在本發明另一個具體實施例中,一種軟體模塊間的通信系統,將所述訂閱事件集合為map集合。
圖3是示出本申請實施例的利用上述所有實施例中所述的軟體模塊間的通信方法的設備的結構框圖。
參照圖3,所述wdm-fso網絡節點資源共享方法的測試設備,包括:處理器(processor)301、存儲器(memory)302、通信接口(communicationsinterface)303和總線304;
其中,
所述處理器301、存儲器302、通信接口303通過所述總線304完成相互間的通信;
所述通信接口303用於該測試設備與軟體模塊間的事件路由的通信設備之間的信息傳輸;
所述處理器301用於調用所述存儲器302中的程序指令,以執行上述各方法實施例所提供的方法,例如包括:步驟1,獲取第一模塊的事件發送請求中所包含的標識hash值;步驟2,利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;步驟3,利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
本實施例公開一種電腦程式產品,所述電腦程式產品包括存儲在非暫態計算機可讀存儲介質上的電腦程式,所述電腦程式包括程序指令,當所述程序指令被計算機執行時,計算機能夠執行上述各方法實施例所提供的方法,例如包括:步驟1,獲取第一模塊的事件發送請求中所包含的標識hash值;步驟2,利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;步驟3,利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
本實施例提供一種非暫態計算機可讀存儲介質,所述非暫態計算機可讀存儲介質存儲計算機指令,所述計算機指令使所述計算機執行上述各方法實施例所提供的方法,例如包括:步驟1,獲取第一模塊的事件發送請求中所包含的標識hash值;步驟2,利用定義為全局單例模式類的事件發送函數,獲取所述第一模塊外其他模塊的接口函數,獲取包含所述標識hash值的接口函數;步驟3,利用定義為全局單例模式類的事件發送函數,將所述第一模塊的事件發送請求中所包含的事件發送給包含所述標識hash值的接口函數所在的模塊。
本領域普通技術人員可以理解:實現上述方法實施例的全部或部分步驟可以通過程序指令相關的硬體來完成,前述的程序可以存儲於一計算機可讀取存儲介質中,該程序在執行時,執行包括上述方法實施例的步驟;而前述的存儲介質包括:rom、ram、磁碟或者光碟等各種可以存儲程序代碼的介質。
以上所描述的軟體模塊間的通信方法的設備等實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部模塊來實現本實施例方案的目的。本領域普通技術人員在不付出創造性的勞動的情況下,即可以理解並實施。
通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到各實施方式可藉助軟體加必需的通用硬體平臺的方式來實現,當然也可以通過硬體。基於這樣的理解,上述技術方案本質上或者說對現有技術做出貢獻的部分可以以軟體產品的形式體現出來,該計算機軟體產品可以存儲在計算機可讀存儲介質中,如rom/ram、磁碟、光碟等,包括若干指令用以使得一臺計算機設備(可以是個人計算機,伺服器,或者網絡設備等)執行各個實施例或者實施例的某些部分所述的方法。
最後,本申請的方法僅為較佳的實施方案,並非用於限定本發明的保護範圍。凡在本發明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發明的保護範圍之內。