日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
91GD.COM| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | www国产无码| 97午夜剧场日韩| 日本无码1| 欧美人妻制服| 久热99999| 射丝袜高跟鞋99| 岛国激情视频软件| 国语av狠狠色丁香婷婷综合激情| 亚洲清纯唯美| 亚州操操穴网| 婷婷91| 国产精品原创巨作?v网站| 精品人妻一区二区三区四区| 亚洲人久久久网| 熟女精品一区二区三区| 秋霞无码av鲁丝片一区| 日韩亚洲欧美中文字幕| 亚洲成人在线乱码色午夜| 殴美牲| 综合自拍| 婷婷天堂站| 欧美丰满少妇xx高潮| 东京热男人天堂| 亚洲九九视频| 97在线观看免费| 国产中文福利| 亚洲情色在线| 国产超碰在线一区| 欧美天堂第二区| 视频在线观看一二三区| 天天爽天天爽| 屌色在线97视频| 日韩精品一区二区高清| 色欲三区| 夜夜草天天| 蜜桃臀av一区二区| 亚欧操逼片在线观看 | 99热精品在线观看| 2018色综合天天操| 日韩在线观看中文字幕视频| 欧美aaaaaaa| 成人午夜高潮av猛片| 网友自拍第1页| 天堂亚洲精品| 97国产精品一区| 欧美人妖内射| 热99这里有精品综合久久 | 亚洲美女 晚间男人天堂| 国产久久一区二区午夜| 国产精品色色| 99爱久久视频频| 日韩天堂av电影在线观看| 欧美国产日韩清纯唯美| 亚州色图欧美| 午夜福利 成人 91| 久久精品国产亚洲AV先锋| 久久久久9999| 中文字暮97| www老逼91| 欧洲综合视频| 天堂伊人久久| 欧美三四五区| 亚洲无码视频免费在线观看网址!| 好吊色综合| 在线不欧美| 国产精品久久天天干| 伊人网青青| 欧美,日韩综合久久| 国产一级操B视频| 国产成人无码网站在线视频| 亚洲欧美精品一区天堂久久| 超碰97网址| 超碰97首页| 精品人妻一区二区蜜桃视频| 男人久久天堂| 成人性爱视频在线看| 亚洲综合精品国产一区| 亚洲五区熟女| 日韩精品啪啪啪| 亚洲国产精品久久AV| 久久国产乱子伦精品免费女人| 国产 热久久久久国产精品| 丁香五月自拍| 日韩人妻精品中文字幕| 91天美传媒在线观看| 日韩欧美中文字亚洲慕| 黄色AV免费| 乱伦AVxx| 欧美色图小说综合| 天天干天天狼在线视频| 午夜精品久久久久久久99热影院| 女生91网站| 一区二区三区国产在线播放 | 国产三级多多影院2022国产AA一级毛片无码 | 91 偷| 凹凸 69堂 在线播放| 国产一级高清免费观看| 国产一级做a爰大片免费久久| 久久免费老司机精品| 天天看特黄的免费网站| 性欧美第一页| 久久亚洲精品成人av| 97色冈| 伊色久人大在线| 亚洲图片日本AⅤ欧美在线| 国产高清精品福利| 性色av一区二区| 日日骚AV| 亚洲色图大香| 亚洲一区二区三区婷婷| 国产精品久久久三级无码| yazhousetuoumei| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 青青青在线高清视频在线一二三四区 | 九九九九九九免费视频| 1级午夜影院费免区| 亚洲 日本 一 二 三| 老熟女熟妇| 久久久四区| 久久激情网| 夜夜青青无码影院| 日韩美女操b| 欧美天堂日韩三级国产传媒| www.男人的天堂| 婷婷五月天基地| 69一区二区三区| 成人网站 免费观看| 久久九七| 制度丝袜99| 第四色亚洲色图| 999久久久久久久久| 欧洲综合无码| 九一精品牛牛一区二区| 日本女优在线视频福利| 精品综合久久久久久97| 国产 丝袜 欧美中文 另类| 97视频新免费| 国产美女自拍AV| 亚洲综合小视频小说在线观看| 粉嫩av在线| 精品人妻15区| 久操B网| dy888午夜老子影视达达兔| 91在线|亚| 加勒比综合| 啊啊啊好湿久久| 97碰碰色| www.yw尤物| 超碰色97| 91红杏| 在线视频免费播放一区| 人人妻人人色一区二区三区| 黑人中出21连凳花野真衣| A片大香蕉在线| 老熟女熟妇| 免费作爱一级视频| 日韩熟女三十乱伦| 91热情品| 中文字幕一区av| 日本影视久久免费| 天天情欲宗合网| 日本三级韩国三级99| 欧亚日韩中文在线| 九九九九一区| 96AV久久久| 婷婷视频在线免费观看| 91精片| 天天夜夜久久| AV电影在线播放| 亚洲熟妇一,二,三期| 日韩丝袜高跟制服在线观看| Julia在线播放亚洲久久| 天天综合97| 欧美极品少妇| 欧美熟妇精品黑人巨大一二三区| 亚洲av无码成人精品国产| 日日夜夜精品视频| 亚洲国产综合图区中文字幕 | 99天堂网| av网页一区二区三区| 天天操妹子| 国内操逼视频二区| 青青草九九九九九| 99操碰| 翔田千里Av在线| 国语精品对白| 精品无码一区二区人妻久久蜜桃| 91草草草| 操B久久| 少妇高潮99p| 留下AⅤ黄色片| 福利视频香蕉免费一区二区在线| 97精品一区二区视频在线观看| 偷拍亚洲高清图片| 日本三级小说中文字幕| 色婷婷香蕉| 午夜久久无码1000合集| 日本女人久久久| 另类老少妇| 操死我了嗯嗯嗯| 无码91| 99色在线| 精品国产一区二区三区av在线资源| 在线有码中文字幕| 思思热在线视频免费| 国产精品美女| 久久大黄片| av东京热男人的天堂| 欧美黄色图片| 日韩熟女精品无码专区一区二区| 91原创在线观看| 久久激情网| 丁香五月自拍| 激情综合五月天| 国产精品黄色三级av| 久久精品国产Aⅴ| 先锋女优在线观看视频| 日韩在线观看三级电影| 国产h小视频在线观看免费| 超碰地址久久| 日韩丝袜高跟制服在线观看| 午夜激情床戏激情| 色妺妺AⅤ| 亚洲天堂久久| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 国产成人无码高清| 五月综合婷婷久久网站| 欧洲亚洲国产综合在线| 国产一区自拍欧美日韩| 黄色电影观看久久9| 欧美操逼熟女| 色色色色网站| 亚洲天堂中文字幕无码男同| 大香蕉伊人一区在线观看| 久操99| 亚洲欧美九九九| 97玖玖超碰| 97碰碰日本乱偷人妻中文的| 天操天操夜操夜月月年年操操| 天天综合站| 日日骚精品视频| 久草线上视频免费看| 久久成人精品| 精品九九九九九| 超碰在线人人射| 伊人久久综合影院精品久久久| 在线看的av| 亚欧性爱在线无码| 狠狠操综合| 97色五月天完| 久久少妇人妻| 久草午夜| 91超级碰| 亚洲国产丝袜在线观看| 91狠狠综合久久| 亚洲av无码成电影在线播放| 国产a级午夜毛片| 神马精品视频| 欧美色图在线视频少妇| 国产精品久久久久久久AV大片| 欧美强奸一区二区诱惑| 人妻精品综合中文字幕在线| 丝袜足交视频| 色噜噜精品一区二区三| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 操人人| 99ri在线视频| 中文字幕55555| 国产尤物在线三区| 在线观看高清AV| 99色婷婷| 欲色啪| 国产黄色视频久久| 天天爽夜夜操| 国产AV线| 久草免费福利在线播放| 嫩草 人人网精品| 91成人无码| 另类小色呦| 天美一二三在线观看Av| 激情五月天中文字幕色| 大香蕉九九| 无码操逼天堂| 亚洲无码国产精品久久| 色五月综合| 国产欧美日韩臀| 九九九九9999| 色蜜AV| 中文字幕av一区二区三区人妻少妇| com 首页 18岁 禁区 女优 免费 精选 同城 | 日韩极品无码B| 大香蕉九九| 人妻喷水| 99自拍视频在线观看| 天天色怡春院| 二男一女成人A片| 嗯嗯啊啊啊好舒服| 亚洲色图图片| 久久女人视频| 色哟哟 日韩精品| 老色69| 四方色播| 97操碰| 78精品在线| 色综合九九| 中文字幕一二三av| 色97| J?P?NESEHD熟女熟妇伦| 日韩无码AB| 一线黄色免费性爱片| 中文字幕少妇色| 99e久久国产精品| 亚洲 图片 欧美 色图| 国产婷婷综合在线观看| 久久天天躁日日躁狠狠躁 | 91熟女综合| 国语av狠狠色丁香婷婷综合激情| 蜜桃视频一区二区三区在线观看| 亚洲Av诱惑| 激情露脸爱| 91黑丝在线播放| 天美传媒婬乱| 一区二区三区蜜桃成人撸久久东京热 | 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 欧美中文字幕精品人妻| 久草在| 日韩一级成人毛片免费观看| 国产一区二区在线看| 国语对白在线播放视频| 操熟女91| 国产一区麻豆免费观看| 欧美性爱三区二区| 色欧美综合| 久久一二三四五六七八九区区区 | 午夜理论片在线观看免费| 亚洲美腿丝袜香蕉影视欧美成人| 国产第25页在线观看| 综合亚洲网| 熟妇最新先锋一二三区| 久久 国产 无码| 97情超碰色| 密桃99999| 国内精品a| 国产AV线| wwe 天天干.com| 国产真实野战在线视频| 综合网亚洲| 亚州大图综合色图| 青青青操| 婷婷五月天av| 国产AV激情无码久久无码| 我爱操| 97大色网| 五月天大香蕉| 新久久AV| 中文字幕欧美日韩三级| 亚洲欧美洲综合| 欧美日韩少妇色情| 亚洲精品久久久久久久久豆丁网| 国产精品干干干| 国产一区二区在线播放| 人妻色情天天操| 精品97精品97| 天天91~综合入口| 亚洲国产一区二区入口| 国产色产精品在线观看| 伊人网在线点播| 亚洲综合图文| 久久久久久性爱片| 黑丝少妇| 人妻少妇久久久| 极品色www影院| 日本欧美一区二区三区免费| 欧美αv.com| 久久久久亚洲三级电影| 99国产精品视频尤物| 国产福利一区二| 免费成人自拍视频在线| 中文字幕丰满人妻日本| 综合色好色| 五月天久久人妻| 97超碰免费生活| 大吊色| 情色av电影| 国产超碰国产97| 婷婷色导航| 日韩av不卡在线观看| 欧美αv.com| 第四色奇米影视777| 国产丝袜啪啪| 丰满人妻-区二区三区免费看| 欧美人妻中出| 久久久九九九九| 亚洲永久永久永久永久一级一级一级精品 | 婷婷亚洲五月***久久| 日本免费中文字幕在线| av天堂天堂av日韩| 乱伦系列一区二区| 欧美日韩第一页| 中文字幕 国产 精品| 入口操逼网站| 久久丁香| 黑丝91视频| 躁躁日曰躁2020| 日韩少妇在线视频| 又黄又硬又粗又长国产视频| 国产粉嫩蜜臀av一区二区三区| 亚洲人妻中文在线视频| 玖玖爱免费观看视频| 国产亚洲国产超碰| 久久婷婷在线观看视频| 蜜桃丰满熟妇av无码区不卡| 超碰色图| 1769国内精品视频| 黄片不用下载在线观看| WWW4虎| 久久久国产精品亚洲精品| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 少妇综合| 日韩欧美午夜视频在线| 亚洲欧洲视频小说在线观看| 亚洲drav色图| 日韩一区二区精彩视频| 亚洲男人bt天堂| 亚洲诱惑| 97碰| 97人人模人人爽人人| 99热99re超碰精品| 无卡一区=区| 色欲av国内精品久久久久久| 色呦呦呦在线观看视频| 美女啊啊啊啊pc| 日本 情色 1区2区3区| 女性喷水高潮在线观看| 极品尤物在线观看| 九一国产精品| 国产多人在线观看视频| 人妻夜夜爽天天爽麻豆三区网站 | 黄色工厂这里只有精品| 国产日韩欧美亚洲精品95| 五月综合视频| 亚洲有薄码区久久在线一区| 色欲三区| 亚洲中文制服诱惑| 欧美日韩亚洲天堂| 人人考人人摸人人干| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日本国产欧美一区三区二区| 91人妻Pr| 狠狠操狠狠燥| 国产一区在线观看无码AV | 色婷婷日韩精品一区二区三区| 欧美亚洲激情| 亚洲精品色| 中字一区| 精品欧美А∨无码黑人大荫蒂| 91丝袜美女国产| 日韩成人人妻网站| 国产熟女乱论| 学生妹天天看| 亚洲一级性爱视频免费看| 青青草原人妻| 亚洲色图91| 综合色久| 色欧美在线| 国产精品无码在线| 韩日自拍| 91足交| 人妻五十路在线| 久久精品午夜国产亚洲AV无码 | 婷婷爽人人婷婷爽视频| 五月丁香婷婷色| 欧美日韩免费专区在线| 亚洲无码精品AV久久久| 啊好大好舒服| 久96热在线观看视频| 欧美嫩性色| 26uuu久久| 国产欧美日韩女同性恋ww喷水精品| 国内毛片四区| ss久久| 91 欧美| 91 丝袜在线| 国产中文大片资源中文字幕| 狠狠躁天天躁日日躁97| 黄片aaaaa一区| 亚洲色图欧美色18直播在线| 丁香五月婷婷基地| 七月丁香婷婷| 无码动漫av中文字幕| 蜜桃成人1区2区3区| 超碰97中文| 草久久久| 欧亚在线视频| 亚洲图片欧美色| 亚洲精品欧美专业| 人妻 中文 日韩| 九99久久| 久久一留热品黄| 亚洲综合另类小说色区亚洲成av人片在www | 中文字幕视频2区| av天堂精品久久| 人人操人人精品影片| 99色视频| 天天摸夜夜添无码小视频| 东北操逼| 人妻日日夜夜精品| 黑人无码一区二区| 91天美| 中文字幕-区二区三区四区视频中国| 嫩草影院性色| 亚洲日韩美女丝袜美腿人妻视频| 超碰99热中文字幕| 91五月天| 日本性爰一道本| 日本五区不卡| 啊啊啊好湿久久| 日韩激情啪啪| 久久性爱精品一区| 美欧色综合| 神马午夜久久久| 五月天婷婷成人网| 一牛影视成人片免费| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 东京热亚洲一区二区| 亚洲乱色熟女一区| 丰满人妻一区二区三区四区| 91无摭挡| 精品无吗久久| 久/久精品99看9| 欧美性爱1080p| 亚洲伊人成综合成人网| 五十路成人在线视频二区三区| 亚洲 中文 女同| 欧美一级A片在线看视频性色| 色香AV| 欧美黑人日韩少妇色情| AV老汉| 久久久婷婷| 在线观看成人性爱免费小视频| 美女91AV| 蜜臀久久99精品久久久久久-DVD| 成人久久久精品| 很黄很污的免费网站| 激情专区综合| 五月天婷精品激情| 亚洲图片婷婷五月天| 丰满熟女一区二区三区在线播放| 爱丝福利| 大香蕉伊然在亚洲91| 精品久久99| 欧美综合站| 久热91| 丁香五月激情综合| 91精品伊人久久久大香线蕉91| 78久久| 久久综合激情| 粉嫩在线一区二区懂色| 免费一级特黄特色大片在线观看看 | 午夜精品人妻二区三区| 一直超碰| 天天舔天天日天天射| 91殴美大片| 夜夜狼人妻| 日本一二区免费| 麻豆精品久久久久久久| 草草影院在线视频| 色五月网址| 免费观看欧美日韩操逼视频| 亚洲天堂中文字幕无码男同| 精品久久99| 久久发布国产伦子伦精品| 色情乱伦AV| 欧美性爱系列| 色色色综合网| 欧美日本久久精品一区 | 熟女天天干| 久久精品夜色国产亚洲AV| 久久久久大香青草精品综合| 日日妻色网| 中文字幕一区二区三区人妻不卡| 欧美性夜| 成人av在线播放| 国产特级毛片AAAAAA高潮流水| 黄色人人| 婷婷五月天基地| 99久久com免费视频′| 一区二区三区视频在线观看免费| 中出91| 久久免费看高潮毛片韩国| 99精品丰满人妻| 欧美综合狠| 99热一区二区三区四区| 啪啪啪东京| 国产亚州高清国产拍精| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 综合网亚洲1| 九九九九精| 岛国A V在线免费看| 操逼免费视频无码国产| 婷婷伊人綜合中文字幕小说| 2025亚洲男人天堂| 久久久91福利姬| 国产一区在线播放| 1人人看人人摸人人操| 国产美女mm131爽爽爽爽| 狠狠色婷婷| 美女AV一区二区| 91精品国产91久久久久久久久久久久| 青女偷拍网| 看免费一级在线播放毛片| 亚洲乱伦图片视频| 艳美熟妇先锋一二三区| 麻豆人妻偷人精品无码视频| 99热这里只有精品18| 久久久国产av美女私房| 99久久九九| 97在线资源| 免费观看成人www精品视频| 七月丁香婷婷| 久久久九九网站| 北京美女一区二区| 亚洲欧美色图小说| 婷婷在线视频| 狠狠干精品一二三四五六2022| 日日日日做夜夜夜夜做无码97| 99色网| 超碰97起碰| 另类TS人妖一区二区三区| 五月天激情婷婷| 日韩亚洲97| 成人自拍三级在线观看| 亚洲最大的黄色电影网站。| 欧美—性—交—色| 99久久e免费热视| 久久鲁夜| 91被操| 日韩欧美麻豆大片| 超碰吊日色| 91在线无码精品秘 软件| 日韩欧美丝袜诱惑| 2025年A片视频精品| 口爆吞精在线观看| 欧美中字二区| 免费的黄片有限公司| 亚洲无套久久嗯嗯| 99热精品在线观看| 欧美亚洲激情| 91亚洲欧美激情| 国产激情在线观看| 久久久久极品| 亚洲二区精品在线观看| 国产乱不卡| 久久婷婷综合国际产色怕| 日本一片一区| 二男一女成人A片| 神马久久久久久久久久| 无码高清国产AV| 日日做夜狠狠爱欧美黑人| 婷婷午夜清品久久久久久久性色视频观| 成人免费福利网站国产| 锕锕好爽 死我在线观看| 乱论91| 老女人91| 婷婷色五月激情| 91亚洲狠狠色| 国产成人资源| 免费看片黄| 啊啊啊快操我视频| 久久久久久久亚洲Av无码| 亚洲日韩XXX| 日本人人操人人操| 绑缚麻绳人妻寝取完整版| 九九综合久久中文字幕| 夜夜骑操视频| 91啪啪视频| 啊啊啊想要| 抽查国产福利主播| 国内毛片婷婷六月色| 91久热| 啊啊啊不要好疼视频| 亚洲欧美人妻| 天天夜夜久久| 艹精品| 人妻久久| 91jk色拍| 91精品久久久久久综合五月天| 玖玖综合网| 天天弄欧美| 日本欧美亚洲高清在线看| 青青草公开在线免费不卡视频| 中文字幕91综合| 十八禁av无码免费网站APP| 日本幼女18+| 国产精品久久久久久夜夜夜| 另类欧美色| 欧美一级专区免费大片| 五月丁香大香蕉| 国产99精品一区二区三区免费| 日韩欧美中文字亚洲慕| 欧美97在线观看| 爽 好舒服 无码刺激久久| 免费操逼91| 老女人91| 欧美在线色图| 性爱久久| 亚洲黄色网址视频| 国产家庭乱伦表演| 天堂av最新电影网| 1二区9| 东京热亚洲一区二区| 超碰在线974| 凸凹视频在线观看| 尤物av网站免费在线播放| 校园春色 亚洲| 欧美色天堂网在线视频| 麻豆人妻精品一区二区| 国产欧美日韩精品中文| 日本人妻伦在线中文字幕| 亚洲操操操无码| 婷婷美人网| 色女网日韩| 亚洲中文字幕av| 国产高清MV操逼视频| 国产偷拍网站| 夜夜躁狠狠躁日日躁av| 国产精品国产| 久久一二三四五六七八九区区| 99热精品在线| 国产伦精品一区二区三区在线观 | 超碰99在线| 国产成人免费观看在线视频 | 久热婷婷| 久久曰曰| 精品黑人一区二区| 伦伦成年午夜免费视频| 不卡av免费在线网址| 日本ZZ高免费A级视频| 欧美日动态视频| 熟女欧美日韩综合婷婷| 熟女乱伦二区| 日韩精品一区的| 久久婷五月天| 91九色网| 久久久久久夜夜夜夜夜| 亚洲图片欧美91N| 五月婷婷基地| 99在线精品观看99| 综合网色| 婷婷伊人綜合中文字幕小说| 激情四射五月天| 再深点灬舒服灬太大了好硬好爽| 黄色性爱网网| 亚洲一本大道中文字幕无码在线| 色视频蜜乳| 丰满人妻-区二区三区| 校园春色AV天堂| 日韩射精| 国产毛片片精品天天看视频| 国产精品人妻免费精品| 日欧操屄| 国产高清在线观看欧美| 国产av美女被艹的乱叫| 91丨九色丨东北熟女| 很很干很很操| 欧美成不卡网| 天美欧美国产| 精久久久| 亚洲资源站| 中国一级αV| 收看日本人日bb| jizzjizz欧美| 色色婷婷五月| 亚洲熟妇乱女区二区三区| 婷婷综合| 久久婷婷在线观看视频| 60秒免费小视频| 四虎影视永久在线观看精品免费网站| 亚洲综合99999| 997色在线| 91精品网站| 1级午夜影院费免区| 乱伦Av网| 怡红院怡春院| 大香蕉92| 日日干天天干夜夜爽| 日韩国产乱子伦App| 最新中文字幕精品在线| 丁香六月啪啪| 欧美五区| 亚洲双插| 国内毛片欧美香蕉精品| 97人人操人人摸人人爱| 亚码激情| 十八禁一区二区无码观看| 怡红院成人视频| www.99色| 激情99| 亚洲成人妻日韩在线| 欧美性夜| 99久久99久久免费精品蜜臀| 久久久国产亚洲精品系列| 亚洲天堂综合AV| 国产精品久久久久久久久久二区三区| 一区二区三| 欧美黄片视频在线观看免费| 免费人人搞97| 天天网综合| 国产女生在线| 天天射夜夜| 无码天堂| 蜜桃色色网站视频三区| 欧美草草| 91人妻素女| 爽爽爽免费视频| 97干在线| 天天天天干| 欧美性第1页| 久久久久久亚洲中文| 影音综合网| 大香蕉日韩| 天天日夜夜爽| 加勒比性爱成人在线| 精品欧美А∨无码黑人大荫蒂| 国产91美女高潮| 青青草好吊色| 天天躁日日躁AAAXX| 天堂精品一区| 性影在线视频| 色综和网| 51国产午夜精品视频| 日韩亚洲美州欧洲综三区一品在线| 大干人妻| 2019天天干天天操| 九九九九欧美| 26uuu性物| 97视频620| 亚川综合视频| 亚洲国产综合久久天堂| 欧美96精品在线| 嗯嗯啊在线视频| 九七色图| 亚洲AV无码乱码在线观看性色| 青青三级视频| 亚洲国产综合视频| 欧美日韩99精品麻豆传媒| 日韩无码极品| 密臀在线免费观看| 中文字幕人成乱码熟女香港| 精品人妻一区二区乱码一区二区| 草草影院最新网址| 亚洲日韩久久精品一区| 亚洲国产高清福利视频| 久久精品成人一区二区三区蜜臀 | 校园春色宗合网| 欧美疯狂做爰xxxx| 黄页网站成人免费| 天天日夜夜| 九九九久久久| 久久久久久性爱视频| 先锋影音av先锋一区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 久久机热| 成人夜夜爽| 久久久久久网址| 日本九九久久99| 人人操人人摸人 | 亚洲第一视频 欧美风情 日韩| 婷婷丁香六月天| 69国产对白刺激| 欧美在线色| 婷婷深爱五月| 欧美一级黄色免费专区| 欧美日韩婷婷中文| 爱做久久久久久| 日韩综合色图| 狠狠爱AV| 蜜臀AV网站| 搡老女人911熟妇老熟女| 久久久久久9999| 一区在线观看中文字幕| 屁股久久久久久| 午夜欧美神马久久久久| 操逼逼无码| 久久久人妻| 日韩精品怡红院| 婷婷在线精品| 99久久精品无码一区二区毛片免费 | 黄片在线免费在线观看| 97国产超碰| 欧美少妇性乱| 色综合久久88色综合久久天天| 久久丝袜| 欧美91色| 天天碰操中国年青熟妇| www.yw尤物| 亚州综合色| 日韩精品人妻中文字幕不卡乱码| 91丨九色丨熟女高潮| 欧美Aⅴ| 天天欧美| 亚洲drav色图| 日韩天堂av电影在线观看| 日本肏逼视频在线观看| 北约熟女超碰| 伊人天天久久动态图| 男人天堂导航| 99黄页网站| 亚洲五区熟女| 天天综合精品| 色色色色综合网| 超碰97亚洲| 亚洲欧美综合网| 欧美一级专区免费大片| 久久9久9久99久9久9| 天天日天天爽| 去干网最新版| 日本www操操操| 久久久久久久久久va| 久久大黄片| 蜜桃精品一区二区三区久在线| 9热9热综合网| 操人妻丝袜高跟| 激情丁香五月婷婷| 天天色播亚洲综合网站| 韩国一级婬片A片无码天美| 亚洲欧洲激情卡通另类文学四射小说网站| 天天情欲宗合网| 日韩电影天堂视频一区二区| 色综合中文字幕不卡| 婷婷久久五月| 久久精品三级影视| 日韩激情中文字幕有码| 日韩性爱毛片操骚逼| 99精品国产户外露出| 97超碰人妻| sewuyueav| 欧美视频一区二区三区| 日日夜夜国产综合| 99re69综合| 亚洲色91C| 成人在线视频一区| 日本中文字幕一区| 国产一区二区久久| 国产免费一区| 丰满丝袜少妇AV| 中文字幕人乱码中文字的预防方法 | 精品人妻一区二区免费蜜桃| 大香蕉十区| 免費人妻夜夜爽天天爽爽一区| 色诱avtt| 国产精品欧美激在线| 另类视频在线| 久久有码视频| 青青草公开在线免费不卡视频| 天堂性色| 极品销魂美女一区二区| 欧美日韩午夜精品一区二区三区| 黄色片A级一区二区三区| 国产视频一区二区三区在线免费观看 | 欧美色院| 成人a级高清视频在线观看| 欧美一二三级精品在线| 国产AV激情无码久久无码| 国产对白刺激视频| 伊人影院综合是一个与深夜成人在线| 国产网红精品| 99热这里只有精品地址| 97色婷| 熟女丰满人妻一区| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 久久精品国产免费观看99| 神马久久久久久伦理片| 91精品久久久久久77777| 青青草日韩无码| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | AV和黑人在线播放| 人人操人人操草草| 熟女啪啪视频| 综合久久99亚洲人妻中文在线| 亚洲欧美激情小说| 欧美少妇高潮| 亚洲中文字幕精品一区| 久久久精品视频免费观看| 日本高清久久| 999 久久久| 91热热色| 久久这里是精品| 猛交交| 97视频在线免费播放| 精品少妇999| 可以免费看黄片的视频| 色情综合网| 亚洲蜜臀懂色| 精品人妻久久久久一区二区三区| 国产探花日韩援交| 手机在线看片免费人成视频| 亚洲 中文 女同| 亚洲欧美91√| 色欲久久久久综合网| 亚洲精品日韩国产欧美| AND人妻系列| 天天综合青苹果| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 国产绿奴视频在线观看| 天天干天天操天天干天天操| 91精品成人www| 久久久亚洲精品中文字幕人妻| 久热影视| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚91网| 亚洲精品a人片在线观看视| 婷婷五月天小说| 久久久成人精品| 中国一级操逼视频| 午夜精品99久久久久传媒| 97久久久网站| 操逼国产免费| 91天天c| 岛国激情视频在线观看| 先锋精品av色鲁| 夜夜夜夜久久久久| 91在线精品| 激情情色五月天| 日韩午夜精品一区二区三区电影| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 国产欧美在线观看免费观看| 婷婷五月天在线观看| 91青青在线视频| 国产女人高潮嗷嗷嗷叫小说 | 唯美清纯 妖精视频| 99视频自拍| 天天操熟妇| 午夜天堂啪啪| 超碰在线综合97| 97人人操人人摸| 9997se| 日韩黄色一区二区三区| 天天天天天超碰| 国产日韩精品人妻久久久久色欲网站 | 欧美黑人91| 玖玖玖玖精品国产剧情| 精品性爱久久视频| 亚欧Av| 自拍啪啪视频| 亚洲精品视频在线播放| 97在线日韩中文字幕| 蜜臀AV网站| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 尤物av网站| 八戒午夜福利理论片| 欧美麻豆成人同性GⅤ在线| 久操影视| 色色操| 欧美AB在线| 91最新综合| 曰韩人妻中文字幕在线| 欧美|91色综合| 亚洲一区日韩精品| 亚洲欧洲无码97久久精品| 国产精品久久久久久久电影渣男| 99蜜桃臀久久久欧美精品网站| 草草影院最新网址| 中文字幕青青草| 欧美亚洲日韩人妻在线观看| 女人综合网| 四虎在线播放| 亚洲一区二区性爱电影| 91亚洲最新在线| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 99日视频在线免费| 天天91~综合入口| 伊人网免费视频| 欧亚成人在线视频| 色区久久| 爱逼综合| 综合欧美日韩在线| 日本免费中文一区二区三区四区| 91美女视频| 肉丝中文无码高清| 国产精品69人妻无码久久久| 蜜汁欧美| 狠狠亚洲| 亚洲国产高清福利视频| 国产性爱强奸乱伦大全| 日本黄色天堂| 男人夜色天堂ss| 日韩欧美国产一区二区三区四区| 91丰满| 亚洲视频一二区| 亚洲丝袜二区| 国产亚洲精品玖玖玖在线观看| 亚洲狠| 久久久内射良家| 亚洲色9| 亚洲高清在线| 性开放中文AV高清无码免费看| 欧亚揄拍偷拍精品视频| 欧美夜夜狠| 免费的黄片wwwwww| 999久久久免费精品国产牛牛| 欧美人妻另类在线| 久久欧洲| 9 9精品一区二区三区| 一级做a爰片久久毛片图片| 天天噜| 综合大香蕉美。| 97色诱| 91老熟女逼| 久9视频| 秋霞网—男女啪啪亚洲免费体验区| 国产成人精品午夜福利| 五月婷视频| 国产精品青草综合久久| 成人无码在线超碰网| 东京太热男人的天堂久久久| 亚洲欧美91| 91免费看一区二区三区| 欧美亚洲厕所精品偷拍91| 懂色AV一区二区三区| 久久人人舔人人爽舔人人av片| 2017天天操天天日| 亚洲欧洲无码97久久精品| 农村妇女一级二级三级视频| 98人妻精品一区二区色欲| 91人妻久久久久久久久久久久久| 成 人 影视 一区 二区 三区 四区 | 91在线一起| 肉丝无码中文高清| 亚洲自拍欧美国产首页网曝 | 97av,com| 亚洲色图 图片| 欧美综合骚| 欧美色五月| 日韩午夜啪啪视频| 日韩黄色一区二区三区| 日韩精品一区二区高清| 亚洲av噜噜噜噜噜噜| 91在线免费精品视频| 啊啊啊啊啊好多水| 亚洲欧美洲综合| 东京热男人天堂| 综合亚洲网| 久色99999| 久久久久久久久国产| 欧美91精彩| 四虎影视永久在线观看精品免费网站| 久9久9精品| 日日夜夜草草草| 超碰69| 亚洲日韩XXX| 久久久久9999妇女| 色诱avtt| 综合激情一一91| 九9热伊人| 久久AV无码1区2区3区| 九九亚洲精品| a人欧美综合天堂麻豆|