Delete useless (X) useful (O) code
最近遇到一個 Bug,讓我想到一個笑話:「我都不敢請假,因為怕發現老闆發現有沒有我都一樣。」
Patch 的標題是:"[NFC] delete useless code"
內容是移除下面紅色的那幾行
public void updateForShouldDefaultToObserveMode(int userId) {
long token = Binder.clearCallingIdentity();
try {
if (!android.nfc.Flags.nfcObserveMode()) {
Log.d(TAG, "observe mode isn't enabled");
return;
}
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext);
if (adapter == null) {
Log.e(TAG, "adapter is null, returning");
return;
}
ComponentName preferredService = mAidCache.getPreferredService().second;
boolean enableObserveMode = mServiceCache.doesServiceShouldDefaultToObserveMode(userId,
preferredService);
mHostEmulationManager.updateForShouldDefaultToObserveMode(enableObserveMode);
} finally {
Binder.restoreCallingIdentity(token);
}
}
乍看之下,我也覺得是沒用的 Code, Local variable 沒有使用,似乎也不需要存著,沒想到會造成 Intermittent 的 NFC 失效 Bug,雖然三個小時內立刻就被自動化測試抓到且解掉(還原)了,但我們剛好撿到這段 Code。
追了一下歷史,是之前的人 Refactor 的時候沒有寫好的問題。
上面藍色那行(左邊 1095 行),原本是 adapter.setObserveModeEnabled(enableObserveMode);,但 RD 把它移到 mHostEmulationManager.updateForShouldDefaultToObserveMode() 這個 function 裡面去了,裡面的實作也是先呼叫 NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext); 然後再呼叫 adapter.setObserveModeEnabled(enableObserveMode);
@TargetApi(35) | |
@FlaggedApi(android.nfc.Flags.FLAG_NFC_OBSERVE_MODE) | |
public void updateForShouldDefaultToObserveMode(boolean enabled) { | |
synchronized (mLock) { | |
if (isHostCardEmulationActivated()) { | |
mEnableObserveModeAfterTransaction = enabled; | |
return; | |
} | |
} | |
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext); | |
adapter.setObserveModeEnabled(enabled); | |
} |
結果沒有把這裡對 adapter 檢查是否為 Null 一起移植過去,所以就噴了。
學到的經驗
1. Refactor 的時候,要檢查過原函式有沒有對這些變數做什麼操作。
2. Refactor 時,如果已經移除最後的 instance usage 了,也要一併移掉區域變數,才不會留下一顆地雷。
留言