自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用Option的正確姿勢

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

[[184061]]

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

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

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

Daniel Westheide發(fā)表的博文When Option Is Not Good Enough旗幟鮮明地表達(dá)了反對意見。他給出這樣的一個案例:根據(jù)產(chǎn)品標(biāo)題與零售商信息查詢Offer:

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

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

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

如果我們?yōu)檫@兩個搜索條件定義表達(dá)業(yè)務(wù)含義的代數(shù)數(shù)據(jù)類型(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更加清晰可讀。

引入這樣的代數(shù)數(shù)據(jù)類型不僅可以讓代碼的表意更清晰,還可更好地應(yīng)對需求的變化。對于現(xiàn)有的SearchCriteria定義而言,倘若要牽強附會,確實可以強詞奪理地說:MatchAll就是None的語義,而Contains則對應(yīng)著Some。然而,如果需求要求增加完全匹配的查詢場景,對于Option類型而言,該如何表達(dá)?回到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而言,增加了一種新的類型,卻極大地提高了代碼的可讀性,也為代碼的未來擴展奠定了基礎(chǔ)。與獲得的收益相比,僅僅是付出新增類型的微末代價,何足道哉!

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

 

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

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

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關(guān)機

2016-05-09 10:41:03

算法分析開發(fā)

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2021-07-12 11:35:13

Go協(xié)程Goroutine

2020-08-31 06:54:37

注解脫敏ELK

2021-10-08 08:38:00

Pipelineshell命令Jenkins

2017-10-12 11:30:34

Spark代碼PR

2021-01-08 08:10:34

MySQL表空間回收

2016-12-12 08:48:24

2019-12-27 15:58:57

大數(shù)據(jù)IT互聯(lián)網(wǎng)

2024-09-25 08:22:06

2018-04-11 15:42:04

開源項目姿勢

2024-02-06 14:05:00

Go中間件框架

2019-10-30 17:06:50

AWS物聯(lián)網(wǎng)IoT

2019-01-02 10:49:54

Tomcat內(nèi)存HotSpot VM
點贊
收藏

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