成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

引入Option優(yōu)雅地保證健壯性

開發(fā) 開發(fā)工具
通過引入Option,既規(guī)避了可能出現(xiàn)的一些錯誤,又能避免編寫繁瑣的if判斷。

[[182563]]

REA的Ken Scambler在其演講《2 Year of Real World FP at REA》中,總結(jié)了選擇函數(shù)式編程的三個原因:Modularity, Abstraction和Composability。

函數(shù)式編程強(qiáng)調(diào)純函數(shù)(Pure Function),這是模塊化的一個重要基礎(chǔ),因為對于純函數(shù)而言,可以不用考慮調(diào)用的上下文,就可以根據(jù)函數(shù)的輸入推斷函數(shù)的執(zhí)行結(jié)果。這也就是Ken所謂的:

 You can tell what it does without Looking at surrounding context.

Ken在演講中給出了一個案例:

  1. def parseLocation(str: String): Location = { 
  2.   val parts = str.split(",") 
  3.   val secondStr = parts(1) 
  4.   val parts2 = secondStr.split(" ") 
  5.   Location(parts(0), parts2(0), parts(1).toInt)} 

仔細(xì)閱讀這段代碼,你會發(fā)現(xiàn)這段代碼是不健壯的,可能存在如下錯誤:

  • 作為input的str可能為null
  • parts(0)和parts(1)可能導(dǎo)致索引越界
  • parts2(0)可能導(dǎo)致索引越界
  • parts(1)未必是整數(shù),調(diào)用toInt可能導(dǎo)致類型轉(zhuǎn)換異常

這段代碼隱含的錯誤還可能被廣泛地蔓延到系統(tǒng)的其他地方,只要該函數(shù)被調(diào)用。這種蔓延可能會因為更多嵌套的調(diào)用而產(chǎn)生級聯(lián)的錯誤效應(yīng)。例如:

  1. def doSomethingElse(): Unit = { 
  2.   // ...Do other stuff 
  3.   parseLocation("Melbourne, VIC 3000")} 

而doSomethingElse()函數(shù)又被其他函數(shù)調(diào)用,這些潛在的缺陷會分布到各個直接或間接的調(diào)用點。這意味著代碼會繼承它所調(diào)用代碼的錯誤以及副作用,使得對代碼功能的推理(reasoning)變得近乎不可能,更不用說代碼的模塊化(modularity)了。

我們當(dāng)然可以通過對null進(jìn)行檢測來避免出現(xiàn)這些錯誤。然而看看各種出現(xiàn)null值的可能分支,需要我們做各種條件判斷,想象這樣的代碼都讓人不寒而栗。引入Option類型就可以很好地封裝這種可能性。按照Ken的說法就是:

 All possibilities have been elevated into the type system.
  1. def parseLocation(str: String): Option[Location] = { 
  2.  val parts = str.split(",") 
  3.  for { 
  4.    locality <- parts.optGet(0) 
  5.    theRestStr <- parts.optGet(1) 
  6.    theRest = theRestStr.split(" ") 
  7.    subdivision <- theRest.optGet(0) 
  8.    postcodeStr <- theRest.optGet(1) 
  9.    postcode <- postcodeStr.optToInt 
  10.  } yield Location(locality, subdivision, postcode)} 

以上代碼中,split()函數(shù)返回的類型為Array[String],該類型自身是沒有optGet()函數(shù)的。但是我們可以為Array[String]定義隱式轉(zhuǎn)換:

  1. implicit class StringArrayWrapper(array: Array[String]) { 
  2.     def optGet(index:Int): Option[String] = { 
  3.         if (array.length > index) Some(array(index)) else None 
  4.     }} 

optToInt方法可以如法炮制。

Ken的解決方案并沒有考慮到parseLocation函數(shù)入?yún)tr存在null值的可能,故而在對str調(diào)用split方法時仍然有可能導(dǎo)致拋出空指針異常。因此進(jìn)一步,我們還可以修改parseLocation函數(shù)的定義:

  1. def parseLocation(optStr: Option[String]): Option[Location] 

顯然,通過引入Option,既規(guī)避了前面分析可能出現(xiàn)的錯誤,又能避免編寫繁瑣的if判斷。這里的關(guān)鍵點是Option對兩種可能性(None與Some)的封裝。它由兩個代數(shù)類型Some與None構(gòu)成,前者包含了一個值,而后者則包含了一個不存在的值。事實上,Option是一個Maybe Monad,實現(xiàn)了flatMap與filter,因而在Scala中可以用for comprehension來訪問。

【本文為51CTO專欄作者“張逸”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2023-11-17 11:55:54

Pythonretrying庫

2018-06-29 14:51:41

Java健壯性實踐

2021-02-26 20:07:54

安全性健壯性代碼

2021-05-27 08:15:05

CSS CSS prefer技巧

2025-02-13 00:28:26

2024-01-08 09:38:51

Java數(shù)據(jù)

2011-12-07 10:22:11

美信云網(wǎng)管閥值

2025-02-27 09:35:22

2025-06-06 08:00:00

上下文管理器Python開發(fā)

2021-10-11 08:08:02

Python異常程序

2022-02-15 08:38:04

錯誤邏輯異常編程程序

2021-09-01 12:03:49

Spring單元測試

2024-05-07 07:58:47

C#程序類型

2024-07-04 08:02:59

2012-12-05 09:42:09

2021-12-09 17:21:48

TypeScript TS 前端

2024-11-07 12:20:31

LinuxC語言數(shù)據(jù)類型

2022-03-01 21:25:30

對象代碼Proxy

2010-09-25 15:19:01

2024-04-12 12:14:39

Rust字符串代碼
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 免费三级av | 超碰超碰 | 在线观看免费高清av | 中文字幕一区二区三区在线观看 | 成人精品一区二区户外勾搭野战 | 欧美激情99| 欧美一级久久精品 | 北条麻妃av一区二区三区 | 国产免费视频 | 亚洲一页| 国产乱肥老妇国产一区二 | 国产精品99久久久久 | 日韩伦理电影免费在线观看 | 91传媒在线观看 | 亚洲欧美自拍偷拍视频 | 亚洲一区二区视频 | 日韩欧美不卡 | 日本黄色影片在线观看 | 免费同性女女aaa免费网站 | 在线国产视频 | 麻豆av一区二区三区久久 | 欧美日韩国产一区二区三区 | 欧美一区二区在线观看 | 在线三级网址 | 亚洲精品99| 九九热精品视频 | 国产成人a亚洲精品 | 亭亭五月激情 | 日日摸天天添天天添破 | 亚洲精品久久嫩草网站秘色 | 国产一区二区精品在线 | 日韩中文在线视频 | 夜夜草| 久久久久国产一级毛片高清网站 | a级片播放 | 精品欧美一区二区三区久久久小说 | 黄色香蕉视频在线观看 | 日韩欧美在 | 日韩欧美天堂 | 日本黄色大片免费 | 久草网址 |