日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

接口隔離原則實(shí)戰(zhàn):從一次訂單服務(wù)重構(gòu)看胖接口拆分與設(shè)計(jì)邊界

接口隔離原則實(shí)戰(zhàn):從一次訂單服務(wù)重構(gòu)看胖接口拆分與設(shè)計(jì)邊界 1. 一次改一個(gè)方法炸一片調(diào)用方的重構(gòu)現(xiàn)場(chǎng)這事發(fā)生在我前司一個(gè)中臺(tái)服務(wù)里印象特別深。當(dāng)時(shí)有個(gè)OrderService接口里面塞了二十多個(gè)方法從創(chuàng)建訂單、取消訂單、支付、退款到查詢(xún)明細(xì)、導(dǎo)出報(bào)表再到運(yùn)營(yíng)后臺(tái)的審核、風(fēng)控標(biāo)記全在一個(gè)接口里。我們十幾個(gè)團(tuán)隊(duì)各自截取自己需要的部分在調(diào)用看起來(lái)共享接口很規(guī)范直到有人改了其中一個(gè)方法的簽名。那個(gè)方法叫queryOrderItems(Long orderId)本來(lái)只給訂單詳情頁(yè)用。改的人想給它加一個(gè)分頁(yè)參數(shù)于是把簽名改成了queryOrderItems(Long orderId, int page, int size)。結(jié)果一編譯全公司三十多處調(diào)用同時(shí)報(bào)錯(cuò)因?yàn)樗幸蕾?lài)OrderService的代碼都直接看到了這個(gè)變化。其中至少七八處只是拿這個(gè)接口做依賴(lài)注入實(shí)際上根本沒(méi)用過(guò)queryOrderItems。他們被迫跟著改或者臨時(shí)包一層適配。這就是接口隔離原則Interface Segregation PrincipleISP要解決的問(wèn)題。它說(shuō)得很直白客戶(hù)端不應(yīng)該被迫依賴(lài)它不使用的方法。當(dāng)年Robert C. Martin提出這一條的時(shí)候針對(duì)的是胖接口帶來(lái)的耦合放到今天反而更值得重視——我們有了Spring Boot、微服務(wù)、各種RPC框架接口的粒度直接決定了改一個(gè)東西要不要拉動(dòng)一群人開(kāi)會(huì)。如果你正在學(xué)Java設(shè)計(jì)模式或者準(zhǔn)備設(shè)計(jì)模式期末考試這條原則很多人會(huì)背定義但真正理解它為什么存在、什么時(shí)候該下手拆、拆到什么程度為止才是筆試和面試?yán)锢_(kāi)差距的地方。這篇文章我把自己的踩坑經(jīng)歷、拆分過(guò)程和判斷標(biāo)準(zhǔn)完整寫(xiě)出來(lái)按我的習(xí)慣先講事故再講原理最后給能直接抄的實(shí)踐。1.1 事故背后的代碼結(jié)構(gòu)當(dāng)時(shí)那個(gè)OrderService大概長(zhǎng)這樣public interface OrderService { void createOrder(Order order); void cancelOrder(Long orderId); void payOrder(Long orderId, PaymentMethod method); void refundOrder(Long orderId); ListOrderItem queryOrderItems(Long orderId); void exportOrders(ExportRequest request); void auditOrder(Long orderId); void markFraudOrder(Long orderId); }注意看這里payOrder和auditOrder完全不是一種性質(zhì)的方法。前者是C端用戶(hù)在交易鏈路里的核心動(dòng)作每秒可能幾百次調(diào)用后者是運(yùn)營(yíng)在后臺(tái)偶爾點(diǎn)擊的管理操作一天調(diào)用幾十次。它們的變化頻率不同、調(diào)用方不同、出問(wèn)題的影響面也不同卻因?yàn)槎己陀唵斡嘘P(guān)被塞進(jìn)了同一個(gè)接口。網(wǎng)上搜接口隔離原則的時(shí)候最常見(jiàn)的描述是用多個(gè)專(zhuān)門(mén)的接口優(yōu)于一個(gè)臃腫的總接口這句話(huà)沒(méi)錯(cuò)但光記住這句話(huà)沒(méi)用。你得能識(shí)別出哪些方法屬于同一種變化哪些方法只是碰巧屬于同一個(gè)業(yè)務(wù)領(lǐng)域。前者應(yīng)該放一起后者應(yīng)該拆開(kāi)。1.2 為什么大家一起改會(huì)變成災(zāi)難回到那次事故。讓我把事情說(shuō)得更細(xì)改方法的人只通知了自己團(tuán)隊(duì)因?yàn)樗X(jué)得我就改一個(gè)查詢(xún)方法跟別人有什么關(guān)系。但Java接口的編譯期強(qiáng)約束讓所有引用它的類(lèi)都暴露了。你以為是局部修改編譯器告訴你這是全量修改。這種問(wèn)題在動(dòng)態(tài)語(yǔ)言里不一定會(huì)暴露但在強(qiáng)類(lèi)型語(yǔ)言里會(huì)被放大。所以你會(huì)發(fā)現(xiàn)接口隔離原則在Java生態(tài)里討論得特別多因?yàn)檎Z(yǔ)言特性決定了接口一旦變更所有依賴(lài)方都要感知。你沒(méi)法裝作沒(méi)看見(jiàn)。更深層的問(wèn)題是這種大接口會(huì)讓團(tuán)隊(duì)失去安全修改的勇氣。后來(lái)我們統(tǒng)計(jì)了一下導(dǎo)致那次重構(gòu)的原因很簡(jiǎn)單詳情頁(yè)的數(shù)據(jù)量漲了不分頁(yè)不行。可就是這樣一個(gè)合理的需求因?yàn)榻涌谠O(shè)計(jì)不合理演變成了跨團(tuán)隊(duì)協(xié)同問(wèn)題。我用一句話(huà)總結(jié)當(dāng)時(shí)的局面接口越大改接口的顧慮就越多顧慮越多大家就越傾向于不打理接口結(jié)果接口越來(lái)越大。這是個(gè)惡性循環(huán)。2. 接口隔離原則到底在隔離什么先糾正三個(gè)常見(jiàn)誤解接口隔離原則的原文是Clients should not be forced to depend on methods they do not use.直譯過(guò)來(lái)就是客戶(hù)端不應(yīng)被迫依賴(lài)它們不使用的方法。這句話(huà)關(guān)鍵在客戶(hù)端三個(gè)字。它不是站在實(shí)現(xiàn)類(lèi)的角度說(shuō)你實(shí)現(xiàn)了很多方法所以你要拆而是站在調(diào)用方的角度說(shuō)你只用到其中兩個(gè)方法我就只讓你看到這兩個(gè)方法。隔離的不是方法而是依賴(lài)關(guān)系。2.1 誤解一接口隔離就是把大接口拆成小接口很多文章只講了一半。拆成小接口只是手段真正的目的是讓不同客戶(hù)端之間的依賴(lài)互不可見(jiàn)。如果只是把二十個(gè)方法拆成五個(gè)接口但所有客戶(hù)端依然注入具體的實(shí)現(xiàn)類(lèi)那隔離效果等于零因?yàn)榭蛻?hù)端還是能看到實(shí)現(xiàn)類(lèi)的全部方法。正確的做法是讓客戶(hù)端面向自己需要的接口編程。什么時(shí)候拆、拆多細(xì)取決于客戶(hù)端有沒(méi)有被迫依賴(lài)它不使用的方法。如果沒(méi)有這種被迫一個(gè)接口里有十個(gè)方法也不算違反ISP。舉個(gè)例子一個(gè)通訊錄工具類(lèi)內(nèi)部封裝了本地存儲(chǔ)和網(wǎng)絡(luò)同步對(duì)外暴露了addContact、deleteContact、syncContacts三個(gè)方法。假設(shè)只有一個(gè)頁(yè)面使用它而且三個(gè)方法都會(huì)用到那它雖然是三個(gè)功能也不違反ISP。反過(guò)來(lái)如果有一個(gè)模塊只做網(wǎng)絡(luò)同步卻被強(qiáng)制看到了本地?cái)?shù)據(jù)庫(kù)的增刪改那就算只有一個(gè)方法也是違反ISP。2.2 誤解二接口隔離就是單一職責(zé)原則這是我在面試?yán)镒畛B?tīng)到的混淆。單一職責(zé)原則SRP針對(duì)的是類(lèi)和模塊說(shuō)的是一個(gè)類(lèi)應(yīng)該只有一個(gè)引起它變化的原因解決的是內(nèi)聚性問(wèn)題。接口隔離原則針對(duì)的是客戶(hù)端與契約之間的關(guān)系解決的是耦合性問(wèn)題。兩者有關(guān)系但不完全是一回事。一個(gè)類(lèi)可能已經(jīng)符合SRP內(nèi)部只處理訂單金額計(jì)算但它暴露的接口可能非常寬——比如把金額計(jì)算、日志、緩存全部塞在一個(gè)接口方法里反過(guò)來(lái)一個(gè)類(lèi)可能同時(shí)干了訂單校驗(yàn)和庫(kù)存扣減兩件事不太符合SRP但它對(duì)客戶(hù)端暴露的是兩個(gè)小接口客戶(hù)端按需依賴(lài)這在ISP層面是達(dá)標(biāo)的。更準(zhǔn)確地說(shuō)SRP關(guān)注的是為什么這個(gè)類(lèi)會(huì)變ISP關(guān)注的是客戶(hù)端看到了什么。2.3 誤解三接口隔離只針對(duì)Java的interface關(guān)鍵字接口隔離里面的接口指的是任何形式的調(diào)用契約不只是Java里的interface。一個(gè)開(kāi)放給前端調(diào)用的REST API路徑集合是一種接口一個(gè)Spring的Service類(lèi)對(duì)外公開(kāi)的public方法是一種接口一個(gè)消息隊(duì)列里的Topic及消息結(jié)構(gòu)也可以理解為一種接口。接口隔離的核心思想是你對(duì)外暴露的能力應(yīng)該是按使用場(chǎng)景分組而不是按內(nèi)部實(shí)現(xiàn)分組。這一點(diǎn)在微服務(wù)架構(gòu)里尤其明顯。很多人做微服務(wù)拆分時(shí)按數(shù)據(jù)庫(kù)表來(lái)切服務(wù)訂單庫(kù)就拆出訂單服務(wù)用戶(hù)庫(kù)里就拆出用戶(hù)服務(wù)。結(jié)果訂單服務(wù)暴露出來(lái)的接口五花八門(mén)既有C端查詢(xún)又有后臺(tái)審核還有定時(shí)任務(wù)用到的批量掃描。這就是把接口隔離這個(gè)理念忘到了腦后——服務(wù)邊界是有了但契約粒度仍然混亂。3. 用訂單系統(tǒng)做一次完整拆分從胖接口到按調(diào)用方劃分的獨(dú)立契約光講理論沒(méi)意思我把前面提到的訂單系統(tǒng)完整拆一遍。你把這個(gè)過(guò)程跑通比看十篇定義都管用。3.1 原始設(shè)計(jì)到底問(wèn)題出在哪假設(shè)訂單系統(tǒng)的使用方主要有四類(lèi)C端交易鏈路下單、支付、退款、查訂單運(yùn)營(yíng)后臺(tái)審核異常訂單、導(dǎo)出報(bào)表數(shù)據(jù)同步任務(wù)批量拉取訂單定時(shí)同步到數(shù)據(jù)倉(cāng)庫(kù)客服工作臺(tái)查詢(xún)訂單狀態(tài)、修改備注原始設(shè)計(jì)把所有這些都放進(jìn)了OrderService?,F(xiàn)在我要做接口隔離不是直接把OrderService按訂單、支付、審核這種業(yè)務(wù)切片來(lái)拆而是先問(wèn)一個(gè)問(wèn)題哪幾組方法的調(diào)用方集合高度重疊而且變化頻率接近答案很明顯。C端用戶(hù)永遠(yuǎn)不會(huì)調(diào)auditOrder運(yùn)營(yíng)后臺(tái)不應(yīng)該觸發(fā)payOrder數(shù)據(jù)同步任務(wù)只需要批量查詢(xún)而完全不需要任何寫(xiě)操作。所以按照調(diào)用方來(lái)分至少可以拆成四組。3.2 拆分按調(diào)用方依賴(lài)的最小集合切分我是這樣拆的public interface OrderWriteService { void createOrder(Order order); void cancelOrder(Long orderId); } public interface OrderPaymentService { void payOrder(Long orderId, PaymentMethod method); void refundOrder(Long orderId); } public interface OrderQueryService { OrderDetailVO getOrderDetail(Long orderId); ListOrderItem queryOrderItems(Long orderId, int page, int size); void exportOrders(ExportRequest request); } public interface OrderAdminService { void auditOrder(Long orderId, AuditDecision decision); void markFraudOrder(Long orderId); }然后具體的訂單服務(wù)實(shí)現(xiàn)類(lèi)依然可以一個(gè)類(lèi)頂四個(gè)接口Service public class OrderServiceImpl implements OrderWriteService, OrderPaymentService, OrderQueryService, OrderAdminService { // 每個(gè)方法的具體實(shí)現(xiàn)不變 }注意這個(gè)細(xì)節(jié)實(shí)現(xiàn)類(lèi)的數(shù)量沒(méi)有發(fā)生變化變的是客戶(hù)端能看到的視角。同樣一個(gè)業(yè)務(wù)對(duì)象在C端控制器里注入的是OrderWriteService和OrderPaymentService在運(yùn)營(yíng)后臺(tái)控制器里注入的是OrderAdminService在數(shù)據(jù)導(dǎo)出模塊里注入的是OrderQueryService。RestController RequestMapping(/api/orders) public class OrderController { private final OrderWriteService orderWriteService; private final OrderPaymentService orderPaymentService; public OrderController(OrderWriteService orderWriteService, OrderPaymentService orderPaymentService) { this.orderWriteService orderWriteService; this.orderPaymentService orderPaymentService; } // 這里只能調(diào)用下單、取消、支付、退款看不到審核和導(dǎo)出方法 }將來(lái)如果有人改了queryOrderItems的分頁(yè)邏輯C端控制器完全無(wú)感因?yàn)樗囊蕾?lài)?yán)锔緵](méi)有OrderQueryService。這就是隔離帶來(lái)的直接效果。3.3 拆分后測(cè)試和Mock發(fā)生了什么變化這個(gè)收益很多人沒(méi)意識(shí)到但實(shí)際價(jià)值非常大。在拆分之前單元測(cè)試?yán)镆猰ock一個(gè)OrderService大概長(zhǎng)這樣OrderService orderService mock(OrderService.class); when(orderService.payOrder(anyLong(), any())).thenReturn(paymentResult);看起來(lái)也沒(méi)啥但你要知道OrderService有二十多個(gè)方法每新增一個(gè)方法所有測(cè)試樁類(lèi)都要跟著適配。尤其在用Mockito做mock()的時(shí)候雖然Mockito不強(qiáng)制實(shí)現(xiàn)所有方法但如果代碼里用了Spring的MockBean并且測(cè)試上下文會(huì)去創(chuàng)建實(shí)現(xiàn)類(lèi)新方法一旦依賴(lài)了未初始化的組件測(cè)試啟動(dòng)就會(huì)爆。拆分之后mock對(duì)象變得非常小OrderPaymentService paymentService mock(OrderPaymentService.class); when(paymentService.payOrder(anyLong(), any())).thenReturn(paymentResult);測(cè)試需要構(gòu)造的前置條件更少理解成本更低新人接手時(shí)能更快搞清楚這個(gè)測(cè)試到底在驗(yàn)證什么。接口越小測(cè)試樁越小測(cè)試樁越小寫(xiě)測(cè)試的意愿就越強(qiáng)。這是接口隔離原則帶來(lái)的一個(gè)很現(xiàn)實(shí)的紅利。4. 接口隔離真正帶來(lái)的三筆收益可控的變更、可驗(yàn)證的行為、可并行的團(tuán)隊(duì)很多人覺(jué)得接口隔離是個(gè)代碼潔癖層面的原則不遵守也不影響系統(tǒng)運(yùn)行。這是大錯(cuò)特錯(cuò)。我在實(shí)際項(xiàng)目里體會(huì)到的收益可以歸納成三筆賬。4.1 變更影響面被鎖死在接口邊界內(nèi)軟件維護(hù)成本的大頭在變更不在初始開(kāi)發(fā)。一個(gè)接口里方法越多涉及的業(yè)務(wù)領(lǐng)域越多它被改動(dòng)的概率就越大改動(dòng)時(shí)波及的范圍也越大。拿我經(jīng)歷過(guò)的一個(gè)例子來(lái)說(shuō)。有一次產(chǎn)品要求給訂單詳情頁(yè)加一個(gè)預(yù)計(jì)送達(dá)時(shí)間這本身只涉及查詢(xún)鏈路。由于我們把OrderQueryService單獨(dú)拆了出來(lái)后端只需要在OrderQueryService和對(duì)應(yīng)實(shí)現(xiàn)類(lèi)里動(dòng)刀C端控制器的依賴(lài)注入都不需要改。部署的時(shí)候我只需要確認(rèn)查詢(xún)服務(wù)兼容舊接口其他團(tuán)隊(duì)完全不用跟著發(fā)版。如果你把這一點(diǎn)放到微服務(wù)之間就更能體會(huì)了服務(wù)A給服務(wù)B提供的接口如果是一個(gè)大而全的訂單服務(wù)接口B只是在用其中兩個(gè)字段但A因?yàn)樽约旱男枨髷U(kuò)展了接口入?yún)⒒蚍祷刂礏就要被迫回歸測(cè)試甚至因?yàn)樾蛄谢兓苯訄?bào)錯(cuò)。這不是技術(shù)問(wèn)題是契約設(shè)計(jì)問(wèn)題。4.2 mock、stub變小帶來(lái)測(cè)試意愿提升第二筆收益是測(cè)試體驗(yàn)。在大型項(xiàng)目里測(cè)試代碼的維護(hù)成本有時(shí)候比業(yè)務(wù)代碼還高。胖接口會(huì)導(dǎo)致兩個(gè)典型問(wèn)題一是mock配置特別長(zhǎng)。因?yàn)榻涌诜椒ㄌ嗄銥榱俗咄ㄒ粭l測(cè)試路徑要when掉很多你不關(guān)心的方法否則某些分支會(huì)把調(diào)用打到null對(duì)象上。二是測(cè)試意圖模糊。一個(gè)測(cè)試?yán)锿瑫r(shí)出現(xiàn)了payOrder、exportOrders、auditOrder的mock讀測(cè)試代碼的人會(huì)疑惑我到底在測(cè)什么模塊按調(diào)用方拆小接口后每個(gè)測(cè)試的依賴(lài)面變得非常聚焦。我的習(xí)慣是如果一個(gè)測(cè)試需要mock超過(guò)三個(gè)方法就會(huì)懷疑被測(cè)單元的依賴(lài)設(shè)計(jì)是不是太粗了。接口隔離做得好這個(gè)數(shù)字通常不會(huì)失控。4.3 團(tuán)隊(duì)間耦合降低發(fā)布節(jié)奏不再互相拖累第三筆收益最容易被忽略但長(zhǎng)期價(jià)值最大。大接口意味著大團(tuán)隊(duì)的共享邊界。多人同時(shí)在一個(gè)接口上修改合并沖突只是表面現(xiàn)象真正的痛點(diǎn)是互相等待——A團(tuán)隊(duì)要加一個(gè)方法得跟B團(tuán)隊(duì)商量會(huì)不會(huì)影響他們的實(shí)現(xiàn)B團(tuán)隊(duì)不敢隨便重構(gòu)因?yàn)椴恢繡團(tuán)隊(duì)依賴(lài)了哪個(gè)方法。UI設(shè)計(jì)里有個(gè)詞叫認(rèn)知負(fù)荷同樣適用于接口設(shè)計(jì)。一個(gè)調(diào)用方必須理解二十個(gè)方法才能正確使用其中一個(gè)這個(gè)接口就是在給團(tuán)隊(duì)增加認(rèn)知負(fù)荷。拆分之后新成員接手某個(gè)模塊時(shí)只需要閱讀他關(guān)心的那個(gè)小接口學(xué)習(xí)成本直接砍掉一半以上。5. 別把隔離做成碎片化什么時(shí)候不該拆以及怎么判斷接口隔離原則講得太多會(huì)有人走向另一個(gè)極端一個(gè)方法一個(gè)接口到處是三五行的細(xì)碎接口調(diào)用方為了完成一個(gè)業(yè)務(wù)流程要注入五六個(gè)依賴(lài)。這不是隔離這是碎片化。5.1 接口碎片化的典型癥狀碎片化的接口長(zhǎng)什么樣我在代碼評(píng)審里見(jiàn)過(guò)這樣的設(shè)計(jì)public interface OrderCreator { void createOrder(Order order); } public interface OrderCanceller { void cancelOrder(Long orderId); } public interface OrderPayer { void payOrder(Long orderId, PaymentMethod method); } public interface OrderRefunder { void refundOrder(Long orderId); }然后每個(gè)調(diào)用方都要注入四個(gè)接口public class OrderFacade { private final OrderCreator creator; private final OrderCanceller canceller; private final OrderPayer payer; private final OrderRefunder refunder; // 構(gòu)造函數(shù)注入四個(gè)依賴(lài) }你發(fā)現(xiàn)問(wèn)題了嗎OrderFacade雖然注入了四個(gè)小接口但它依然是一個(gè)同時(shí)依賴(lài)下單、取消、支付、退款的客戶(hù)端。拆分接口并沒(méi)有消除它的寬依賴(lài)只是把一個(gè)大接口換成了四個(gè)小接口的排列組合。從依賴(lài)數(shù)量來(lái)說(shuō)甚至更差了。所以判斷接口隔離做得好不好不是看接口數(shù)量多了還是少了而是看每個(gè)客戶(hù)端的依賴(lài)是否剛好等于它需要的最小集合。如果拆分之后客戶(hù)端還是需要把多個(gè)接口組裝起來(lái)才能干活那就要考慮是不是該用一個(gè)聚合接口。5.2 判斷該不該拆的四條標(biāo)準(zhǔn)我總結(jié)了自己的四條判斷標(biāo)準(zhǔn)基本能覆蓋日常開(kāi)發(fā)里大部分情況第一有沒(méi)有實(shí)現(xiàn)類(lèi)被迫拋異常。如果存在UnsupportedOperationException或者某個(gè)方法返回Collections.emptyList()、null來(lái)應(yīng)付調(diào)用這就是違反ISP的最強(qiáng)信號(hào)。說(shuō)明接口里混入了一部分特定實(shí)現(xiàn)類(lèi)用不到的能力。第二方法的調(diào)用方是否有明顯分組。你把接口里的方法列出來(lái)給每個(gè)方法標(biāo)注它的調(diào)用方。如果出現(xiàn)好幾組調(diào)用方完全不相交的情況說(shuō)明接口應(yīng)該拆。注意這里說(shuō)的是完全不相交如果兩個(gè)接口的調(diào)用方高度重疊拆了反而增加復(fù)雜度。第三方法的變化頻率是否一致。接口里有些方法一年都不變有些方法一個(gè)月改三次這兩類(lèi)方法放在一起會(huì)讓雙方都難受。穩(wěn)定方法會(huì)因?yàn)椴环€(wěn)定方法的變動(dòng)而被重新評(píng)估不穩(wěn)定方法又會(huì)被穩(wěn)定方法的兼容性要求拖住。變化頻率不同的方法應(yīng)該進(jìn)入不同的接口。第四外部是否真的需要看到它。有的方法只是內(nèi)部實(shí)現(xiàn)細(xì)節(jié)比如狀態(tài)流轉(zhuǎn)的中間步驟、緩存刷新的輔助方法壓根不應(yīng)該出現(xiàn)在對(duì)外接口里。這種情況不是拆分接口而是直接把它們降為private或包內(nèi)方法。5.3 替代方案適配器、默認(rèn)方法、分層接口如果暫時(shí)沒(méi)有權(quán)限大改接口或者歷史包袱太重有幾個(gè)過(guò)渡方案可以用。適配器模式是拆接口的平替。當(dāng)調(diào)用方只能使用一個(gè)窄接口的方法但底層實(shí)現(xiàn)是胖接口時(shí)可以寫(xiě)一個(gè)適配器把窄需求映射到胖實(shí)現(xiàn)上。這種方式不改造底層但能讓新代碼先依賴(lài)干凈的小接口。Java接口的default方法也可以用來(lái)平滑過(guò)渡。你想在胖接口里加一個(gè)新的業(yè)務(wù)能力但不想讓現(xiàn)有實(shí)現(xiàn)類(lèi)全部實(shí)現(xiàn)可以給這個(gè)方法提供默認(rèn)實(shí)現(xiàn)甚至默認(rèn)實(shí)現(xiàn)直接拋異常等需要的實(shí)現(xiàn)類(lèi)去覆蓋。這算是一種先占位、后拆分的策略但要注意別把default方法用成常態(tài)否則接口會(huì)越來(lái)越膨脹。分層接口是我個(gè)人比較喜歡的一種做法。定義一層基礎(chǔ)接口里面只放真正通用的方法再定義面向不同場(chǎng)景的擴(kuò)展接口。比如public interface OrderBaseService { Order getOrderById(Long orderId); } public interface OrderPaymentService extends OrderBaseService { void payOrder(Long orderId, PaymentMethod method); void refundOrder(Long orderId); } public interface OrderAdminService extends OrderBaseService { void auditOrder(Long orderId, AuditDecision decision); void markFraudOrder(Long orderId); }這樣公共的讀方法只維護(hù)一份不同客戶(hù)端通過(guò)繼承各自的小接口獲得能力也是個(gè)典型的平衡方案。6. 在團(tuán)隊(duì)里落地接口隔離原則的三條實(shí)戰(zhàn)建議最后說(shuō)點(diǎn)能直接帶進(jìn)團(tuán)隊(duì)的東西。如果你認(rèn)可這個(gè)原則但不知道從哪下手這三條是我實(shí)踐下來(lái)最有效的路徑。6.1 讓接口從調(diào)用方長(zhǎng)出來(lái)而不是從實(shí)現(xiàn)類(lèi)推出來(lái)大部分違反ISP的接口是怎么產(chǎn)生的通常是這樣程序員先寫(xiě)了一個(gè)OrderServiceImpl發(fā)現(xiàn)方法挺多然后右鍵Refactor把它抽成了一個(gè)OrderService接口。這種做法是從實(shí)現(xiàn)類(lèi)推導(dǎo)接口結(jié)果必然是接口跟實(shí)現(xiàn)類(lèi)一樣胖。正確的思路應(yīng)該是反過(guò)來(lái)先有調(diào)用方的需求再有接口。你寫(xiě)C端控制器的時(shí)候發(fā)現(xiàn)自己需要一個(gè)支付訂單的能力于是定義一個(gè)OrderPaymentService接口只包含payOrder然后讓實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)它。第二個(gè)調(diào)用方需要審核訂單于是定義OrderAdminService接口再讓同一個(gè)實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)它。接口的粒度是由外部需求決定的不是由內(nèi)部實(shí)現(xiàn)決定的。這個(gè)順序看起來(lái)只是思考方式的差異實(shí)際效果天差地別。從需求出發(fā)的接口天然就是按調(diào)用方分組的。6.2 評(píng)審時(shí)重點(diǎn)盯三類(lèi)信號(hào)代碼評(píng)審是最容易落地接口隔離原則的地方。我每次看到新的接口或者大接口改動(dòng)會(huì)重點(diǎn)看三類(lèi)信號(hào)第一接口方法數(shù)量。不是說(shuō)超過(guò)十個(gè)就一定不行但如果一個(gè)接口方法非常多我會(huì)本能地問(wèn)一句這個(gè)接口的調(diào)用方真的都需要這些方法嗎如果回答不上來(lái)往往說(shuō)明接口已經(jīng)膨脹了。第二實(shí)現(xiàn)類(lèi)里有沒(méi)有空實(shí)現(xiàn)或異常實(shí)現(xiàn)??吹絫hrow new UnsupportedOperationException()我會(huì)立刻想到接口隔離而不是包容它。同樣的看到某個(gè)方法直接return null;也會(huì)去追究是不是接口設(shè)計(jì)的問(wèn)題。第三依賴(lài)注入的字段數(shù)量。如果一個(gè)類(lèi)注入了超過(guò)四五個(gè)不同的Service我會(huì)懷疑它的職責(zé)是否過(guò)重同時(shí)也會(huì)看這些Service是不是被拆得太碎了導(dǎo)致本來(lái)一個(gè)接口能表達(dá)的場(chǎng)景被拆成了拼圖。這三類(lèi)信號(hào)不需要任何工具人肉就能識(shí)別門(mén)檻很低效果很好。6.3 演進(jìn)式拆分不要一次到位跟著變化拆最后一條建議是心態(tài)層面的。你不必為了遵守設(shè)計(jì)模式而一次性把所有大接口全部拆完。過(guò)度追求設(shè)計(jì)完美往往會(huì)在接口還沒(méi)穩(wěn)定的時(shí)候就把結(jié)構(gòu)搞復(fù)雜。我的做法是跟著變化拆當(dāng)某個(gè)胖接口因?yàn)樾略鲂枨蠹磳⒈桓膭?dòng)時(shí)趁這個(gè)機(jī)會(huì)把與改動(dòng)點(diǎn)無(wú)關(guān)的方法剝離出去當(dāng)某個(gè)實(shí)現(xiàn)類(lèi)開(kāi)始寫(xiě)UnsupportedOperationException時(shí)把它逼到不得不拋異常的方法拆到另一個(gè)接口里當(dāng)某個(gè)調(diào)用方為了一個(gè)方法不得不升級(jí)依賴(lài)時(shí)重建一個(gè)只屬于它的窄接口。一年下來(lái)你會(huì)發(fā)現(xiàn)系統(tǒng)的接口結(jié)構(gòu)會(huì)自動(dòng)趨向合理而且不會(huì)有那種整建制重構(gòu)的陣痛期。我見(jiàn)過(guò)太多團(tuán)隊(duì)想一步到位重構(gòu)系統(tǒng)結(jié)果重構(gòu)期間業(yè)務(wù)需求不斷涌入改造被迫中斷最后接口比以前更亂。演進(jìn)式拆分雖然慢但每一步都是在真實(shí)需求驅(qū)動(dòng)下進(jìn)行的做出來(lái)的接口更經(jīng)得起考驗(yàn)。接口隔離原則和其他SOLID原則一樣都不是考場(chǎng)上的填空題而是在每一次需求變更、每一次代碼評(píng)審、每一次接口設(shè)計(jì)里反復(fù)驗(yàn)證出來(lái)的判斷力。我自己在實(shí)際項(xiàng)目里體會(huì)最深的一點(diǎn)是它不能讓你寫(xiě)出更炫酷的代碼但能讓你在三個(gè)月后、半年后、甚至換了一波同事之后依然有底氣地改某一個(gè)接口而不擔(dān)心半夜被線(xiàn)上告警叫醒。這種安全感值得你為它多花一點(diǎn)設(shè)計(jì)時(shí)間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷伊人五月| 日韩av色图综合| 夜夜操91744565| 日韩色图 一区二区| 乱伦一区二区三区‘| 天天爽天天操| 加勒比综合在线| 亚洲欧美国产成人综合不卡| 久久超碰98| 一起草高清无码| 丁香五月成人| 久九九九九九九九热| 老子午夜伦不卡影院| 狠狠狠一区二区三区| www.人人摸在线视频| 在线观看精品国产免费| 青青草玖玖爱| 欧美性生活免费网| 国产精品网站www| 青娱乐福利99| 国产一区二区三区久久精品太古里| 不卡av免费在线网址| 大香蕉九九| 欧美自拍网| 日本三级韩三级99久久| 快灬快灬 一下爽蜜桃在线观看| 亚洲国产高清福利视频| 毛片99-全集电影手机免费观看完整-B029AV | 东京热男人的天堂网| 尤物视频新赏网鲜网色诱网| 99热精品在线播放| 国产操逼视频在线观看| 久久精品无码不卡| 99超碰色| 欧美中文字幕日韩在线| 精品无av| 91亚洲不卡一区| 91无码西班牙视频在线| 欧美在线视频观看一二三四区高清| 色欲无码人妻日韩欧美精品| 图色综合网| 丁香九月 婷婷| 天天夜夜久久| 无遮挡h肉动漫在线观看| www.av不卡中文字幕| av天堂5| 久草这里只有精品| 超碰97色色| 俄罗斯一区二区视频在线观看 | 天美传媒国产原创中文字幕亚洲欧美另类 | 天天天天做夜夜夜夜做| 国产一级作爱毛片| 久久啊啊| 亚欧洲一区二区视频| 温婉少妇玩3p| 一本久道久久综合狠狠爱一密臀精| 亚洲第一页色| 韩日性爱av| 亚洲图片小说欧洲| 熟女欧美日韩综合婷婷| 91爽啪| 男女日B国产| 男人天堂.AB| 亚洲精品一二区| 97精品一区| 超踫中文字幕| 激情无码日韩| 精品九九九九九| x97av| 亚洲欧美国产日本一区二区三区| 国产欧美在线观看免费观看| 人人操人人操人妻人| 丝袜夫妻自拍| 7777奇米影视久久| 久久久91| 亚洲毛片久久| 999 久久久| 色播五月婷婷| 色哟哟511老熟女| 亚洲欧美另类小说| 亚洲在线综合| 区二区亚洲婷| 伊人97色天使| 97超碰69| 婷婷伊人綜合中文字幕| 曰本人妻人人澡人人夹| 日韩免费a级毛片无码a∨| 大香蕉伊然在亚洲91| 97操97色| 色网在线| 亚洲丝袜色图| 人妻天天夜夜爽一区二区| 丁香五月激情综合国产| 亚洲精品国产熟女久久久久久| 久久永久无码人妻视频| 国产蜜臀精品一区二区尤物| 91欧美性| 超碰97最新人妻| 玖玖在线视频| 天天干人妇| 久久精品中文字幕观看| 一区二区乱码福利| 欧美97爱| 美女啊啊啊啊啊啊| 欧美综合天天| 国产亚洲日韩欧| 日本1区2区不卡视频| 操逼视频国产无套| 日韩人妻播放| 淫荡熟女乱伦网| 亚洲性爱成人| 欧美日韩*字幕一区| 麻豆三极片| 中英熟女操女| 亚洲第一黄色av网站| 1769国内精品视频| 午夜福利无毒不卡| 91黑丝在线| 亚洲欧美第一页| 欧美综合网A| 中文字幕视频在线观看| 久久久久国色αv免费观看| 中文字幕av片| 精品国产乱码久久久| 久久精品日韩专区免费观看| 亚洲无码一区成人免费午夜| 777超碰| 天天看天天日天天操| 97在线免费观看视频| 麻豆天美91| 亚洲天天操| 神马麻豆福利院| 欧美色人| 成人八戒网站| 亚洲综合小说另类图欧美视频激情小说色五月天| 婷婷影院入口| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 98超碰日本| 综合网亚洲1| 日韩电影中文字幕| 美女久久久| 国产品精品自在在线午夜免费| 精品日韩人妻视频| 久久久久国产精品喷潮免费观看臀| 亚洲黄网在哪免费看| 天天日夜夜爽| 精品免费国产二区三区| 欧美丝袜美女电影一二三四区| 天天躁日日躁狠狠狠躁| a级免费在线观看| 国产第12页| 精品v日韩欧美国产| 日韩免费看黄片| 亚洲欧美校园另类春色| 日韩无码服务区| 91狠狠综合久久| 一起草三级AV电影在线观看 | 大香蕉婷婷| 亚洲av热热色| 国内一级精品| 色欲无码人妻日韩欧美精品| 1024香蕉视频| 狠狠操狠狠燥| 草草影院日本第一页| 欧美成人黄网色网站| 中文字幕一区 二区三四五 区日 日骚 | 99re国产精品视频| 亚洲有码 视频一区| 亚洲色图国产另类| 亚洲欧美另类图片| 黄色视频特级毛片| 蜜臀99999| 日韩久射综合| 久久久久久AⅤ无码免费肉站 | 久久免费精品视频免一| 91国产大片| 欧美精品不卡一二三四在线91| 91啦人妻| 亚洲情色电影网| 日韩欧美天堂| 东北丰满熟女国产一区 | 狠狠婷婷亚洲中文综合久久| 久操不卡视频| 久久综合久色欧美综合狠狠| 国产三级在线现体验区| 嗯嗯啊啊视频在线看| 久草老司机| 思思久热在线精品66| 五月丁香影视| 91久久久久| 一区二区三区亚洲| 国产日韩精品一区二区三区| 天天夜夜rb| 欧美综合区| 少妇第一页| 欧美区亚洲区偷拍区| 国产按摩一区二区三区| 天操天操夜操夜月月年年操操| 亚洲av国产av综合av卡| av操操不卡| 清纯唯美亚洲综合| 日韩三级一区| 一区二区三区一亚洲中文字幕、综合区灬| 1024人妻熟女一区二区三区| 男女香蕉一区二区| 九九久久综合| 97免费在线观看| 色蜜AV| 91成人无码| 91婷婷| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 2020中文字幕在线观看| 蜜臀久久久久久999| 国产精品香蕉| 人妻在线大香蕉| 色网在线视频观看免费| 国产精品97超碰| 玖玖爱免费观看视频| 日本精品一区二区三| 婷婷AV一区二区三区| 97视频在线免费播放| 黑人无码一区二区| 国产搭汕a级片| 99色色网| 精品人妻一区二区三区四区石在线| 99热97| 懂色Av| 久热婷婷| 国产精品3| 精品一区二区成人动漫| 极品肉射| 日韩伦理视频| 日韩在线性爱免费视频| 蜜臀va69| 日韩二三区| 免费一级精品啪啪视频| 中文三一区| 人妻加勒比东京热| 欧美v亚洲v综合v国产v妖精| 色综合1991| 久久五月视频| 蜜臀99久久| 天堂资源欧美| 亚洲国产成人精品无码专区| 亚洲牲交| 久久精品噜噜噜成人看免欧美大片| 久久xxxx| 人妻81p| 97在线观看视频| 综合久欧洲| 国产乱码精品一区二区三区四川| 九九九九精品| 欧美天堂第二区| 激情五月天视频| 乱伦一二三区| 男人的天堂VA| 在线视频一区二区传媒| 717影院理论午夜伦八戒| 国产91影院| 99精品人人爽| 丝袜夫妻自拍| 999国产精品999| 91伊人久| 亚洲码在线中文在线观看| 老熟妇一区二区三区| 青青草九九九九九| 婷婷视频在线免费观看| 激情无码日韩| 成·人免费午夜在线观看| 91综合天天看| 久久综合女优| 嗯阿好爽好紧| 九九久久久久久爱| 蜜乳av首页| 日韩av免费一级电影| 超碰97资源网亚洲| 亚洲区限制级| 超碰无码五月97| 欧美亚洲激情小说| 丝袜美腿欧美| 免费黄色视频网址| 两性综合网| 曰韩精品视频一区二区| 色色毛片| 色综91| 免看60秒涩涩视频| 后入式999| 亚洲综合图色在线| 久久最新免费视频23| 太久视频| 国产第25页在线观看| 中国农村熟妇毛片视频| 中文视频在线观看| 2017天天插| 色婷婷一区二区三区久久午夜成人不| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 国产真实野战在线视频| 国内毛片国产欧美拍| 无码国产精品96久久久久孕妇| 日韩精品资源| 日骚逼视频| 夜夜做夜夜爽精品视频| 97久操| 神马久久免费电影观看| 毛片99-全集电影手机免费观看完整-B029AV| 91欧美美女日韩国产婷婷| 天天肏美女| 麻豆区99999| 久久av网| 91久久18禁| 亚洲色图国产另类| 老女人老91妇女老热女| 久久激情视频| 男人天堂2017| 一区二区三区视频国产免费| 人妻日日干| 大黄片做爱的大的| 天天看特黄的免费网站| 国产天天骚| 日韩精品一区二区日韩| 国产粉嫩蜜臀av一区二区三区| 亚洲 欧美 综合 91| 久久久9品一区二区三区| 亚洲精品啪视频| 国内毛片国产欧美拍| 欧美激情 亚洲色图| 成人欧美日超碰| 青青草亚洲一区 | 久久久久13| 亚洲欧美一区二区三区一猛片| 日本爽爽爽爽爽爽免费视频| 91第一页| 乱人乱色一区二区三区免费| 中国熟妇| 九九九九九九综合| 男人的天堂日韩| 蜜臀99999| 欧美日韩人人早| 亚洲情色五月天 | 亚洲 欧美 手机在线观看| 操人人| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 亚洲图片激情小说| 少妇久久久久久久久| 91操熟女视频| 久久少妇| 丁香九月婷婷| a片久久久久久久久久久久 | JULIA一区二区三区在线播放| 成人麻豆av电影网站| 欧美日韩大黄片| 四虎国产精品永久在线囯在线| 久久一二三四| 国产无码久久高清| 人妻丰满熟妇一区二区三| 日韩av免费一级电影| 四虎国产精品永久在线囯在线| 成年无码动漫av片无尽在线 | 美女黄站| 天天日天天干天天操| 欧美大波激情xxxx| 干干干天天| 91强热人妻| 亚洲无线码一区国产欧美国| 91GD.COM| 色哟哟-国产专区| 亚洲丝袜B诱惑| 久久亚州高清| 日韩在线97| 9999亚洲精品| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲少妇视频| 日韩熟女三十乱伦| 久综合国内精品自在自线| 欧美日韩性爱无码| 秋霞视频一区二区 | 97干在线看| 91网亚洲| 智利AV在线网| 99av| 久久久国产av美女私房| 久久久精品视频免费观看| 色九九综合| 内射中出日韩在线观看视频| 久久动漫精品视频这里只有精品| 呻吟 欧美 日本 中出| 激情综合 婷婷五月 红杏| 国产精品ww久久| 操逼天美3区| 中文字幕免费看大片| 青青草中文-久久青草精品一区二区三| 99re6久热只有精品6在线直播| 日本欧美色| 久久后入制服| 午夜小电影在线插入淫高潮| 色久桃花影院在线观看| 欧美精品999| 久操B网| 欧美高清在线| 亚洲国产成人精品女人久久久| 日日噜噜夜夜狠狠视频无| 国产 三级自拍| 亚殴在线| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 看一级黄色视频| 欧美另类色| 亚洲日韩久久精品一区| 欧美综合天天| 国产福利影视| 99操| 欧美亚洲首页| 中文一区在线视频| 韩国女主播青草在线| 97在线观看免费| 日本人妻丰满熟妇久久久久久| 亚洲欧美国产其他二区| 婷婷情色五月天| 中文字幕视频二区| 美女一区二区国产精品| 中文字幕丝袜美腿| 精品黄色电影| 99热这里都是精品| 亚洲美女高潮喷水视频| 中国国国产一级特黄毛片| 欧美色图私拍91| 上特色A在线| 国产亚洲综合欧美一区| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 日产狠狠干| 蜜臀无码一区二区| 17c嫩草51久久91嫩草| 啊视频在线| 人人噜夜夜操| 中国AV美女| 久妇网| 久久亚洲一区女同性恋中文字幕 | 蜜乳AV色欲AVAV无码| 九九九九日本| 国产精品com| 大香网伊人久久综合| 亚洲色欲一区二区三区| 超清中文乱码字幕| 东京热男人的天堂网| 亚洲天堂久| 在线无码网站| 四虎视频在线观看| 欧美国产精品| 四虎免费看黄| 免费?级毛片无码?∨蜜芽试看| 色嘟嘟人妻天堂网| 久草加勒比一区在线| 99热免费| 亚洲综合97| 操久久久久久| 亚洲视频精选| 麻豆60秒| 青青草中文字幕| 丝袜大香蕉| 91老妇女| 天天综合色| 骚货操死你| 久久人妻视频网| 大鸡巴久久| 婷婷五月av| 国产综合久| 国产少妇肉丝在线观看| 人妻丝袜一区二区三区在线| 极品五月天噜噜| 91日韩| 999狠狠综合| 超碰97久久| 800zy一区二区| 中文人妻av高清一区| 麻豆久久久久久久久丝袜 | 啪啪啪东京| 少妇内射www在线观看视频| 91在线视频免费播放| 伊人991| 欧美日韩一区二区三区四区蜜桃| 黄色十八禁| 日韩一级免费性爱| 黄页| 欧美天堂日韩三级国产传媒| 欧美探花网| 曰韩香蕉97| www.婷婷| 五月天婷婷在线看 | 丝袜美腿91| 丝袜AV一二三区| 色网站导航大全| 久久久久78| 一区二区三区 日韩欧美| 色哟哟av| 天天日老熟妇| 中国一级操逼视频| 精品少妇一区二区| 国产精品久久发布| 鸡巴插逼视频| 美女久久久久久久久久久| 人妻夜夜爽天天爽麻豆三区网站 | 亚洲午夜精品久久久中文影院| 韩国一区二区精品亚洲| 国产一级内射无挡观看| 久久精品无码熟妇一区二区三区视频导航 | 亚洲色图91欧美日韩| 国产精品又黄又猛又粗| 9997se| 久久超碰久| 欧美黄色片在线播放| 麻豆天天躁天天揉揉AV| 天天综和| 狠狠操综合| 伊人专区一区二区三区| 91亚洲黄色网| 97亚洲资源| 久久久久9999| 无码国产Av| 色色九区| 亚洲精品白丝| 宅男午夜在线视频| 久久伊人大香蕉| 中文字幕天天天天天| 岛国艾薇凹凸视频天堂| 国产精品高潮久久久无码| 精品少妇人妻| 久久e6只有精品| 精品少妇一区二区三区在线视频| www.亚洲黄色| 熟女人妻一区二区三区| 国产高清在线自在拍69| 青青草黑寡妇男人天堂| 五月丁香啪啪啪| 51一区二区三区| 肏逼视频日本| 丝袜足交视频| 精品大全99999| 精品人妻一区二区乱码一区二区| 大香蕉碰碰| 国产 v乱码一区二| 人人 操人人 操人人| 国产一区二区二区按摩精品啪视频| 久草老司机| 中文字幕78| 91丝袜在线观看视频在线观看| 国产尹人在线视频免费| 多毛小伙内射老太婆| 成人免费毛片| 张柏芝国产一区在线观看| 日韩BBN| 91欧美性| 97在线观看免费视频l| 久久色人体 | 天天日天天射天天干| 亚洲色图久久成人| 五月婷婷综合激情| 91蜜桃婷婷狠狠久久综合9色| 亚洲精品无码久久AV| 操B视频日韩无码| 亚洲日韩av专区无码| 欧美色欧美| 超碰九区| 性色aV一区二区三区噜噜| 东北老熟女| 久久成人东京热人妻| 乱色老一区二区三区的观看方式| 欧美一区二区三区成人性生活| 国产盗摄美女如厕大神作品在线观看| 日韩9999| 嗯嗯啊啊好疼| 少妇专区一二三四五| 91处女视频在线观看| 日本不卡二三区| 330Dv国产女人终合视频极品人与兽 | 国产乱弄免费在线视频。| 三级片大波波| 欧美熟妇操操视频| 日韩熟女精品无码专区一区二区| 少妇同性| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 91在线美女| 亚洲色欲一区二区三区| 蜜伊人色综合97| 欧美色图中文字幕| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲999综合| 天天躁夜夜躁狠狠躁AV| 四季av一区二区凹凸精品小说| 97超碰伊人| 人人澡人人干| 亚欧美色| 美国黄片aaa| 国产操伦| 国产精品免费视频人成| 欧美成人精品A片免费一区99| 欧美日韩成人| 男人的天堂2010| 久久a久久| 久久、1234| 91青青在线视频| 婷婷激情丁香| 84YTCOM性无码| 亚洲囯产精品女人久久久| 8050午夜少妇无码| 天天操夜夜操| 国产亚卅97| 啊啊啊不要嗯嗯在线观看| 91麻豆一二三区| 丰满熟妇大乳做爰| 欧美色网| 一区二区三区黄片免费观看| 久久亚洲av成人无码国产| 99色综合| 欧美天天综| 9999久久久久| 青青在线视频日韩欧美| 性久久久| 欧美日韩999| 青青草久久一区网| 天堂av最新电影网| 无码不卡亚洲成?人片| 亚洲成a人片在线观看中文!!!| 桃花色涩综合影院| 天天干天天日天天射黄色片| 五月天精品| 精品三级在线专区| 中文字幕性感少妇av| 99热超碰| 夜夜国自区| 一级成人性爱| 狠狠干狠狠干| 久操视频免费观看| 伊人天天久久动态图| 国产成人无码高清| 婷婷激情一区二区三区俺也去| 精品久久艹| 国产一区二区三区高清视频| 国产超碰| 亚洲和欧美裸体美女双飞视频| 久久精品久| 亚洲欧美激情在线视频| 亚洲码和欧洲精品激情系列| 久久内射| 在线观看精品国产免费| 一区麻豆 高清中文字幕| 欧美色图另类图片| 国产精品999zyz| 色嘟嘟人妻天堂网| 丝袜加勒比| 成人精品一区二区91毛片不卡| 日韩免费人妻色情网站| 亚洲欧美内射| 久久国产热视频97电影| 欧美大香蕉97| 啊啊啊啊啊在线| 90后性网国产欧美| 人妻天天爽| 豆花视频操逼网址| 97国产色综合| 天天欲望网| 91精品无码人妻系列| 中国小夫妻勾搭露脸淫荡对白| 电家庭影院午夜69久久夜色精品国产69乱 | 超碰到97情色| 北约熟女超碰| 欧美性爱一内片一区二区三区| 夫妻日逼| 人妻久久久久久| 亚洲影视高清第一页| 奇米四色影视777久久久| 91精品人妻一区二区三区蜜桃臀| 淫荡网址| 日韩欧美视频青青| 蜜臀久久99精品久久久久久成人小说| 精品黑人一区二区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 曰韩操B| 九九英色视频| 三级精品三级在线观看| 午夜福利久久久噜久噜久久综合| 亚洲国产精品成人久久蜜臀| 防屏蔽在线视频| 97亚洲在线| 亚洲天堂,男人| 男人的天堂com| 亚洲色 国产 欧美 日韩| 一本久久精品中文字| 国产三级在线现体验区| 九九九九日本| 九九精品无码专区免费| 亚洲自拍另类丝袜综合| 人妻二区| 蜜臀th| 美中日韩无码| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 围产精品一区二区三区视频播放| 狠狠干2020| 五月天黄色激情视频| 中文字幕免费在线观看| 久久五月综合| 一本久道久久综合狠狠爱一密臀精| 婷婷激情五月| 男人天堂东京热| 亚洲另类综合欧美| 国产美女在线精品免费看| 99re在线观看| 草莓精品视频| 加勒比99999| 亚洲影视综合网| 中文AV制服乱伦| 欧美亚洲AN| 精品一啪| 日本天天干天天操一区| 国产精品色哟哟| 国产免费操逼| 亚洲天堂一二| 啊啊啊啊视频免费| 秋霞一级A片黄色视频| 色偷综合| 99这里有精品视频| 亚洲美女AV无码| 97超视频在线观看| www久久99| 偷拍亚洲| 一级黄碟在线看| 欧美日韩第一页| 日韩欧美日韩| 国产视频小说| 精品人妻伦一二三区久久| 欧美人与动性人交a| 天堂综合| 人人色97| 国产成人欧美一区二区三区的国产| 密臀国产在线| 欧美亚综合色图| 天天视频黄网站| 東南亚性呦成人伦理资源在线视频| 黑丝91视频| 人妻乱仑一区二区三区| 亚洲超碰97| 91AV天美在线视频| 六月婷激情福利天堂69| 看一级特黄a大一片| 酒色综合网| 九九自拍伦理| 吻戏激情性巴克| 无码天天操| 国产60页| 久久久九九| 一区二区三区四区五区高清无码永久视频| 欧美午夜视频精品久久| 欧洲在线性爱视频| 一本色道久久综合狠狠操| 99啪啪| 首页亚洲国产高跟丝袜诱惑视频| 色在线亚洲视频www| 高清无码人妻久久久一区二区三区aⅴ| 激情综合av| 久久超碰爱| 久久久久久精品免费看A级| 亚洲精品久久久久毛片A片拉屎 | 四虎影视国产精品| 免费成人在线熟妇网| 嗯嗯啊啊视频在线看| 国产男人又猛又粗又爽| 国产强奸AV在线| 国产sv美女内射| 91AV天美在线视频| 国产传媒1234区| 青青草日韩无码| 91精品人妻电影| 五十路六十路素人熟女| 91高潮| 国产白丝网站| 欧美九一精品久久久熟妇| 九九热视频这里只有精品| 亚洲欧洲偷拍一区| 国模精品娜娜一二三区| 18禁精品网站在线看| 国产精品懂色tv影视免费观看| 人妻娇喘 激情视频| 青青草日韩免费观看高清在线| 超碰性爱97| 婷婷色一区| 色婷婷网| 93人人操人人| 无码 黑人一区二区三区| 人人操人人摸人人骑| 老妇女91| 91欧美综合| 怡春院久久| 9久9久| 超碰欧美97资源| 久久综合久色欧美综合狠狠 | n1038 一二三区| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 成人丁香五月| 欧美在线干| 大香蕉乱伦视频网| 国产成人精品日本亚洲语言| 女人 A一级| 成年无码动漫av片无尽在线| 丁香色狠狠色综合久久小说| 狠狠爱大香蕉| 亚洲性天堂| 99999亚洲| 色五月AV| 精品无码久久久久久久杏吧| 色色毛片| 久久丁香久草综合网| 欧美极品美女aaaaaa级黄片| 操国产逼| 51久久夜色精品国产麻豆| 亚洲欧美精品国产一区二区| gogogo免费高清看中国国语| 眼镜人妻101.com| 一级片在线观看高清无码| 家庭乱伦国产| 黄片com.| 一区二区娱乐网站| 婷婷伊人| 久99久视频精选| 国产白领连续中出在线观看| 99久久com免费视频′| 天天看人人操屄犊摸阴| 日韩欧美偷拍美女视频| 在线小视频| 欧美美逼| 亚洲色图91| 综合久久久久久久久91| 一级@啪啪视频| 精品一区二区综合熟妇| 天天看,天天做| 91五月天| 久9久| 久久久久网站-538在线视频-欧美永久乱码 | 韩国三级一线观看久| 国产极品精品美女视频| 欧美性爱中文字幕无线码| 92人人操人人| 免费看毛片操穴| 打av高清| 超碰这里有精品| 日韩性色| 26uuu国产亚洲综合| 1769一区二区| 屌逼传媒| 成人五月天色网| 日本国产二线女色| 99热这里只有精品18| 丝袜人妻av一区二区| 国产精品原创巨作?v网站| 天天视频黄网站| 激情综合久久| 中文字幕88av在线| 少妇熟女视频一区二区三区| 国产精品美女| 久久av一级av少妇av高潮| 99久re热视频精品98| 97干色天堂| 人妻人久久精品中文字幕| 好色综合| 精品国产乱码久久久久久口爆网站| 伊人久久88国产女| 欧美成人色| 欧美+日产+中文| 岛国大片国产| 日产狠狠干| 嫩草影院永久在线制服丝袜| 风韵犹存大大大大香蕉| 高清无码在线播放网站| 天天色综合图片| 色拍偷亚洲| 91搡老女人老妇女老熟女歌词翻译| 色官网色综合| 久久久久久性爱片| 亚洲AV不卡在线观看| 成年无码动漫av片无尽在线| 大伊香蕉在线视频免费| 欧美高清性猛交| 国产精品久久久久9999小说| 国产精品女生av| 97超碰色五月| 欧美色爱综合| 国产一区二区三区久久久精品| 欧美1727免费观看视频| 亚洲中亚日激情视频| 午夜福利国产欧美日韩夜夜| 五月丁香综合激情| 亚洲清纯唯美| 伊人丁香五月婷婷| 欧美亚洲激情小说| 极品人妻少妇综合| 综合 欧美 亚洲 日本| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久超碰爱| 欧美高清91| 中文字幕亚洲在线一区| wuyechaopeng| xxx0国产在线播放| 精品亚洲俞拍视频一区| 人人操,人人液| 婷婷色综合| 亚洲色图片区| 亚洲成人福利电影免费| 九九亚洲精品| 18禁在线视频| 国产白嫩精品久久| 99婷婷一区二区| 91女神在线视频| 欧差乱伦二三| 宅男午夜在线视频| 水多多映视AV| 91丝袜美女| 在线日韩精品一区二区三区| 啊好大好舒服| 污色区网站| 夜夜高潮夜夜爽| 国产狂喷潮在线精品| 国产精品。| 三级特黄60分钟播放| 日韩丝袜高跟制服在线观看| 强奸乱伦亚洲第一页| 青娱乐手机日韩在线视频| 秋霞久久亚洲精品成人| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 欧美精品成人亚洲| 中文字幕国产在线天堂| 操美女人妻| 草草影院日本第一页| 丝袜狠狠草尤物 91| 欧美成人一区二区三区在线播放| 精品少妇一区二区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 久久一区二区三区四区五区| 人妻在线臀日韩| 九九精品99| 国产精品在线一区二区| 国产热RE99久久6国产精品首 | 亚洲91av| 人人做天天爱| 久久人体一区二区| 久久婷婷五月| 2023天天操夜夜操| 欧美日韩国产人人| 色情五月综合婷婷| 97天堂| 国产精品suv一区| A片三级无码| 九色黄站| 国产日韩人人| 99日韩| av毛片aaaaa免费看| 99精品高潮| 精品人妻伦一二三区久久| 国产粉嫩蜜臀av一区二区三区| 久久av网| 台湾大香蕉99热| 国产精品制服丝袜清纯唯美| AV色女综合| 天天弄欧美| 久草福利在线资源站| 诱惑网综合| 蜜桃视频一区二区三区| 久9热| 精品日韩人妻视频| 久久久草草精品| 国产黄a三级三级三级av在线看 | 婷婷久热| 天堂69亚洲精品中文字| 欧美黑人日韩少妇色情| 国产精品91一样| 久久九九国产精品| 我要色综合网| A男人的天堂| 色综合五月天| 日韩亚洲中文有码视频| 欧洲人妻视频| 九九九精品一区二区无码| 人妻啊啊人妻啊| 国产理论视频在线播放| AV中亚| 97久久国产亚洲精品超碰热| 操九九九九九九| 一级久久性爱视频| 国产成人亚洲精品无码最新在线| 亚州欧美综合| 97色欧州| 91国产精品在线看| 凹凸视频在线观看伊人| 97啪啪| 亚洲玖玖爱| 久久久久网站-538在线视频-欧美永久乱码| www.久久久久| 人人人人插| a男人的天堂久久一级A毛片| 夜夜嗨一区二区三区直播内容| 成熟熟女国产精品一区二区| 97综合在线观看| 操一区| 欧美大香蕉专区网| av爱爱爱| 2017亚洲天堂| 中文字幕1区2区| 久久精品电影| 欧美日韩精品国产91| 天堂九九九九九九九九九| 国产AV超爽| 亚洲日韩美国人妻| 亚洲黄片免费在线播放| 亚洲国产精品无石码久久 | 国产路线专区| 天天日骚逼熟女| 男人把坤坤插入女人的下体| 亚洲影院小综合| 日韩在线女优天天干| 激情综合五月天| 国产伦精品一区二区三区在线观| 日韩色| 国产一区二区三三视频| 一级黄色性爱裸体视频| 久久这里只有精品9| 97人人爱人人乐| 日韩电影免费网站麻豆视频| 天堂网 主播 亚洲| 九九九九九九九九九五码| 国产超碰在线一区| 动漫片子网站3黄| 日本免费不卡二区| 操九九九九九九| 亚洲色天堂日韩中| 男人的天堂2019AV| 色色热| 成人婷婷丁香| 六六久久日韩不卡| 色蜜AV| 亚洲 91 在线| 国产原创精品| 麻豆国产av网| 亚洲乱色视频一区、二区在线| 亚洲欧洲美腿丝袜| 综合国产97| 欧美黄色图片| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 亚洲视频精选| 国产精品不卡少妇白| 外国免费性情大片| 人人妻人人爽一区二区三区| 色约约一区=区三区| 97这里有精品| 日韩97P| 亚洲国产精品无码AV久久| 国产高清成人免费视频| 91福利网在线观看| 中字幕人妻一区二区三区| 五十路六十路七十路熟婆| 国产精品福利视频播放| 美女尤物人人操| 无码国产精品久久久久| 亚洲国产激情国产av| 性爱视频久久| 久热伊人99re| 东京热一区二区三区四区五区六区| 色九九九九| 一本色道久久综合熟妇| 中文字幕第二页| 99re超碰| 91露脸熟女专区| 国产精品呦一区二区三区| 96久久精品一二三区色欲| 亚洲AV成人在线| 国产不卡精品91| 欧美激情片一区二区| 龙兴卡官方查询| 欧美成97爱| 91精品人| 操逼啊啊啊91| 五月丁香大香蕉| 国产久久久9999| 日本999精品| 国产蜜臀精品一区二区尤物| 久久久久久久精| 秋霞成人一级在线观看| 国产成人无码久久精品| 91亚·色| 欧美一级专区免费大片| 精品人妻15区| 自拍偷拍 日韩欧美| 强奸乱伦av电影| 女同在线视频一区| 超碰97最新人妻| 亚洲少妇综合| 久久久久久久免费A片国产成a人亚洲精∨品无码| 成人免费看吃奶视频网站| 自偷自拍的亚洲视频| 人人手机欧洲亚洲国产人妻| 91AV天美在线视频| 夜夜躁狠狠躁日日躁av| 天天色,天天干,天天干| 久热免费视频| 亚洲天天影视综合网| 日韩AV噜噜噜一区二区三区四区 | 国产福利精品最新在线| 免费的av网| 九色 蝌蚪 熟女自| 久久性爱视频免费看| 亚洲高清无码免费观看视频| 一,爱啪啪,在线免费视频| 中文字幕日韩综合| 97网址97| 九九九精品| 亚欧高清在线| 99热精品青草在线| 久久国产精品视频| 日日干天天干夜夜爽| 亚洲av强奸乱伦| 四虎884a| 97爱亚洲| 国产欧美日韩精品中文| 九一屌逼| 天天综合网在线91| 欧美大香蕉同搞| 久久手机视直播| 色噜噜人妻av中文字幕| 操逼大黄片| 超碰超碰95| 疯操AV| 性色生活片久久毛片婬片免费放女人一级毛片| 天天插天天射| 九热超碰| 收看日本人日bb| 青青11操操操操操操操操| 亚洲素人综合| 台湾成人无码AV| 99re3这里只有精品| 夜夜高潮夜夜爽夜夜爱爱一区| 国产日韩欧美亚洲精品95| 成人熟女视频一区二区三区| 91观看 国产白丝| 欧美午夜一区二区三区| 屌妞视频久久久久久久久久久久| 五十路三区在线| 成人午夜无码视频| 国产精品3| 69少妇一区二区| 国产精品久久久久久夜夜夜| 国产路线专区| 97人人超| 国产三级中文字幕粉嫩| 欧美十八禁导航成人| 欧美另类自拍 | 九九九九精| 另类视频在线| 亚洲第一视频 欧美风情 日韩| 97国产高清视频在线观看| 1000午夜黄色| 午夜亚洲国产理论秋霞| 97精品久久久久久久| 偷拍 欧美 日韩| 日本精品人妻少妇一区二区|