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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
使用Option的正確姿勢(shì)

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

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)蒼溪,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18982081108

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

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

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

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

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

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

如果我們?yōu)檫@兩個(gè)搜索條件定義表達(dá)業(yè)務(wù)含義的代數(shù)數(shù)據(jù)類(lèi)型(algebraic data types),如下代碼所示,表意無(wú)疑要清晰許多:

 
 
  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作為兩個(gè)查詢(xún)條件,分別提供了各自的查詢(xún)語(yǔ)義,顯然要比過(guò)分抽象的Some與None更加清晰可讀。

引入這樣的代數(shù)數(shù)據(jù)類(lèi)型不僅可以讓代碼的表意更清晰,還可更好地應(yīng)對(duì)需求的變化。對(duì)于現(xiàn)有的SearchCriteria定義而言,倘若要牽強(qiáng)附會(huì),確實(shí)可以強(qiáng)詞奪理地說(shuō):MatchAll就是None的語(yǔ)義,而Contains則對(duì)應(yīng)著Some。然而,如果需求要求增加完全匹配的查詢(xún)場(chǎng)景,對(duì)于Option類(lèi)型而言,該如何表達(dá)?回到SearchCriteria的定義,我們可以輕松地為其增加一種類(lèi)型:

 
 
  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而言,增加了一種新的類(lèi)型,卻極大地提高了代碼的可讀性,也為代碼的未來(lái)擴(kuò)展奠定了基礎(chǔ)。與獲得的收益相比,僅僅是付出新增類(lèi)型的微末代價(jià),何足道哉!

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


當(dāng)前名稱(chēng):使用Option的正確姿勢(shì)
當(dāng)前鏈接:http://www.5511xx.com/article/cdioepc.html