《記一次意外的技術討論收穫—策略模式》
最近公司有和第三方合作的專案,於是想到了使用策略模式去實現,到時候有別的第三方來走他自己的策略去完成相關的業務流程就行了。
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 週六
於北京西直門