精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

API設(shè)計(jì)的一些心得總結(jié)

開發(fā) 開發(fā)工具
如何設(shè)計(jì)更容易使用的API?對(duì)于不同的語言,這個(gè)答案是不一樣的,因?yàn)椴煌Z言有著不同的語言特性。本文總結(jié)了一些API設(shè)計(jì)時(shí)需要考慮的事項(xiàng),其中包括語言特性的影響。

你做過API設(shè)計(jì)么?不管你是否做過API設(shè)計(jì),都不妨看看老趙的這篇博文。在這篇文章中,老趙總結(jié)了自己進(jìn)行API設(shè)計(jì)的一些心得。

我平時(shí)的主要工作之一,便是編寫一些基礎(chǔ)及通用的類庫,能夠在項(xiàng)目中大量復(fù)用。換句話說,我的工作目的,是讓其他開發(fā)人員可以更好地完成工作。因此,如何設(shè)計(jì)更容易使用的API是我經(jīng)常要考慮的東西,偶爾也會(huì)有一些體會(huì)。而現(xiàn)在這些內(nèi)容,是我在為Functional Reactive Programing寫“參考答案”的時(shí)候忽然“總結(jié)”出來的想法。可能比較簡(jiǎn)單,但我想也是設(shè)計(jì)API是需要考慮的一些內(nèi)容。

在那篇文章里,我們是在為IEvent< T>對(duì)象提供一些封裝,其中會(huì)有MapEvent和FilterEvent等類型,為了方便調(diào)用,我們還定義了對(duì)應(yīng)的擴(kuò)展方法:

  1. public class MapEvent< TIn, TOut> : InOutEventBase< TIn, TOut>  
  2. {  
  3.     public MapEvent(Func< TIn, TOut> mapper, IEvent< TIn> inEvent)  
  4.         : base(inEvent)  
  5.     {  
  6.         ...  
  7.     }  
  8. }  
  9.  
  10. public class FilterEvent< TEventArgs> : InOutEventBase< TEventArgs, TEventArgs>  
  11. {  
  12.     public FilterEvent(Func< TEventArgs, bool> predicate, IEvent< TEventArgs> inEvent)  
  13.         : base(inEvent)  
  14.     {  
  15.         ...  
  16.     }  
  17. }  
  18.  
  19. public static class EventExtensions  
  20. {  
  21.     public static MapEvent< TIn, TOut> Merge< TIn, TOut>(  
  22.         this IEvent< TIn, TOut> ev, Func< TIn, TOut> mapper)  
  23.     {  
  24.         ...  
  25.     }  
  26.  
  27.     public static FilterEvent< TEventArgs> Filter< TEventArgs>(  
  28.         this IEvent< TEventArgs> ev, Func< TEventArgs, bool> predicate)  
  29.     {  
  30.         ...  
  31.     }  
  32. }  
  33.  

MergeEvent和FilterEvent都是對(duì)另一個(gè)Event對(duì)象的封裝,您可以當(dāng)作一種裝飾器模式來考慮。不知您觀察到?jīng)]有,這個(gè)“待封裝”的Event對(duì)象在不同的地方(構(gòu)造函數(shù)或擴(kuò)展方法),出現(xiàn)的位置是不同的。在擴(kuò)展方法中,它是作為第一個(gè)參數(shù)出現(xiàn)在參數(shù)列表中,而在構(gòu)造函數(shù)中它則是第二個(gè)參數(shù)。對(duì)于擴(kuò)展方法來說,它是由語言規(guī)范強(qiáng)制得出的。但是在構(gòu)造函數(shù)中,這出現(xiàn)的順序完全可有由我們“自由”確定。那么,我們能否將待封裝的Event對(duì)象作為構(gòu)造函數(shù)的第一個(gè)參數(shù)呢?

自然是可以的,只是我在這里傾向于放在最后。原因在于這有利于API使用時(shí)的清晰。

假如我們沒有擴(kuò)展方法,也就是說只能使用構(gòu)造函數(shù)進(jìn)行“裝飾”,那么使用現(xiàn)在則是:

  1. var ev =  
  2.     new MapEvent< intstring>(  
  3.         i => i.ToString(),  
  4.         new FilterEvent< int>(  
  5.             i => i <  10,  
  6.             new MapEvent< DateTime, int>(  
  7.                 d => d.Millisecond,  
  8.                 ...)));  
  9.  

