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

使用Option的正確姿勢

開發 開發工具
我們會頻繁地使用Scala的Option,用以解決類似Null Object之類的問題。某種程度講,使用Option必然會減少對空指針引用判斷的丑陋代碼,結合For Comprehension,確乎是Scala編程中的一把利器。

[[184061]]

我們會頻繁地使用Scala的Option,用以解決類似Null Object之類的問題。某種程度講,使用Option必然會減少對空指針引用判斷的丑陋代碼,結合For Comprehension,確乎是Scala編程中的一把利器。我在博客《引入Option優雅地保證健壯性》與《并非Null Object這么簡單》中都詳細對Option的本質與運用進行剖析與介紹。

然而,Option雖然好,我們卻不可“貪杯”哦!

從語義上講,Option代表一種容器(Monad)非空即有的兩種狀態,例如List的headOption就是對Option的合理詮釋。那么,是否只要是兩種狀態的業務場景,就可以使用Option呢?例如,將函數的參數類型定義為Option類型,用以表示用戶傳參的選擇:傳入實際值或者不傳值。這是否是得體的姿勢?

Daniel Westheide發表的博文When Option Is Not Good Enough旗幟鮮明地表達了反對意見。他給出這樣的一個案例:根據產品標題與零售商信息查詢Offer:

  1. def searchOffers( 
  2. productTitle: Option[String], 
  3. retailer: Option[Retailer] 
  4. ): Seq[Offer] = ??? 

作為這個函數的調用者,我們該怎么看待這兩個Option參數傳遞的業務含義?如果productTitle為None,是表示忽略productTitle的值,僅僅搜索符合retailer條件的offers;還是搜索沒有提供productTitle的Offer記錄?同樣,retailer參數也傳遞了如此模糊不清的意圖!

好的代碼尤其是接口應該是”不言自明“清晰地傳遞開發者意圖。落到具體的業務場景,則代碼就應該恰到好處干凈利落地表現其業務含義。接口體現準確的業務通用語言(ubiquitous language),是DDD的核心價值。

如果我們為這兩個搜索條件定義表達業務含義的代數數據類型(algebraic data types),如下代碼所示,表意無疑要清晰許多:

  1. sealed trait SearchCriteriaobject SearchCriteria {  
  2. final case object MatchAll extends SearchCriteria  
  3. final case class Contains(s: String) extends SearchCriteria}sealed trait RetailerCriteriaobject RetailerCriteria {  
  4. final case object AnyRetailer extends RetailerCriteria  
  5. final case class Only(retailer: Retailer) extends RetailerCriteria}def searchOffers(  
  6. product: SearchCriteria,  
  7. retailer: RetailerCriteria  
  8. ): Seq[Offer] = ??? 

SearchCriteria與RetailerCriteria作為兩個查詢條件,分別提供了各自的查詢語義,顯然要比過分抽象的Some與None更加清晰可讀。

引入這樣的代數數據類型不僅可以讓代碼的表意更清晰,還可更好地應對需求的變化。對于現有的SearchCriteria定義而言,倘若要牽強附會,確實可以強詞奪理地說:MatchAll就是None的語義,而Contains則對應著Some。然而,如果需求要求增加完全匹配的查詢場景,對于Option類型而言,該如何表達?回到SearchCriteria的定義,我們可以輕松地為其增加一種類型:

  1. object SearchCriteria { 
  2. final case object MatchAll extends SearchCriteria 
  3. final case class Contains(s: String) extends SearchCriteria 
  4. final case class Exactly(s: String) extends SearchCriteria} 

比較Option而言,增加了一種新的類型,卻極大地提高了代碼的可讀性,也為代碼的未來擴展奠定了基礎。與獲得的收益相比,僅僅是付出新增類型的微末代價,何足道哉!

【本文為51CTO專欄作者“張逸”原創稿件,轉載請聯系原作者】

 

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

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-07-10 13:09:45

前端Flexbox

2021-09-15 16:20:02

Spring BootFilterJava

2016-01-05 11:28:20

按需付費云計算docker

2022-02-21 11:21:40

golang編程語言

2018-01-11 15:31:39

命令Linux關機

2016-05-09 10:41:03

算法分析開發

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2020-08-31 06:54:37

注解脫敏ELK

2021-07-12 11:35:13

Go協程Goroutine

2017-10-12 11:30:34

Spark代碼PR

2021-01-08 08:10:34

MySQL表空間回收

2021-10-08 08:38:00

Pipelineshell命令Jenkins

2016-12-12 08:48:24

2019-12-27 15:58:57

大數據IT互聯網

2024-09-25 08:22:06

2019-10-30 17:06:50

AWS物聯網IoT

2020-02-24 15:26:40

Python短信免費

2017-06-19 17:43:04

網絡帶寬網絡設計

2019-01-02 10:49:54

Tomcat內存HotSpot VM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品中文字幕久久 | 亚洲精品视频在线看 | 乳色吐息在线观看 | 国产成人福利视频 | 欧美日韩精品一区二区三区四区 | 欧美一区二区三区在线观看视频 | 日韩高清一区 | 久久精品一 | 久久99国产精品久久99果冻传媒 | 午夜精品久久久久久久久久久久 | 亚洲福利一区二区 | 国产在线中文 | www.日韩 | 水蜜桃久久夜色精品一区 | 亚洲电影免费 | 欧美久久久久久久 | 日韩国产中文字幕 | 亚洲最色网站 | 亚洲国产精品99久久久久久久久 | 日韩欧美三级电影在线观看 | 91视频大全| 一级免费视频 | 亚洲一一在线 | jlzzjlzz国产精品久久 | 欧美视频在线一区 | 黄色一级片视频 | 免费看国产一级特黄aaaa大片 | 国产精品性做久久久久久 | 成人av在线网站 | 91就要激情 | 在线视频a | 国产精品亚洲成在人线 | 九九久久久| 亚洲欧美一区二区在线观看 | 男女视频在线免费观看 | 国产高清在线 | 婷婷久久五月 | 91文字幕巨乱亚洲香蕉 | 有码一区 | 成年人在线视频 | 国产精品久久久久久久久久 |