記一次意外的技術討論收穫—策略模式

最近公司有和第三方合作的項目,於是想到了使用策略模式去實現,到時候有別的第三方來走他自己的策略去完成相關的業務流程就行了。

gitHub地址: http://t.cn/RDO9luX

1)類加載的問題--命名空間

但是我們在做的過程中遇到的第一個問題就是命名空間的問題,因為公司老的框架是不支持也沒有使用命名空間的,我仿照之前的一個業務實現的策略,在一個php文件中有多個類文件,但是使用了php的命名空間之後,外部就調用不到這些類了,否則是多個類,命名多個命名空間,但是因為新框架使用的自動加載是默認文件名和類名是一致的,否則也是不好加載進來。於是想到了拆分類,將基類BaceStrategyClass,BaceCooperationClass,接口Interface,和工廠類ClassFactory放到了一個文件ClassFactory.php中,將與第三方進行連接交互的類Cooperation放到了一個文件xxxCooperatioin.php中,還有一個這次合作的策略類XXXStrategy 放到了一個文件XXXStrategy.php中,這樣就解決了類加載的問題。

記一次意外的技術討論收穫—策略模式

01 測試腳本test.php

2)公司內部外系統的訪問—層級調用

我們遇到了第二個問題就是我們這個系統需要公司其他系統,比如用戶系統的數據,但是新框架定義與公司外系統的交互,都在service層完成,領域層domian中只完成與自己系統業務相關的內容,所以為了符合層級調用和符合規範,就將這些domian中的策略整體進行了遷移,重新定義了命名空間,也修改了相關地方的調用的命名空間類use引用。

記一次意外的技術討論收穫—策略模式

02 02 工廠基類 FacultyClass.php

3)必須走工廠方法—唯一入口,封裝性

然後我們遇到的第三個問題是,之前都是通過工廠方法的構造方法,將策略類的實例作為其屬性,使用 (new classFaculty(‘xxx’))->strategyClass 得到策略實例,然後這個策略實例裡,可以調用 xxxCooperatioin類中的相關方法,這個是可以走通的,但是如果我只是想測試 xxxCooperatioin類中的方法,就不行,包括測試xxxStrategy類中的方法都是不行的,都分別報 不存在其 基類 BaceCooperationClass 和BaceStrategyClass不存在,這個就比較尷尬了,百思不得其解,我和瀟同學“抓耳撓腮”,再仔細看看 三個文件 ClassFactory.php , xxxCooperatioin.php 和 XXXStrategy.php, 終於發現原來走工廠那種訪問的時候,ClassFactory.php 中已經包含了 xxxCooperatioin 類和xxxStrategy類所需要的基類了,所以一路走下來,是可以加載各個類的,但是如果是 直接外部測試腳本調用 xxxCooperatioin類 和xxxStrategy類是不行的,因為他們的基類在 ClassFactory.php中,而你又無法使用命名空間將其加載進來(因為BaceCooperationClass 和BaceStrategyClass 和文件ClassFactory.php的文件名不一樣,無法加載),這樣就強制外部必須走工廠ClassFactory類 來訪問到 xxxCooperatioin類,和xxxStrategy類,這樣就提高了安全性,實現了封裝性。

記一次意外的技術討論收穫—策略模式

03 具體策略類 XXXStrategy

4)構造方法返回的永遠是自己—走單例模式吧

還有就是看走工廠方法 (new classFaculty(‘xxx’))->strategyClass 得到策略實例,實際上我們直接new classFaculty類的時候,在構造中直接return strategyClass 不就直接得到這個策略類示例了嗎,不需要在多一層屬性的指向調用,後來發現我們在構造裡error_log輸出的好好的,strategyClass 就是xxxStrategy的示例,但是走完工廠的構造方法返回的還是 工廠 classFaculty的實例,後來仔細一思考,才發現其實 構造方法永遠返回的是類自己的實例,而不管你在 構造方法裡return 返回的是什麼。

記一次意外的技術討論收穫—策略模式

04 交互類XXXCooperation

我們實際上也只是想走單例模式,不用重複實例化類,沒想到發現構造中返回不了策略類的實例,於是在工廠類classFaculty中寫了一個 getStrategyInstance的一個靜態方法,在那裡實現單例模式,並返回了這策略類的實例。惠同學說還有就是這個策略類的實例的一個屬性cooperation就是 xxxCooperatioin類的一個實例。這樣就能拿到 策略類在腳本里做一些測試,也能拿到xxxCooperatioin類的一些方法做測試,避免直接 去實例化這兩個類時,報他們的基類不存在的尷尬問題。

記一次意外的技術討論收穫—策略模式

05 自動加載類的函數

至此,我們的這一次的技術討論完美結束了,瀟同學和惠同學和我都露出了欣慰的笑容,雖然已經是晚上11點多了,但是能有這樣自發的深入的細緻的卓有成效的討論還是很值得的,哪怕將來我們各奔東西了,但是一想到那天晚上我們的這次有意義的,精彩的技術探究之旅,便會覺得格外親切,技術在我們看來也變得熠熠生輝起來。

雖然在大神或者外人看來我們的這次討論一般般或者是我們應該早掌握的東西,但是畢竟我們整日在位實現業務需求去並行著,加班加點完成業務的需求,鮮有時間仔細認真去思考這技術其中的細節,也就無法體會到思考技術,形成“心流”,最終解決問題,有所收穫和提高的那種樂趣了,如果我們能每天或者每週多一些這樣的討論和收穫,那我們的技術水平的提高就指日可待了。

記一次意外的技術討論收穫—策略模式

程序猿的友誼

可以,可以,一次偶然的討論竟然也成為了彼此心中探究鑽研技術的起點,不錯啊。

作文紀念之。

2018.08.11 週六

於北京西直門


分享到:


相關文章: