if else & return 的使用策略

有人提出了這樣的問題:
代碼1:

if ([responseDict[@"result"] boolValue] == false) {
    [CQHud showToastWithMessage:responseDict[@"msg"]];
    return;
}
/// code

代碼2:

if ([responseDict[@"result"] boolValue] == false) {
    [CQHud showToastWithMessage:responseDict[@"msg"]];
} else {
    /// code
}

你們更傾向于哪種寫法?
我的做法是如果if的代碼塊中的代碼比較少就用if return,想問下你們是怎么選擇的爪喘。

我認(rèn)同 J_Knight 的說法:“如果這兩組代碼是互斥關(guān)系颊亮,建議使用 if & else; 如果是要首先排除某些特殊的錯(cuò)誤情況轿秧,建議使用return”。

if-else 用來表示邏輯上的分支處理,但是在程序中有一種情況是其實(shí)我們更關(guān)心的主流程。

比如來看下面的一個(gè)簡單例子

if object is Pseron {
  if ((Person *)object).age > 18 {
    // is adult
  }else {
    error("not allowed")
  }
}else {
  error("not allowed")
}

其實(shí)程序只關(guān)注兩個(gè)部分:

  • 判斷是否合法
  • 合法后進(jìn)行對(duì)應(yīng)操作

在這種場(chǎng)景下膘壶,上面的這種寫法就顯得不夠清晰,尤其是當(dāng)判斷超過3層之后洲愤。提前return就會(huì)好的多:

if object isNot Pseron {
    error("not allowed")
    return
}
if object.age < 18 {
    error("not allowed")
    return
}

if ((Person *)object).age > 18 {
    // is adult
 }

這也是為什么swift要單獨(dú)推出guard關(guān)鍵字的原因颓芭。

如果從更高的抽象來看,本質(zhì)上是因?yàn)榍懊娴哪切﹔eturn是一個(gè)filter柬赐,換做FRP的寫法是這樣的:

let response: Observal<Object>
response.filter { object in
  return object is Person
}.filter { object in
  return object.age > 18
}.subscribNext {
  // is  adult
}

如果這么寫就可以明顯的看出亡问,如果是分支的邏輯就會(huì)寫在操作數(shù)據(jù)這層。前面用于提前return的部分在這個(gè)場(chǎng)景里不是一個(gè)邏輯分支肛宋。

相比是不是該用return州藕,這個(gè)代碼有個(gè)更嚴(yán)重的問題

很容易看出這是處理api返回?cái)?shù)據(jù)的代碼。這樣寫犯了一個(gè)非常嚴(yán)重且簡單的錯(cuò)誤:代碼沒有復(fù)用悼吱。

用更高一點(diǎn)目光看所暴露的問題是抽象層次低慎框。

如果這樣直接處理服務(wù)端的數(shù)據(jù)良狈,等于每一個(gè)請(qǐng)求的地方都要寫這種很傻的代碼后添。有50個(gè)api,就要寫50次[responseDict[@"result"] boolValue]薪丁,如果有一天后端架構(gòu)調(diào)整遇西,把標(biāo)志為請(qǐng)求是否成功的字段從result字符串改為狀態(tài)碼表示呢?比如200表示成功严嗜,其他都是失敗粱檀。你的代碼要怎么維護(hù)?

每個(gè)請(qǐng)求的代碼都要取一次“msg”漫玄,彈出來煩不煩茄蚯?所有的api請(qǐng)求做一層處理,如果是錯(cuò)誤的統(tǒng)一處理一下不就好了睦优?如果所有錯(cuò)誤的請(qǐng)求要記日志渗常,這種寫法不是又要改很多地方?

抽象層次低是你只看到了原始數(shù)據(jù)汗盘,沒有看到這些數(shù)據(jù)復(fù)合后的抽象皱碘。可以理解為服務(wù)端返回的是一個(gè)Response對(duì)象隐孽,里面有返回的數(shù)據(jù)和錯(cuò)誤信息癌椿。寫起來大概是這樣:

struct Response<T: JSONMappedObject>: {
  var data: T?
  var rawData: [String: Any]
  var msg: String?
  
  init(json: [String: Any]) {
    
  }
  
  init(json: [Any]){
  }
}

如果以后返回的數(shù)據(jù)要做整體變更健蕊,只會(huì)是Response這個(gè)結(jié)構(gòu)發(fā)生改變,外層的業(yè)務(wù)處理不會(huì)受影響踢俄,不用關(guān)心我要的data是怎么取出來的缩功。

代碼請(qǐng)至少要做到三件事

正確的命名,不要有重復(fù)的代碼褪贵,每個(gè)函數(shù)里的邏輯步驟不要超過7步掂之。
最開始寫代碼,先嚴(yán)格達(dá)到上面的3個(gè)目標(biāo)再想其他的吧脆丁。

不要掃二維碼

歡迎關(guān)注我的微博:@沒故事的卓同學(xué)
里面沒有任何有益的內(nèi)容世舰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市槽卫,隨后出現(xiàn)的幾起案子跟压,更是在濱河造成了極大的恐慌,老刑警劉巖歼培,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震蒋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡躲庄,警方通過查閱死者的電腦和手機(jī)查剖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪窘,“玉大人笋庄,你說我怎么就攤上這事【蠹啵” “怎么了直砂?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浩习。 經(jīng)常有香客問我静暂,道長,這世上最難降的妖魔是什么谱秽? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任洽蛀,我火速辦了婚禮,結(jié)果婚禮上疟赊,老公的妹妹穿的比我還像新娘郊供。我一直安慰自己,他們只是感情好听绳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布颂碘。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪头岔。 梳的紋絲不亂的頭發(fā)上塔拳,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音峡竣,去河邊找鬼靠抑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛适掰,可吹牛的內(nèi)容都是我干的颂碧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼类浪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼载城!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起费就,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤诉瓦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后力细,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睬澡,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年眠蚂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煞聪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逝慧,死狀恐怖昔脯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情馋艺,我是刑警寧澤栅干,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布迈套,位于F島的核電站捐祠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏桑李。R本人自食惡果不足惜踱蛀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贵白。 院中可真熱鬧率拒,春花似錦、人聲如沸禁荒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呛伴。三九已至勃痴,卻和暖如春谒所,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沛申。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工劣领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铁材。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓尖淘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親著觉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子村生,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)饼丘,斷路器梆造,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,790評(píng)論 0 11
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,284評(píng)論 0 6
  • 積攢了很多不滿想告訴你 最近很累心情毫不美麗 話語到嘴邊又下意識(shí)壓抑 瞻前顧后怕好感度降低 我的世界一直充滿明麗 ...
    山河此處閱讀 364評(píng)論 2 1
  • 原以為文人畫兒皆是逸筆草草葬毫,卻不知自己亦喜這山這水這風(fēng)骨镇辉。
    周樣閱讀 517評(píng)論 6 20