有的時(shí)候,我會(huì)將Lambda表達(dá)式寫在上一行,這樣可以讓代碼更為緊湊。那么如果MapEvent和FilterEvent都把待封裝的Event對(duì)象作為構(gòu)造和函數(shù)的第一個(gè)參數(shù),又會(huì)怎么樣呢?

  1. var ev =  
  2.     new MapEvent< intstring>(  
  3.         new FilterEvent< int>(  
  4.             new MapEvent< DateTime, int>(  
  5.                 ...,  
  6.                 d => d.Millisecond),  
  7.             i => i <  10),  
  8.         i => i.ToString());  
  9.  

對(duì)比這兩者,在我看來它們的信息“呈現(xiàn)方式”是有顯著差距的。對(duì)于第一種情況(Event作為構(gòu)造函數(shù)最后一個(gè)參數(shù)),用戶看到這個(gè)定義時(shí),從上到下的閱讀順序是:

  1. 構(gòu)造一個(gè)MapEvent對(duì)象,映射方式是XXX
  2. 包含一個(gè)FilterEvent對(duì)象,過濾條件是YYY
  3. 包含一個(gè)MapEvent對(duì)象,映射方式是ZZZ

而對(duì)于第二種情況(Event作為構(gòu)造函數(shù)的第一個(gè)參數(shù)):

  1. 構(gòu)造一個(gè)MapEvent對(duì)象
  2. 包含一個(gè)FilterEvent對(duì)象
  3. 構(gòu)造一個(gè)MapEvent對(duì)象
  4. 最內(nèi)層MapEvent的映射方式為ZZZ
  5. 上一層FiterEvent……
  6. ……

第一種情況,API體現(xiàn)出的信息是流暢的,而第二種情況信息的體現(xiàn)是回溯的。第一種信息如“隊(duì)列”,而第二種如“棧”。第一種API閱讀起來用戶視線是單向的,而第二種API用戶可能會(huì)去努力尋找某個(gè)Lambda表達(dá)式到底對(duì)應(yīng)著哪個(gè)對(duì)象——就像我們?yōu)槭裁刺岢玦f/for不應(yīng)該嵌套太深,因?yàn)檎移ヅ涞拇罄ㄌ?hào)的確是件比較麻煩的事情。我想,應(yīng)該沒有會(huì)選擇把Event對(duì)象放在構(gòu)造函數(shù)參數(shù)列表的中間吧(如果有3個(gè)及參數(shù)),因?yàn)檫@會(huì)讓API調(diào)用看起來成“鋸齒狀”,實(shí)在不利于閱讀。

因此,在各種需要“裝飾”的場(chǎng)合,我往往都把“被裝飾者”作為構(gòu)造函數(shù)的最后一個(gè)參數(shù)。例如我在構(gòu)造DomainRoute的時(shí)候,便也是把innerRoute作為構(gòu)造函數(shù)的最后一個(gè)參數(shù),由于DouteRoute所需要的參數(shù)較多,因此如果把innerRoute作為第一個(gè)參數(shù),看起來會(huì)更加不便一些。同樣的,在之前設(shè)法“拯救C# 2.0”的時(shí)候也使用了這個(gè)做法。

當(dāng)然,這些是我個(gè)人的看法,并非所有人都是這樣做的。例如在.NET Framework中負(fù)責(zé)GZip壓縮的GZipStream對(duì)象,它的構(gòu)造函數(shù)便是將innerStream作為第一個(gè)參數(shù)出現(xiàn)。幸好,C# 3.0中已經(jīng)有了擴(kuò)展方法,如果使用構(gòu)造函數(shù)的話,即使信息再流暢,我想也不如擴(kuò)展方法來的直觀。因此,我一般都會(huì)利用擴(kuò)展方法,讓開發(fā)人員可以編寫這樣的API:

  1. dateEvent.Map(d => d.Millisecond).Filter(i => i <  10).Map(i => i.ToString())  
  2. route.WithDomain("http://www.{*domain}/blogs"new { ... });  
  3. stream.GZip(CompressionMode.Compress).Encrypt(...);  
  4.  

