問題描述 在大型項目中,通常存在多個模塊,模塊對外暴露的功能通常是通過介面封裝,這樣可以明確模塊的功能,有效降低模塊與模塊之間的耦合度,同時模塊與模塊之間進行合理的組裝。介面的實現,有時可能存在多個實現,如介面每個實現對應一種策略、或者測試代碼中因為測試場景添加了測試實現等,這時候如果想給介面添加一 ...
問題描述
在大型項目中,通常存在多個模塊,模塊對外暴露的功能通常是通過介面封裝,這樣可以明確模塊的功能,有效降低模塊與模塊之間的耦合度,同時模塊與模塊之間進行合理的組裝。介面的實現,有時可能存在多個實現,如介面每個實現對應一種策略、或者測試代碼中因為測試場景添加了測試實現等,這時候如果想給介面添加一個方法,自然需要給所有的實現都添加這個方法。但是當你給介面添加了一個方法後,這時候之前介面的實現就無法通過idea找到了。或許,先給所有的實現添加方法,最後在給介面添加。
靈感
文章:http://oopsguy.com/2017/10/27/the-ultimate-guide-to-writing-a-go-tool/
項目:https://github.com/fatih/gomodifytags
這個主要是功能是,獲取一個go文件中sruct的定義,然後給其每個欄位添加tag,核心使用了go中的ast去解析go文件,生成相應代碼。
解決方案
實現的預期效果,給指定介面的方法,然後給齊所有的實現也添加上這個方法的預設實現。
思路
- 掃描項目中所有的struct和interface
- 判斷所有的struct與interface組合是否存在實現關係
- 通過ast給interface與struct添加方法
效果
源碼
https://github.com/SimFG/interfacer
PS:目前的實現是最初版,只是可以滿足基本的情況,對於代碼中的一些特殊結構欠缺考慮,如果使用過程中發現問題,歡迎github上反饋