2009年6月23日 星期二

W20 現在的執行位置──getClass()與getMethod()

在Log裡的記錄需要註明程式的出處時,一定會用到getClass(),經由這個方法可以取得Class名稱;但是再細部定位到程式的發生點時就只能拿到行號,然後再找程式碼看看那一行是在做什麼事。

為什麼拿到的資訊不是Method Name而是與程式碼內容無關的行號呢?在執行時有getClass()與this可以取得現在執行的物件資訊、卻沒有getRunningMethod()與thisMethos(二者均為虛構)等取得現在執行方法的功能呢?推測應該與程式設計者較注重結果卻不注重過程有關係──因為只要知道確實在哪裡出錯就好,不需要知道原來想要做的目的。

若去詢問什麼樣的程式碼需要被抽取到Method存放?一個很尋常的答案是"發現某一段程式碼在其他地方存在且完全相同時",這就是我感到奇怪的地方。檢查兩段程式碼是否相同的觀點僅是查看其外表,但是我一直認為程式碼被群聚為Method是它們屬於分解動作之一才會被提出的。重構的觀點提到"有一行註解之下的一段程式碼可以抽出為一個方法",這比較接近事實,不過要如何保證一行註解之下的是"一段程式"而不是"三段程式"?

Method抽取時依這樣的概略原則拿到的可能是錯誤的對應:或許是應該在一起的程式碼被拆開,或者是不該在一起的被放在一起,這些都會在某些場合下造成系統的複雜調整。當每個Method都是依照負責某個行為的目的而被建立起來之後,才會有對getRunningMethod()的需要。

註:目前的getRunningMethod()可以利用Exception裡的printTraceStach()來達成。將這個內容輸出為字串,就可以解析出指定位置的完整method call stack,利用此方法可以省下在很多方法內插入Log的時間。

沒有留言:

張貼留言