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

從Moco談程序庫(kù)設(shè)計(jì)

開發(fā) 后端
設(shè)置服務(wù)器,也就是在什么樣的請(qǐng)求,給什么樣的應(yīng)答。Moco有一個(gè)很關(guān)鍵的起點(diǎn),那便是DSL,要知道,之前的一段時(shí)間我剛剛完成了《領(lǐng)域特定語言》的翻譯。于是,API的可讀性成了一件非常重要的事。

Moco在程序庫(kù)設(shè)計(jì)包括兩個(gè)方面,如何設(shè)置服務(wù)器和如何讓服務(wù)器運(yùn)行起來。

先說簡(jiǎn)單的,如何讓服務(wù)器運(yùn)行。最簡(jiǎn)單的選擇是讓用戶自己?jiǎn)?dòng)服務(wù)器,然后,在測(cè)試結(jié)束之后關(guān)閉服務(wù)器。這么一來,每個(gè)測(cè)試都大概會(huì)是這樣:

  1. public void shouldWork() {  
  2.   ... setup server ...  
  3.   try {  
  4.     server.start();  
  5.     ... your test here ...   
  6.   } finally {  
  7.     server.stop();  
  8.   }  

作為一個(gè)框架,留給客戶使用的接口一定簡(jiǎn)單,把實(shí)現(xiàn)細(xì)節(jié)封裝在框架以內(nèi)。如果每個(gè)測(cè)試都這么寫,用戶很快就會(huì)罵娘了。現(xiàn)在的Moco的做法是使用了running方法,把Server啟停的細(xì)節(jié)封裝了起來。

  1. running(server, new Runnable() {  
  2.   @Override 
  3.   public void run() throws Exception {  
  4.     assertThat(helper.get(root()), is("foo"));  
  5.   }  
  6. }); 

我知道你不喜歡匿名內(nèi)部類,我也不喜歡,但是,這是Java的局限。等到Java 8駕臨,相信一切會(huì)有所改觀。

設(shè)置服務(wù)器,也就是在什么樣的請(qǐng)求,給什么樣的應(yīng)答。Moco有一個(gè)很關(guān)鍵的起點(diǎn),那便是DSL,要知道,之前的一段時(shí)間我剛剛完成了《領(lǐng)域特定語言》的翻譯。于是,API的可讀性成了一件非常重要的事。

說起來很簡(jiǎn)單,但是,要知道匹配請(qǐng)求的條件有很多,而且還可能任意組合。如果這些條件是彼此獨(dú)立的(“或”),我可以用變參來解決,但有時(shí),這些條件是相關(guān)的(“與”),那該怎么辦呢?拜函數(shù)式編程思路所賜,我想到了函數(shù)組合的方式。

我知道,Java沒有一等公民的函數(shù),但是,Java里有一等公民的對(duì)象,我們可以用對(duì)象模擬函數(shù),事實(shí)上,這也是很多面向?qū)ο蟪绦蛟O(shè)計(jì)語言解決函數(shù)組合的一種方式,而這種對(duì)象稱為函數(shù)對(duì)象,也叫functor。

把需要的條件封裝成一個(gè)個(gè)函數(shù)對(duì)象,然后通過幾個(gè)簡(jiǎn)單的運(yùn)算符就可以將它們組合起來。目前Moco里提供了and和or兩個(gè)運(yùn)算符用于組合。

  1. server.request(and(by(uri("/foo")), by(method("put")))).response("bar");  
  2. server.request(or(by("foo"), by(uri("/foo")))).response("bar"); 

隨著面向?qū)ο笏悸返钠占埃瘮?shù)組合的寫法會(huì)越來越普遍的,它會(huì)成為程序員工具箱中的必備品。

DSL是一個(gè)重要的考量,所以,這里沒有直接new對(duì)象,而是用函數(shù)(比如uri、method)做了一層封裝。或許你會(huì)說,那為了可讀性,我可以把類名設(shè)計(jì)成一個(gè)可讀的樣子,但new一個(gè)對(duì)象的問題在哪呢?就在new上。一方面,new是為了創(chuàng)建一個(gè)對(duì)象,這是實(shí)現(xiàn)細(xì)節(jié),與我們要表達(dá)的內(nèi)容不在一個(gè)層次,另一方面,你會(huì)發(fā)現(xiàn)多個(gè)new會(huì)讓這句話顯得不連貫。這句話?是的,我們的寫法就像是用一句話聲明一個(gè)東西一樣,而我們期望自己講的內(nèi)容有一定的連貫性,而這才是DSL。

一旦設(shè)計(jì)成DSL,單個(gè)函數(shù)的文檔也就失去了意義,更重要的是一個(gè)用法的文檔。所以,在Moco里,我寫了文檔,卻沒有寫JavaDoc。

在Moco里,請(qǐng)求和應(yīng)答里可能有同樣的東西,比如file,而request和response的參數(shù)類型是不一樣的。如果file能夠返回不同類型是***的,可惜在Java里面,我們不可能根據(jù)返回類型做重載。一種解決方案是為request和response分別設(shè)計(jì)一個(gè)函數(shù),比如requestFile和responseFile,但顯然,這種做法會(huì)把同樣的邏輯分散到兩個(gè)類實(shí)現(xiàn)里,而且這樣需要共享的東西不只是file,還有其它一些東西。