其實(shí)許多高級(jí)語言都會(huì)為了讓代碼寫的更易懂更清晰,因而提供一些看似“語法糖”的東西。例如F#中的|>操作符:

  1. let form = new Form(Visible = true, TopMost = true, Text = "Event Sample")  
  2. form.MouseDown  
  3.     |> Event.merge form.MouseMove  
  4.     |> Event.filter (fun args -> args.Button = MouseButtons.Left)  
  5.     |> Event.map (fun args -> (args.X, args.Y))  
  6.     |> Event.listen (fun (x, y) -> printfn "(%d, %d)" x y)  
  7.  

其實(shí)|>操作符的目的只是把函數(shù)的最后一個(gè)參數(shù)調(diào)到之前來,但它能讓我們寫出“易讀”的代碼。例如FsTest類庫允許我們這樣寫:

  1. "foo" |> should equal "foo" 
  2.  

但其實(shí),從理論上說,這種寫法完全等價(jià)于:

  1. should equal "foo" "foo" 
  2.  

正是因?yàn)橛辛藎>操作符,F(xiàn)#在這種情況下會(huì)將待封裝的Event對(duì)象作為函數(shù)的最后一個(gè)參數(shù)。這便是語言特性對(duì)API設(shè)計(jì)的影響。此外,F(xiàn)#中的“>>”以及Haskell的“.”可用“`”把一個(gè)函數(shù)作為中綴操作符來使用。但如果是Java這樣的語言,由于缺乏一些靈活的語法特性,開發(fā)人員就只能靠框架和類庫來構(gòu)建“Fluent Interface”來度過難關(guān)了(如Google Collections)。《卓有成效的程序員》一書中舉了這么一個(gè)例子,它們?yōu)橐粋€(gè)Car對(duì)象的構(gòu)造編寫了流暢接口:

  1. Car car = Car.describedAs().  
  2.              .box()  
  3.              .length(50.5)  
  4.              .type(Type.INSULATED)  
  5.              .includes(Equipment.LADDER)  
  6.              .lining(Lining.CORK);  
  7.  

以代替呆板的Java語法:

  1. Car car = new CarImpl();  
  2. MarketingDescription desc = newMarketingDescriptionImpl();  
  3. desc.setType("Box");  
  4. desc.setSubType("Insulated");  
  5. desc.setAttribute("length""50.5");  
  6. desc.setAttribute("ladder""yes");  
  7. desc.setAttribute("lining type""cork");  
  8. car.setDescription(desc)  
  9.  

似乎程序員永遠(yuǎn)不會(huì)放棄這方面追求:編寫更清晰,更易懂的代碼。

【編輯推薦】

  1. C# 3.0新語言特性淺析
  2. 利用Visual C#和C#語言特性
  3. Jython入門指導(dǎo):語言特性簡(jiǎn)介
  4. 比較幾個(gè)JDK版本的新增語言特性
  5. 哪種語言將統(tǒng)治多核時(shí)代 再看函數(shù)式語言特性
責(zé)任編輯:yangsai 來源: 博客園
相關(guān)推薦

2011-09-19 10:15:10

移動(dòng)界面設(shè)計(jì)

2025-05-09 09:10:00

2014-08-14 09:25:31

Linux串口

2011-07-13 09:13:56

Android設(shè)計(jì)

2015-12-08 09:05:41

Java內(nèi)部類

2009-06-22 15:36:00

如何學(xué)好java

2011-07-12 09:47:53

WebService

2011-11-28 15:57:26

MySQL數(shù)據(jù)庫主從配置

2011-06-16 20:35:34

SEO

2009-07-15 16:16:22

JDBC下載

2009-11-25 10:08:41

Cisco無線路由

2020-04-10 08:50:37

Shell腳本循環(huán)

2012-07-03 13:55:00

ASP.NET

2013-12-24 14:50:39

Ember.js框架

2020-05-19 14:35:42

Shell腳本循環(huán)

2012-06-07 10:17:55

軟件設(shè)計(jì)設(shè)計(jì)原則Java

2009-11-26 10:32:57

PHP代碼優(yōu)化

2020-09-28 06:45:42

故障復(fù)盤修復(fù)

