怎樣減輕程序中 if 語句的依賴?
比如文本處理的時候吧...
update:新手練慣用的代碼, 沒考慮太多, 主要是 if 語句嵌套很多, 希望讓代碼更清晰一些
(support python versions: 3.5-3.6.2
講原理沒用的,這種編碼的技巧要提高,唯一的方法就是找高手幫你做code review
如果你的代碼是這樣
if (condition_1)
{
if (condition_2)
{
if (condition_3)
{
if (condition_4)
{
// do something
}
}
}
}
那麼可能你應該寫成這樣
if (condition_1 condition_2)
{
if (condition_3 condition_4)
{
// do something
}
}
if (!condition_1)
return;
if (!condition_2)
return;
if (!condition_3)
return;
if (!condition_4)
return;
//do something
有時候還可以這樣寫
do
{
if (!condition_1)
break;
if (!condition_2)
break;
if (!condition_3)
break;
if (!condition_4)
break;
// do something
return;
}while(0);
// do some clean up
return;
一個接一個的if語句實際上是描述了一棵決策樹,不管你用不用if,決策還是要做。
所以,要減少if,那麼,
1.重新思考問題,找一棵等價的,分枝少,高度小的決策樹可以減少決策的數量,而減少if。2.用隱式的決策來代替if,如函數表,基於goto的狀態機等。可以用更合理的運算/業務邏輯來減少對 if 的依賴
請君看一下《代碼大全》,這本經典的書裡面詳細的介紹了,如何「寫代碼」,裡面就包括if和while的使用。此書並不是針對於某一種語言,而是表達的一種編碼思想。
如果你貫徹純OOP, &
當然是光輝偉大的三目運算符啊,一行可以執行完所有的判斷和函數調用啊沒錯,我是來黑jQuery的。。
心裡的「如果」少了,if也就少了
初學程序經常會
if (邏輯A) {
if (邏輯B) {
if (邏輯C) {
if (邏輯D) {
...
}
}
}
}
此種情況會造成代碼凌亂, 想找個else語句,
結果找了一百多行只看到一個 if 結束,
調試起來偶爾也會在嵌套中迷路.
此時不妨換個思路, 先來想想, 不這麼做會發生什麼.
即
if (非邏輯A) {
...
return;
}
if (非邏輯B) {
...
return;
}
if (非邏輯C) {
...
return;
}
if (非邏輯D) {
...
return;
}
...
如此, 代碼條理清晰邏輯通暢無嵌套,不會迷路.
策略模式
文本處理的時候?能貼個代碼片段么?既然是用if了,肯定是有多個判斷,想減少if最徹底的就是減少這些判斷(當然我覺得這沒辦法減少幾個的,因為既然有判斷,就肯定是有這些需求)。在一個類中不想用那麼多的if, 那就將這些判斷分類型, 然後到指定的函數中處理這些問題,但是if的總數量是沒有變化的。減少if的依賴性,我覺得沒有必要刻意去做, 因為if已經是非常清晰的條件判斷了,如果寫的很複雜,會導致別人沒辦法比較快速的讀懂你的代碼,甚至你自己過段時間來看都不知道是什麼邏輯了(注釋寫的清楚的話,就沒這問題了)。如果沒有特別完美的解決方案,那還是繼續if吧。
首先 為什麼要減輕if依賴?可讀性?效率?優美?
三目運算 ?:switch 語句數組/關聯數組if (a = 1) b = 2else if (a = 2)b = 4
寫成b[1]=2,b[2]=4最近看到的:程序中減少使用if語句的方法集錦
// 舉個比較函數式的例子
({
"a": function(){ // do a },
"b": function(){ // do b }
})[condition].apply(this)
在思考需求的時候不要偷懶,想想代碼是不是可以換一個方式組織。比較經典的是很多if可以通過狀態機模式實現。
複雜度不能降低,只能分散或者轉移。什麼switch case 優化成OOP的多態也好,還是合併邏輯,還是其他方法,都逃不出這個框框。
別做無畏的事情了~最多能正加下可讀性~演算法熵在那裡放著的,只要不變,就不可能寫出更少的代碼的
如果if語句多了會增加處理時間嗎?為什麼要減輕對if的依賴呢?
文本處理?用sed啊…沒if了,全是管道…
@余天升 寫挺全的了 我補充幾個1. 多用?:操作符。嵌套的話的時候一行可以幹掉七八個if,不過你排版得注意不然看得眼花。2. 把你的判斷條件搞成查找表,把你的處理邏輯放到表裡面。
最近正好用到了,用C#的匿名委託乾的,模仿的Lisp,先寫了一個IFF函數:IFF(bool cod, 為true時執行的委託,為false時執行的委託)
protected T IFF&
{
if (cod)
return onTrue();
return onFalse();
}
return IFF(booleanValue,
()=&> { /* onTrue */ },
()=&> { /* onFalse */}
);
return
IFF(b1,
()=&> IFF(b2,
()=&> IFF(b3,
()=&>{ when-b3-true },
()=&>{ when-b3-false }
),
()=&>{ when-b2-false }
),
()=&> { when-b1-false }
);
滿好玩的
if肯定要用,如何減少嵌套,其實是對代碼邏輯的精簡問題,建議題主參考《編寫可讀代碼的藝術》第二部分「簡化循環和邏輯」。另,圈複雜度可以用來檢測代碼模塊的複雜度,可根據結果針對性的重構
推薦閱讀:
※遊戲中的隨機地圖是如何保存的?
※數據結構存儲數據內存不夠如何解決?
※零基礎自學反彙編相關的計算機知識,該如何入門,有什麼書可以推薦?
※請問各位寫代碼都是從零開始嗎?比如做課程設計等。網上的源碼該如何利用?自己寫了其中多少代碼算自己寫的?
※哪些編程習慣會導致內存泄漏?