日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
不要ifelse的編程

條件控制是編程中與生俱來(lái)的一種結(jié)構(gòu),但對(duì)于我來(lái)說(shuō),除了給我?guī)?lái)麻煩外,沒有發(fā)現(xiàn)任何的用處。一次又一次,我不斷發(fā)現(xiàn),越少的if語(yǔ)句,越少的 switch語(yǔ)句,越少的循環(huán),就會(huì)是越好的代碼。通常這其中的原因是程序員用編程語(yǔ)言實(shí)現(xiàn)了更好的抽象歸納。他們并不是有意識(shí)的避免使用控制結(jié)構(gòu)。但他 們確實(shí)做到了這些。

創(chuàng)新互聯(lián)建站長(zhǎng)期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為麥蓋提企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè),麥蓋提網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

如果是使用一種面向?qū)ο缶幊陶Z(yǔ)言,我們可以用多態(tài)(polymorphism)來(lái)代替switch。同樣的技巧也能用在 if語(yǔ)句上,但如果邏輯太簡(jiǎn)單,這樣做就有點(diǎn)得不償失。當(dāng)使用一種有函數(shù)式特征的編程語(yǔ)言時(shí),大部分的循環(huán)執(zhí)行任務(wù)我們都可以用 map,filter,fold等實(shí)現(xiàn)??刂平Y(jié)構(gòu)最終從代碼中消失,這是對(duì)代碼大有好處的事。

條件控制結(jié)構(gòu)的問(wèn)題是,它很容易導(dǎo)致你把代碼修改的亂七八糟。讓我們看看下面一個(gè)簡(jiǎn)單的if語(yǔ)句:

 
 
 
  1. if ... 
  2.     ... 
  3.   else 
  4.     ... 
  5.   end  

代碼中所有打省略號(hào)的地方都是你可以不斷添加代碼的地方。這些地方可以訪問(wèn)if外面的變量。這很容易造成高耦合。更糟糕的是,人們會(huì)習(xí)慣性的在條件 控制里嵌套條件。我見過(guò)的最糟糕的代碼,里面的嵌套之深的就像是噩夢(mèng)里的無(wú)底洞。我想,條件控制結(jié)構(gòu)的真正問(wèn)題所在是,它把各種任務(wù)混合到了一起。我相 信,你能從某種角度上看出,它是和任務(wù)單一編程原則相沖突的。

我們?cè)撛趺醋??我們可不可以完全不要控制結(jié)構(gòu)?我想不行,但我們可以做一些實(shí)驗(yàn)來(lái)看看如何能減少對(duì)它們的使用。通常這樣做會(huì)讓我們從中學(xué)到一些新技巧,讓我們的代碼更整潔。

不久前,我開發(fā)了一些Ruby程序,我需要寫一個(gè)‘take’函數(shù),用它從一個(gè)數(shù)組里取出一些元素。Ruby里有一些針對(duì)Enumerable的這樣的函數(shù),但我需要一些特殊的功能。如果我需要的數(shù)組的大小超出了目標(biāo)數(shù)組的大小,需要把多余的數(shù)組空間都置為0。

這看起來(lái)可以用簡(jiǎn)單的if語(yǔ)句實(shí)現(xiàn):

 
 
 
  1. def padded_take ary, n 
  2.    if n <= ary.length 
  3.      ary.take(n) 
  4.    else 
  5.      ary + [0] * (n - ary.length) 
  6.    end 
  7.  end 

讓我們認(rèn)真的看一看這段代碼。它沒有向我們顯示任何填充動(dòng)作的信息,沒有顯示數(shù)組跟填充的關(guān)系。如果認(rèn)真看,可以看出其中的邏輯,但我們看不出這段代碼的意圖。

我們引入一些函數(shù)來(lái)讓這段代碼更清楚些,使用guard語(yǔ)句來(lái)簡(jiǎn)化if語(yǔ)句:

 
 
 
  1. def padded_take ary, n 
  2.    return ary.take(n) unless needs_padding?(ary, n) 
  3.    ary + pad(ary, n) 
  4.  end 

這個(gè)短小精悍,但不是更簡(jiǎn)單——我們可以使用一個(gè)null對(duì)象來(lái)去掉條件語(yǔ)句??盏臄?shù)組就是很好的null對(duì)象。讓我們?cè)趤?lái)一次。

我們不需要用一個(gè)條件語(yǔ)句來(lái)計(jì)算填充的長(zhǎng)度。這個(gè)長(zhǎng)度我們可以取兩個(gè)數(shù)組中的***值,如果我們想要的長(zhǎng)度超出了數(shù)組的長(zhǎng)度,填充的長(zhǎng)度就是它們的差值:

 
 
 
  1. pad_length = [0, n - ary.length].max 

有了這個(gè)長(zhǎng)度,我們可以先填充數(shù)組,然后取出我們想要的元素:

 
 
 
  1. def pad ary, n 
  2.    pad_length = [0, n - ary.length].max 
  3.    ary + [0] * pad_length 
  4.  end 

于是,我們可以這樣定義取出動(dòng)作:

 
 
 
  1. def padded_take ary, n 
  2.     pad(ary, n).take(n) 
  3.   end 

我們通過(guò)先進(jìn)行填充從而避免了使用if語(yǔ)句。當(dāng)然,有時(shí)候填充的是一個(gè)空數(shù)組。

我不想去爭(zhēng)論這樣的寫法是否比最初的if-then-else代碼更簡(jiǎn)單,但現(xiàn)在的代碼的意圖更清晰了,而且我不認(rèn)為這種策略在這種代碼里使用是過(guò)度技術(shù)化。

從提取歸納的層面看,代碼經(jīng)過(guò)處理后的好處是明顯的。當(dāng)遇到更復(fù)雜問(wèn)題時(shí),它帶來(lái)的益處將會(huì)更明顯。

原文鏈接:http://michaelfeathers.typepad.com/michael_feathers_blog/2013/11/unconditional-programming.html

譯文鏈接:http://www.aqee.net/unconditional-programming/


網(wǎng)站名稱:不要ifelse的編程
URL標(biāo)題:http://m.5511xx.com/article/cossghe.html