2019-08-19 14:56:07

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

2012-01-09 16:02:19

JavaJVM
點(diǎn)贊
收藏

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

亚洲wwww| 五月婷婷久久久| 国产电影一区二区在线观看| 欧美一区二区二区| 欧美国产视频一区| 男女视频在线观看| 久久国产精品72免费观看| 久久成人人人人精品欧| 亚洲精品在线视频免费观看| 久久精品黄色| 图片区小说区国产精品视频| 日本中文不卡| 亚洲精品911| 天堂成人国产精品一区| 欧美日韩国产va另类| 爱爱的免费视频| 国产一区二区三区精品在线观看 | 欧美日韩综合一区二区| 中文字幕一区图| 欧美亚洲动漫精品| 人妻无码久久一区二区三区免费| jzzjzzjzz亚洲成熟少妇| 国产凹凸在线观看一区二区| 国产精品久久91| 日本特黄特色aaa大片免费| 欧美视频免费| 日韩国产一区三区| 91大神免费观看| 成人自拍视频网| 亚洲成a人片综合在线| 亚洲国产一区二区精品视频 | 亚洲女人天堂成人av在线| 手机精品视频在线| 日韩不卡在线| 黑人巨大精品欧美一区二区三区| 日本一本草久p| 尤物网址在线观看| 国产日韩精品一区二区三区 | 国产一区二区三区天码| 精品av综合导航| 无码人妻一区二区三区在线视频| 日韩不卡在线| 日本电影亚洲天堂一区| 自慰无码一区二区三区| 超黄网站在线观看| 一区二区久久久久| 国产日产欧美一区二区| 91av资源在线| 欧美国产日本韩| 欧美三级网色| 欧美精品少妇| 91捆绑美女网站| 国产伦精品一区二区三区免| 国产suv精品一区二区69| 久久91精品国产91久久小草| 国产精品久久久久久婷婷天堂 | 91精品国产综合久久久久| 青青草精品视频在线观看| 欧美人与性动交xxⅹxx| 欧美日韩国产麻豆| 久久国产亚洲精品无码| 草草视频在线观看| 精品国产乱码久久久久酒店| 免费在线观看视频a| 国产伦子伦对白在线播放观看| 一区二区三区**美女毛片| 日本丰满大乳奶| 26uuu亚洲电影在线观看| 亚洲男人电影天堂| 成人在线观看毛片| 高清电影在线观看免费| 五月婷婷激情综合| 青青视频在线播放| 日韩中文影院| 欧美日韩aaaaaa| aaa一级黄色片| 亚洲午夜免费| 亚洲精品一区中文字幕乱码| 精品无人区无码乱码毛片国产| 精品精品久久| 久热精品视频在线观看一区| 欧美日韩在线观看免费| 在线高清一区| 日韩美女视频在线观看| 91成年人视频| 国产盗摄女厕一区二区三区| 国产综合色一区二区三区| 青青草在线免费观看| 欧美国产国产综合| 国内自拍中文字幕| 中文字幕资源网在线观看免费| 色综合久久久久久久久久久| 中文字幕亚洲乱码| 日韩精品视频中文字幕| 日韩av一区二区在线| 国产精品无码网站| 三上亚洲一区二区| 欧美黄色三级网站| 无码人妻av一区二区三区波多野 | 国产精品第二页| 国产乱码一区二区| 91免费看视频| 人人妻人人澡人人爽精品欧美一区| 免费在线看电影| 91久久精品网| 曰本三级日本三级日本三级| 久久不见久久见国语| 欧美成人激情视频| 久操视频在线免费观看| 国产成人av网站| 视频一区二区三| 国产网红在线观看| 欧美日韩国产综合草草| 精品中文字幕在线播放| 亚洲欧美网站在线观看| 奇门遁甲1982国语版免费观看高清| 一级片aaaa| 97se亚洲国产综合自在线 | 91久久久久| 国产一区二区丝袜高跟鞋图片| 无码国精品一区二区免费蜜桃| 国产精品黄色在线观看| 日本一道本久久| 国产精品一区二区精品| 亚洲天堂久久av| 日韩毛片在线播放| 国产精品一品视频| 色播五月综合| 黑人巨大亚洲一区二区久| 日韩欧美久久久| 可以免费看av的网址| 久久精品女人| 精品久久久久久一区二区里番| 18网站在线观看| 欧美日韩国产欧美日美国产精品| 亚洲国产欧美视频| 亚洲国内精品| av成人综合网| www在线观看播放免费视频日本| 在线精品视频一区二区三四| 国产又黄又粗又猛又爽的视频| 欧美一区久久| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | av中文字幕在线观看| 欧美日韩亚洲高清一区二区| 国产特黄级aaaaa片免| 亚洲日本久久| 国产综合 伊人色| 91九色在线看| 亚洲国模精品一区| 日本一区二区欧美| 成人精品小蝌蚪| av网站大全免费| jizz国产精品| 国内免费久久久久久久久久久 | 亚洲一区二区三区乱码| 久久91导航| 亚洲无亚洲人成网站77777| 中文字幕在线欧美| 国产亚洲人成网站| 国产wwwxx| 久久资源中文字幕| 91理论片午午论夜理片久久| 黄色大片在线播放| 日韩亚洲国产中文字幕欧美| 精国产品一区二区三区a片| 国产成人午夜99999| 国产女主播自拍| 乱中年女人伦av一区二区| 57pao精品| 国产福利电影在线| 欧美理论电影在线| 麻豆亚洲av成人无码久久精品| 国产成人免费在线观看| 欧美极品欧美精品欧美| 国产精品片aa在线观看| 成人黄色av网站| 怡红院在线播放| 亚洲黄色av网站| 日韩在线播放中文字幕| 中文字幕av免费专区久久| 成人av毛片在线观看| 激情久久久久久| 秋霞久久久久久一区二区| 精品自拍视频| 欧美精品激情视频| 日本国产在线| 欧美精品久久久久久久多人混战| 欧美精品成人久久| 99久久免费视频.com| 好男人www社区| 午夜精品婷婷| 日本欧美精品久久久| 亚洲日韩中文字幕一区| 国产69精品99久久久久久宅男| 邻居大乳一区二区三区| 欧美一区二区美女| √资源天堂中文在线| 成人免费在线视频观看| 无码精品一区二区三区在线播放 | 国产资源中文字幕| 一区二区日韩免费看| 亚洲精品一区二区三区四区五区| 欧美一级大片在线视频| 欧美自拍大量在线观看| av网站在线免费看推荐| 亚洲视频免费一区| www.久久成人| 欧美揉bbbbb揉bbbbb| 国产在线视频卡一卡二| 亚洲欧洲国产专区| 51调教丨国产调教视频| 国产乱人伦偷精品视频不卡| 成人亚洲视频在线观看| 精品9999| 好色先生视频污| 精品日韩欧美一区| 国产亚洲一区二区三区在线播放| 日本中文字幕视频一区| 91福利视频在线观看| 中文字幕资源网在线观看| 一本一本久久a久久精品牛牛影视| 欧美熟妇另类久久久久久不卡 | 国产二区视频在线播放| 欧美三级黄美女| 亚洲欧洲免费无码| 国产精品一区二区av交换| 国产日韩亚洲精品| 经典三级久久| 国产中文日韩欧美| 亚州一区二区三区| 欧美在线一级va免费观看| 蜜臀av在线| 欧美久久精品午夜青青大伊人 | 欧美区二区三区| 欧美成人高清在线| 中文字幕日韩欧美在线视频| 偷拍自拍在线| 亚洲毛片在线观看| 婷婷五月综合激情| 亚洲成人中文字幕| 丰满肥臀噗嗤啊x99av| 欧美一区二区三区视频| 国产精品永久久久久久久久久| 欧美视频三区在线播放| 日韩在线视频不卡| 色哟哟精品一区| av黄色在线播放| 欧美性猛交xxxx黑人| 天堂中文在线网| 欧美性xxxx极品hd欧美风情| 成年人免费高清视频| 狠狠色狠狠色综合日日五| 久久青青草视频| 黑人巨大精品欧美一区免费视频 | 老司机精品影院| 日韩视频在线免费观看| 色视频在线免费观看| 色狠狠久久aa北条麻妃| 尤物在线视频| 欧美成人网在线| 秋霞在线午夜| 午夜精品久久久久久99热| av影院在线| 欧美性受xxxx黑人猛交| 成人影院av| 国产精品久久久| **国产精品| 国产精品一国产精品最新章节| 久久亚洲道色| 欧美一区二区三区在线播放| 日本不卡电影| 欧美 国产 精品| 国产一区二区三区四区老人| 婷婷五月综合缴情在线视频| 午夜在线播放视频欧美| 美女黄色片视频| 国产一区二区日韩精品| 久久久午夜精品福利内容| 久久久久久亚洲综合影院红桃| 四虎成人免费影院| 一区二区三区欧美在线观看| 久久午夜免费视频| 精品1区2区3区| 亚洲精品久久久久avwww潮水| 亚洲国内精品视频| 在线看黄色av| 久久久久久久av| 日韩毛片一区| av一区二区三区免费| 久久av影视| 国产资源第一页| 免费在线成人| 91精品国产三级| 91丝袜高跟美女视频| 国产在线免费看| 偷拍与自拍一区| 国产精品系列视频| 日韩国产精品视频| 在线观看小视频| 国产99久久精品一区二区永久免费 | 97人人模人人爽人人喊中文字| 日韩成人亚洲| 国产精品香蕉视屏| 欧美大片aaaa| 欧美aⅴ在线观看| 丁香一区二区三区| 自拍偷拍第9页| 欧美日韩在线另类| 国产福利资源在线| 中文字幕在线亚洲| 丝袜诱惑一区二区| 97久久人人超碰caoprom欧美| 国产欧美日韩精品一区二区免费 | 欧美日韩黄色影视| 美国一级片在线免费观看视频| 成年人精品视频| 成人久久网站| 欧美日韩亚洲在线| 在线观看一区视频| 91香蕉视频免费看| 综合自拍亚洲综合图不卡区| 日韩在线 中文字幕| 亚洲丁香婷深爱综合| 国产黄a三级三级三级av在线看| 日本免费久久高清视频| 国产调教精品| 91免费国产精品| 国内精品视频一区二区三区八戒| 久久精品国产亚洲av久| 天天影视色香欲综合网老头| www.国产.com| 久久天天躁狠狠躁老女人| 农村妇女一区二区| 五月天丁香综合久久国产| 麻豆精品91| 三上悠亚影音先锋| 欧美日韩在线看| 免费国产在线视频| 日本成熟性欧美| 日韩影视在线观看| 日韩免费视频播放| 成人av动漫在线| 中文字幕一区二区三区手机版| 欧美一区二区大片| 在线观看的网站你懂的| 亚洲精品日产aⅴ| 香蕉久久网站| 91丝袜超薄交口足| 亚洲日本一区二区| 国产高清免费观看| 久久久久国产精品www| 136福利精品导航| 日本欧美视频在线观看| 成人黄色在线网站| 亚洲 欧美 视频| 国产丝袜精品视频| 免费成人直播| 性欧美.com| 国产一区二区三区精品欧美日韩一区二区三区 | ccyy激情综合| 91视频 -- 69xx| 久久这里只有精品6| 午夜视频网站在线观看| 色婷婷综合久久久久| 国产精品国产三级在线观看| 久久最新免费视频| 成人av在线影院| 精品国产乱子伦| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 欧美日韩精品系列| 中文字幕伦理免费在线视频 | 97精品在线视频| 亚洲影院天堂中文av色| 无限资源日本好片| 亚洲日本丝袜连裤袜办公室| 欧洲av在线播放| 日韩免费不卡av| 999国产精品永久免费视频app| 中文字幕欧美视频| 黑人狂躁日本妞一区二区三区 | 国产精品久久久久久久久毛片| 欧美成年人视频网站| 玖玖玖免费嫩草在线影院一区| 可以免费观看av毛片| 亚洲欧洲精品成人久久奇米网| 高清国产mv在线观看| 国产精品成人v| 牛牛国产精品| 黄色aaa视频| 欧美一级淫片007| 亚洲黄色网址| 国产免费xxx| 久久久久久免费网| www.天堂av.com| 国产极品jizzhd欧美| 午夜电影亚洲| 91成人精品一区二区| 精品国产乱码久久久久久久久| 亚州一区二区三区|