在計(jì)算機(jī)問題里,加上一個(gè)中間層永遠(yuǎn)是一個(gè)重要的解決方案。這也是by的目的所在。這樣一來,這些共享的東西就可以做成一個(gè)抽象(Resource),對(duì)請(qǐng)求來說,只要有一個(gè)by,就可以適配成Matcher。

在Moco設(shè)計(jì)中,還涉及到了一個(gè)框架設(shè)計(jì)中很重要的點(diǎn):類型。Java是靜態(tài)類型程序設(shè)計(jì)語言,利用好類型,就可以在編譯期把錯(cuò)誤報(bào)出來,而不會(huì)留到運(yùn)行時(shí),fail fast是很重要的一個(gè)程序設(shè)計(jì)實(shí)踐。

Moco目前支持一些Content Type檢測(cè)。如果把這個(gè)Content Type放到Resource里面,你會(huì)發(fā)現(xiàn)不是所有Resource都需要這個(gè),比如method,我們當(dāng)然可以在Resource接口里支持Content Type,在不需要的地方拋出異常。

在Moco里,我的做法是引入了一個(gè)ContentResource,支持Content Type,它繼承于Resource,這樣依賴,需要Content Type的接口(比如content),直接支持ContentResource,而其它部分繼續(xù)支持Resource,這樣,如果一不小心用錯(cuò)的話,編譯就會(huì)報(bào)錯(cuò)。

再有一點(diǎn)是關(guān)于Publish接口,在Moco的實(shí)現(xiàn)里有一個(gè)Setting,還有一個(gè)BaseSetting,如果觀察實(shí)現(xiàn),在設(shè)置Request會(huì)創(chuàng)建出一個(gè)BaseSetting,但其返回的接口是Setting。這么做的一個(gè)原因是,因?yàn)镾etting出現(xiàn)在用戶可以使用的接口上,而BaseSetting是留給內(nèi)部實(shí)現(xiàn)的,它提供了一些用于內(nèi)部實(shí)現(xiàn)的方法,而用戶是不應(yīng)該使用這些方法的,所以,將二者做了一個(gè)分離,這樣一來,保證了用戶不會(huì)誤操作。同樣處理的還有HttpServer和ActualHttpServer。

小結(jié)一番,簡(jiǎn)化用戶接口,設(shè)計(jì)DSL,利用好類型,區(qū)分Publish接口。

原文鏈接:http://dreamhead.blogbus.com/logs/232745877.html

責(zé)任編輯:林師授 來源: blogbus
相關(guān)推薦

2010-01-19 18:04:02

C++標(biāo)準(zhǔn)程序庫(kù)

2010-01-27 17:36:24

C++程序庫(kù)

2010-01-14 09:43:26

C++標(biāo)準(zhǔn)程序庫(kù)

2010-01-19 09:39:43

C++標(biāo)準(zhǔn)程序庫(kù)

2010-02-24 16:11:42

Python程序庫(kù)

2010-01-19 09:39:43

C++標(biāo)準(zhǔn)程序庫(kù)

2013-08-15 09:39:20

MOCOJava

2013-02-21 10:13:36

2010-01-15 14:59:54

C++標(biāo)準(zhǔn)程序庫(kù)

2013-04-22 09:21:43

2011-12-06 10:04:12

QQ手機(jī)移動(dòng)應(yīng)用應(yīng)用設(shè)計(jì)

2020-03-31 22:09:01

React應(yīng)用程序庫(kù)

2010-09-29 14:21:22

2009-06-18 10:13:00

Java設(shè)計(jì)模式

2011-04-19 08:59:33

2024-01-22 15:26:27

前端開發(fā)JavaScrip

2015-04-14 11:15:18

程序員創(chuàng)業(yè)程序員談創(chuàng)業(yè)

2015-04-20 09:50:58

程序員

2014-07-26 22:18:51

2015-04-29 09:58:48

開源C++
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 2021狠狠干| 另类一区 | 久久在线看 | 日本精品久久久久久久 | 亚洲午夜精品一区二区三区他趣 | www97影院 | 国产真实乱对白精彩久久小说 | 久久av网 | 午夜资源| 一区二区三区小视频 | 欧美在线观看一区二区 | 中文字幕视频在线观看免费 | 97久久超碰 | 九九热精品视频在线观看 | 亚洲精品一区二区 | 成人三级网址 | 在线中文字幕视频 | 夜夜摸天天操 | 免费一级做a爰片久久毛片潮喷 | 国产良家自拍 | 韩国久久精品 | 精品九九 | 日韩久久久久久 | 91视频a | 97伦理影院| 我要看黄色录像一级片 | 高清国产一区二区 | 免费毛片网 | 国精产品一区二区三区 | 亚洲成人免费观看 | 久久青草av| 欧美日韩网站 | 国产精品久久久久久久久久久久久久 | 国产在线一 | www亚洲精品 | 男女羞羞在线观看 | 国产综合第一页 | 欧美bondage紧缚视频 | 激情网站在线观看 | 91精品国产91| 九九九视频在线观看 |