方法的度和幽靈方法

2021-06-27 19:34:48 字數 2686 閱讀 6791

在研究solr原始碼發現它用到了apache的commons io包,回想以前在各種場合見過這位「俠客」留下的痕跡,猶如揮之不去的魅影,決心花一天時間好好拜訪一下commons io!!正當我擼起了袖子,信心滿滿,蓄勢待發,果然單fileutils就給了我乙個閉門羹……

在研究原始碼時,類圖、時序圖能起到很好的輔助作用,而且借助eclipse除錯、鏈結功能,可以省下很多力氣。但是面對粒度更細的方法層,我並沒找到很好的解決方案。有時候單乙個類中的方法,就有各種跳轉呼叫,我們也被牽著鼻子在eclipse中跳來跳去。以fileutils類為例,它是乙個工具方法集合共93個方法。裡面含有大量的同名或者至少長得可以讓你眼花的兄弟方法。下面舉一些例子。

copydirectory

4              

copyfile

3iteratefiles

2listfiles

2write

6writelines

7writestringtofile6

但其實,一歸納就會發現,很多過載方法歸根結底就是乙個方法,只不過為了呼叫的方便,或是省去某個引數代以預設值,或是加了一層包裝。有時候需要忽略過載細節,抓住問題的本質,當你再一次看到某個過載方法時,你頭腦就會反應「嗯,它其實最後呼叫的是這個方法」。所以我按照自己的想法,給出了乙個閱讀原始碼方法層的解決方案。

①指1度方法,②指二度方法。度越小,這個方法越「本質」。而⓪度方法通常表示非裝飾的內部方法。

+ listfiles(file, iofilefilter, iofilefilter) ①

+ listfiles(file, string, boolean) ②

- innerlistfiles(...) ⓪

+ listfilesanddirs(file, string, boolean) ①

- innerlistfiles(...) ⓪

- validatelistfilesparameters(file, iofilefilter) ⓪

一般而言,方法的引數個數越多,度會越小,其他過載方法是某些引數預設值的快捷方法;方法的引數個數相同,同位置引數型別越簡單,度會越大,比如含string encode引數的方法會呼叫含charset encode的過載方法。

還有乙個「一般」規律:引數每減少乙個,不是直接呼叫低一度的方法,而是直接呼叫①度方法。對我們的啟示是:高度方法盡量不要多層巢狀呼叫過載方法,而是直接呼叫①度方法;①度方法的設計很重要。

加下劃線__的表示是幽靈方法。

玩過賽車遊戲的人可能知道,有些賽車遊戲會加入自己以前的賽車軌跡,成為幽靈選手。而一些功能相同的方法總是會有兩個,比如返回值為file型別和string,返回值為陣列型別和collection型別,返回值為collection型別和iterate型別。

+ listfiles(file, iofilefilter, iofilefilter) ①

+ listfiles(file, string, boolean) ②

- innerlistfiles(...) ⓪

+ listfilesanddirs(file, string, boolean) ①

- innerlistfiles(...) ⓪

- validatelistfilesparameters(file, iofilefilter) ⓪

+ iteratefiles(file, iofilefilter, iofilefilter) ②

+ iteratefiles(file, string, boolean) ③

+ iteratefilesanddirs(file, string, boolean) ②

+ copydirectory(file srcdir, file destdir, filefilter filter, boolean preservefiledate)

+ copydirectory(file srcdir, file destdir, boolean preservefiledate) ②

+ copydirectory(file srcdir, file destdir, filefilter filter) ②

+ copydirectory(file srcdir, file destdir) ③

- docopydirectory(file srcdir, file destdir, filefilter filter, boolean preservefiledate, listexclusionlist) ⓪

+ioutils.writelines(collection<?> lines, string lineending,outputstream output, string encoding) ⓪

+ioutils.write(string data, outputstream output, charset encoding) ⓪

+ copydirectory(file srcdir, file destdir, filefilter filter, boolean preservefiledate)

單這4個方法,可以約簡掉20個方法。

過載方法中:引數越長,度越低;引數長度相同,型別越複雜,度越低。

我們只需要看那些度為①的方法。

高度方法盡量不要多層巢狀呼叫低度過載方法,而是直接呼叫①度方法;①度方法的設計很重要。

Linux glibc幽靈漏洞修復方法

cve 2015 0235 linux glibc幽靈漏洞允許黑客遠端獲取系統許可權 測試漏洞是否存在 把下面的 儲存為gistfile1.c include include include include include define canary in the coal mine struct ...

基於相似度的方法

異常 通常是乙個主觀的判斷,需要結合業務背景和環境來具體分析確定。雜訊和異常之間 正常資料和噪 聲之間的邊界都是模糊的。異常值通常具有更高的離群程度分數值,同時也更具有可解釋性。巢狀迴圈 第一層迴圈遍歷每個資料,第二層迴圈進行異常判斷,需要計算當前點與其他點的距離,一旦已識別出多於 個資料點與當前點...

方法和方法的過載

帶參方法的語法 訪問修飾符 返回型別 方法名 形式引數列表 呼叫有參方法 類 物件名 new 類 物件名.方法名 實參1,實參2.形參實參 呼叫方法的時候,實參不能指定資料型別 形參和實參 資料型別要一致,數量也要一致 值傳遞,引用傳遞 基本資料型別傳遞的是 值,乙個變數的值改變,不會影響另乙個 引...