Company Ghost Story 公司鬼故事 14

contents

  1. 1. Java
    1. 1.1. Format vs. Concatenation
    2. 1.2. Comparator Signum
    3. 1.3. What’s Not-Equal
    4. 1.4. Sync-Up
    5. 1.5. Keyboard

Java

Format vs. Concatenation

1
String.format("format " + a + "%s", b);

大部分情況,很少去生成 format string,
混合使用很容易遇到表示錯誤,因為當 a 中出現 % 等特殊字元時,解析上會發生錯誤。最好是統一一種使用規則。

Comparator Signum

1
2
3
4
5
long a = func(x);
long b = func(y);
long dir = mDir;
return (int) a - (int) b; // SHOULD Long.compare(a, b);
return (int) (a - b) * dir; // SHOULD Long.compare(a, b) * Long.signum(dir);

隨意 casting 三不五時就會 arithmetic overflow 搞砸了排序。

What’s Not-Equal

1
2
3
4
5
6
if ((a == null && b != null) ||
(a != null && b == null) ||
!a.equals(b)) {
}
// WAIT, if a == null and b == null ?
// SHOULD Objects.equals(a, b);

有內建方便使用的函數,別再這樣寫了。

Sync-Up

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Record {
boolean merge() {
return a.setParent(b.getParent().copy());
// refactor, a.setParent(b.getParent());
}
}
class Merger {
void process(Record r) {
try {
merge();
} catch (Exception e) {
// nothing here
}
}
}

為什麼偷偷搞了一個 Exception 又不給 log message,一不小心就 refactor 到奇怪的東西,曾經把 NullPointerException 視為一個正常邏輯,修掉來自另一個 call path 的 NPE,卻又踩了另一塊的雷。

Keyboard

1
2
3
4
SHIFT + INSERT = CTRL + V
CTRL + C
CTRL + Z + ENTER
HOME/END

大家耳熟能詳的 CTRL C+V,都不知道 CTRL+INSERT/SHIFT+INSERT,而在 X Window System 上,選取時會自動複製,不用額外按下複製操作。

至於問 INSERT/DELETE/HOME/END 是什麼的小夥伴,還是好好看清楚鍵盤吧。