怎樣減輕程序中 if 語句的依賴?

比如文本處理的時候吧...

update:

新手練慣用的代碼, 沒考慮太多, 主要是 if 語句嵌套很多, 希望讓代碼更清晰一些


你看,都沒用if.

assert裡面蘊含了語義。

(condic關鍵字等同於condef,condic本身已是deprecated)

(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, &將一個if都不要&能減少許多if, 但是你將得到相同數目的類XD.


當然是光輝偉大的三目運算符啊,一行可以執行完所有的判斷和函數調用啊

沒錯,我是來黑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 = 2

else 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&(bool cod, Func& onTrue, Func& onFalse)
{
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肯定要用,如何減少嵌套,其實是對代碼邏輯的精簡問題,建議題主參考《編寫可讀代碼的藝術》第二部分「簡化循環和邏輯」。

另,圈複雜度可以用來檢測代碼模塊的複雜度,可根據結果針對性的重構


推薦閱讀:

遊戲中的隨機地圖是如何保存的?
數據結構存儲數據內存不夠如何解決?
零基礎自學反彙編相關的計算機知識,該如何入門,有什麼書可以推薦?
請問各位寫代碼都是從零開始嗎?比如做課程設計等。網上的源碼該如何利用?自己寫了其中多少代碼算自己寫的?
哪些編程習慣會導致內存泄漏?

TAG:編程語言 | 編程 |