我們有很多 coding style 或 **規範。 但這一條可能會經常被我們所遺忘,就是我們經常會在函式的引數裡使用bool引數,這會大大地降低**的可讀性。 不信?我們先來看看下面的**。
當你讀到下面的**,你會覺得這個**是什麼意思?
widget->repaint(false);
是不要 repaint 嗎?還是別的什麼意思?
看了文件後,我們才知道這個引數是 immediate,也就是說,false 代表不立即重畫,true **立即重畫。
windows api 中也有這樣乙個函式:invalidaterect,當你看到下面的**,你會覺得是什麼意思?
invalidaterect(hwnd, lprect, false);
我們先不說 invalidaterect 這個函式名取得有多糟糕,我們先說一下那個 false 引數? invalidate 意為 「讓***無效」,false 是什麼意思? 雙重否定? 是肯定的意思?
如果你看到這樣的**,你會相當的費解的。 於是,你要去看一下文件,或是 invalidaterect 的函式定義, 你會看到那個引數是 bool berase,意思是:「是否要重畫背景」。
這樣的事情有很多,再看下面的**,想把 str 中的 」%user%」 替換成真實的使用者名稱:
str.replace("%user%", user, false); // qt 3
****,那個 false 是什麼意思?不替換嗎?還是別的什麼意思?
看了文件才知道,false 代表: 「大小寫不敏感的替換」。
其實,如果你使用列舉變數/常量,而不是 bool 變數,你會讓你的**更易讀,如:
widget->repaint(paint::immediate);
widget->repaint(paint::deffer);
invalidaterect(hwnd, lprect, !repantbackground);
str.replace("%user%", user, qt::caseinsensitive); // qt 4
如果對這個事不以為然的話,我們再來看一些別的示例,你不妨猜猜看看下面的**:
component.setcentered(true, false);
這什麼玩意兒啊?
看了文件你才知道,這原來是 setcentered(centered, autoupdate);
new textbox(300, 100, false, true);
這又是什麼啊?
看了文件才知道,這是建立乙個文字框,第三個引數是:「是否要滾動條」,第四個是:「是否要自動換行」。****!
這種情況還不算最差,看看下面的雙重否定。
component.setdisabled(false);
filter.setcaseinsensitive(false)
再來乙個,如果你讀到下面的**,相信你會和我一樣,要麼石化了,要麼凌亂了。
event.initkeyevent("keypress", true, true, null, null,
false, false, false, false, 9, 0);
看完這篇文章,我希望你再也不要把bool為作為函式引數了。除非兩個原因:
如果你想設計乙個好的 api,強烈推薦你讀一下 nokia 的 qt 的《api design principles》,本文就是其中的 「boolean trap」。
千萬不要把 bool 當成函式引數
我們有很多 coding style 或 規範。但這一條可能會經常被我們所遺忘,就是我們經常會在函式的引數裡使用bool引數,這會大大地降低 的可讀性。不信?我們先來看看下面的 當你讀到下面的 你會覺得這個 是什麼意思?widget repaint false 是不要 repaint 嗎?還是別的什...
不要把領導當成客戶
以客戶為中心的思想,幾乎在所有公司都會被提及和執行。他的終極目標是和客戶達成共贏。但是,並不是所有人都理解了以客戶為中心。我今天想說的是 於我們的一次工作討論。幾位新同事在分享服務案例的時候,提到自己的客戶,經常把經理當成客戶。他們是這樣理解的,經理把工作交給他們,經理在給他們分配工作的同時,也給他...
彭宇誠 請不要把pr值當成神看待
從10月30日google更新pr這幾天以來,彭宇誠在各大站長論壇,站長網,站長類qq群都不約而同的聽到兩種聲音 我的新站pr值從0到4了,我的pr值從5變4了等類似的聲音,其中包含一種是興奮,另一種則是失落的聲音。彭宇誠不禁要問各位站長朋友,pr值真的有那麼神麼?首先我們來看看pr值有什麼用,為什...