亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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无码| 狼天天狼天天大香蕉| 久操视频这里只有精品| 九九自拍伦理| 91欧美www| 天天躁日日躁狠狠躁| www.亚洲黄色| 国产成人久久久精品免费AV| 成人精品视频一区二区| 这里都是精品在线观看| 欧美亚洲首页| 99久久99久久综合| 97欧美资源| 日本一区二区做爱的视频| 中文字幕人妻色偷偷久久皮| 国产欧美黑人丰满在线| 亚洲中文人妻色| 婷婷av在线中文字幕| 日韩专区久久久| 99国产女人| 亚洲熟女av中文字幕| 色盈盈影院| 中文字幕制服诱惑| 欧美熟爽综合| 国产精品3| 精品亚洲俞拍视频一区| 97ai亚洲| 强奸乱伦大香蕉| 色官网在线| 中日无幕一二三四区| 国产日韩欧美| 午夜精品久久久| 中文字幕精品免费一区二区| 亚欧性爱在线无码| 欧美夜夜骑视频| 青娱乐黄色录像| 免费的很黄很污的全部视频| 深爱激情五月天| 人妻少妇三级| 玖玖久久久| 欧美亚洲尤物久久| 日韩精品碰碰| 亚洲丝袜二区在线| 日韩啪啪啪啪啪| 蜜臀一区二区三区在线| 精品九九淫乱男| 国产又粗又大硬免费色网视频| 免费人成?大片在线播放| 1956日韩精品| www.色操逼| 九九久久一区二区伦理| 啊a一区在线| 97国产精选| 欧美夜夜草视频| 欧美激情另类一区二区| 精品九九淫乱男| 亚洲 欧美 手机在线观看| 色婷婷国产精品一区在线观看| 亚洲熟妇综合久久久久久| 精品少妇后入一区二区三区四区人妻巨乳 | 91精品综合久久久久久五月丁香| 日曰骚久久精品| 大学生美女口爆| 欧美 亚洲 在线| 欧美牲| 日韩免费看黄片| 黄色不卡视频| 97超碰磁| 中文 人妻 制服| 日夜干射色啊| 亚欧成人中文字幕一区| 大香蕉视频一二三区| 五月丁香激情四射| 91性网| 色情五月综合婷婷| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 亚洲 欧美 日韩另类 麻豆| 九九九不卡| 亚洲drav色图| 骚乳在线| 玖玖人人爱| 在线v中文字幕一区二区三区 | 亚洲激情网| 亚洲日韩精品一区二区| 中文字幕黄色片| 18禁免费视频| 婷婷色色五月天| 99日视频在线免费| 日韩在线观看字幕精品| 玖玖资源视频一区二区三区| 性爱av网站| 91 综合 色| 八戒午夜福利理论片| 亚洲不卡av在线| 午夜福利1区2区3区| 99re不伦| 香蕉热人人精品| 91爱看| 啪啪AV导航| 超碰无码五月97| 国产大学生口爆吞精合集| 日韩图区| 亚洲精品美女久久久久久久久| 97在线观看免费| 99操碰| 老司机香蕉久久久久| 一本道综合色图| 亚洲无码com| 绯色AV粉色AV蜜臀AV| 最新国内自拍av免费| 人妻熟女一区二区| 精品超碰国产| 国产丝袜欧美在线视频| 欧美精品一区二区少妇免费A片| 成年女人18级毛片毛片免费观看| 久久精品人体| 亚洲天堂综合AV| 色色99| 免费一级精品啪啪视频| 免费精品无码一级毛片牛牛影视| 精品欧美不卡在线播放| 婷婷国产精品一区二区| 亚洲 日韩 丝袜 熟女 变态| 国产91美女视频| 91N欧美| 人人弄人人摸| 九九九草| 日韩免费簧片| 人人插人人摸人人| 九一屌逼| 亚州人妻| 色婷婷日韩精品一区二区三区| 91快色色色色色| 亚洲中文字幕精品一区| 国产一区二区在线播放量| 国产精品电影大全| 久久国产视频性吧 | 精品人妻一区春色| 淫妻综合网| 100啪啪视频大全| 97国产色综合| 欧美色乱| 亚洲AV成人无码一区二区三区在线观看 | 久久美女国产| 禁片 高清 在线观看视频网站| 久久久久久久一级黄色打同平台| 97综合在线观看| 91被操| 91狠狠综合久久| 大肉棒导航| 亚洲免费看片| 91精品久久久久五月天精品| 在线视频 亚洲精品| 无码久| 国产成人网址| 91精品国产91久久久久久久久久久久| 老妇女91| 久久婷婷亚洲| 少妇99| 亚洲中文字幕在现观看| 色综合色色| 裸体美女国产免费久久久网站| 色婷婷九月| 欧美老妇女内射网址| 亚洲欧美天堂| 东京成人一区| baisiav| 免费视频在线一区二区不卡| 春色91| 99热18这里只有精品| 天天操天天射青青草| 在线观看精品国产免费| 亚瑟国产精品久久无码| 国产色图乱伦| 欧美一级二级三级| 国产一区二区在线看| 欧美国产一区二区三区麻豆传媒| 97在线免费看| 99色在线| 大香蕉人妻| 日韩色欲久久一二三四区| 国产黄色剧情影片麻豆免费播放| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 激情抓乳插进去啪啪啪日韩| 男人的天堂在线| 国产成人久久精品蜜臀| 日韩情色视频| 五十路熟女工口| 天天日天天舔东京热| 精品国产Av无码久久久亚洲| 操一区| 国产精品秘 福利姬在线观看| 亚洲av无码成电影在线播放| 又粗又长又大国产不卡| 天天噜| 国产亚洲深夜激情| 久久久久久久久久久人妻| 手机在线大香蕉| 久久熟女人| 欧美成人性爱视频在线播放| 欧美大片天天看| 你懂的在线观看区国产| 综合久久97| 人人操人人色网| 玖玖97综合| 婷婷五月天激情小说| 在线a v| 370p日韩欧美亚洲精品| 天天弄天天操| 久草免费福利在线播放| 精品少妇一区二区三区在线视频| 亚洲,日韩,欧美,成人播放| 蜜臀在线网站| 成人影 天天操 亚洲| 国产宅男宅女在线观看| 97超碰9| 六月婷婷综合| 91亚洲影院综合| 风间由美日韩欧美久久| 国产乱码精品一区二区三区四川| 乳欲人妻办公室奶水| 人妻一区二区三区四区视频| 张柏芝国产一区在线观看| 亚洲高清综合网| 亚洲熟妇自偷自拍另欧美| 日本性爱欧美性爱| 日韩免费一级性爱视频| 久久久精品一区二区| 手机看av网站在线看| 另类图片综合| 高树玛利亚无码流出| 大香蕉狠狠爱| 久久99999| 成人看片网站| 欧美黑人猛交春色影视大全| 中文字幕视频2区| 国产盗摄美女如厕大神作品在线观看| 走光一区92下载| 蜜桃一区二区三区| 国产99999久久精品| 久9久9久9久9久9久9| 天天躁日日躁狠狠狠躁| 亚洲同性aV综合| 亚洲AV无码乱码| 涩综合导航| 天堂中文日本在线观看| 久久国产三区| 女人的久久久| 久久综合久色欧美综合狠狠| 加勒比aⅴ| 天天澡天天狠天天天做| 国产理论视频在线播放| 乱伦系列一区二区| 国产久久久9999| 老司机免费视频在线91| 鸥美中出| 人人看人人爰人人操| 91狼人| 五月天综合在线| 97色论| 久久久久国产一区二| 日本高清视频xxxx| 欧美性爱三区二区| 国产粉嫩出水在线播放| 九月丁香| 亚码激情| 亚州中文字幕超碰97| 天天澡天天爽日日AV| 欧洲天天在线| www久| 天天干天天日天天射黄色大片 | 久久av无码| 天天做日日做天天欢。| 手机不卡视频不卡在线一二三区 | 日本精品不卡一二三区| 日本女人操逼| 女色视频社区| 调教熟妇 久久久久久| 美女啊啊啊啊pc| 这里是精品| 一区久久久二区| 91国模| 欧美日本久久精品一区 | 四虎影院成年人片| 九九九九日本| 成人无码欧美一级A片狼牙直播| 26uuu国产亚洲综合| 一区二区三区黄色片a| 午夜高清成人在线视频| 99热超碰| 色盈盈影院| 福利天堂| 色99999| 国产激情视频一区区三区| 日夜尻逼网| 免费农村成人少妇人妻Aa一区二区视频 | 小少妇| 色综合久久夜色精品国产天堂| av天堂电影网| 乱伦av麻豆| 麻豆国产av网| 丝袜视频网国产90| 91碰超| 日韩在线人妻网站| 日本在线观看网址| 蜜桃视频精品一区二区| 国内外激情在线| 久久黄色性爱视频| 亚洲人成色9999精品久久| 亚洲色性| 水野优香在线观看| 欧美综合色图网| 九九探花视频在线观看| 精品人妻一区二区三区夜夜| 91亚洲网| 亚洲午夜av| 伊人嫩草| 色爱三区| 欧美日韩系列| 欧美强奸一区二区诱惑| 九九成人精品| 久久永久无码人妻视频| 99超碰色| 极品肉射| 国产综合网站在线播放 | 91在线欧色| 久久久久久裸体| 国产自制av蜜乳| 国产精品另类一区大香蕉| 91美女高潮| 后入人妻无码| 国产91精品在线免费| 极品极品色影院| 中文字幕诱惑制服人妻丝袜美丝袜美 | 9999伦理视频| 97色碰| 五月天久久综合网| 亚洲高清内射| 国产91亚洲精品一区二区三区| 蜜臀亚洲中文| 中文字幕激情小说| 清纯唯美亚洲综合| 欧美福利视频啊啊啊啊| 色九九九九| 亚洲第一页综合在线| 高跟丝袜AV专区国产| 欧美亚洲国产日本在线,久久精品国产| 高潮的A片激情扒开一区| 一区二区三区蜜桃成人撸久久东京热| 乱性AV| 最新亚洲风情电影| 国产熟女完整版中字| 9997se| 亚洲一区中文字幕一区| 1024精品在线| 天天干天天日天天射黄色| 2017av无码免费无线播| 泰国AV在线观看| 欧美爆乳精品一区二区| 久久一区,青青青青草视频在线播放| 91看黄片| 无码人妻毛片丰满熟妇精品区| 日本三级韩三级99久久| 啪啪综合网| 大稥蕉免费视频这里只有精品| 呦呦一区| 色踪合AV| 国产av尤物| 在线人成亚洲视频免费观看| 1204人成网站色www| 亚洲免费人妻在| 天天亚洲| k频道色撸撸| 欧美另类精品xxxx| 亚洲成成熟女人综合一区二区| 国产精品免费视频人成| av亚欧| www.97在线| 91在线丝袜| 无码 黑人一区二区三区| 一级特级aaaa毛片免费观看| 欧美猛交黑寡妇中文字幕| 久久精品国产97欧美精品亚洲 | 97婷婷色| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 一区二区三区高清天码| 91n处女在线观看| 夜夜草网站| 久久99久久99精品天美传媒棢·纸:. | 95人妻爽爽人人做人人澡| 午夜久久一区二区无码中出| 99热18这里只有精品| 日韩 欧美 视频 在线 一区| 九九九九九九九九九国产精品| 宗合情欲网| 国产视频一区二区免费| 亚洲精品一二牛牛| 日韩特一级久久| 爱欲AV| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩中文字幕不卡| 欧美色图下一页| 日韩精品 资源| 亚欧无码在线| 国模无码人体一区二区三| 91国产丝袜美女| 内射中出日韩在线观看视频| 91N欧美| 九九干| 国产乱子伦一区二区三区在线观看| 一摸二插三插| 中精品一区二区三区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 久久综合女优| 色狠狠综合| 亚洲国产97在线精品一区| 国产夜夜操| 国产成人无码久久精品| 亚洲好看强奸乱伦| 国产捆绑一区| 死我十八禁| 成人av毛片在线观看| 久久AV无码AV| 后入人妻无码| 老妇女91| 一区二区三区免费视频入口 | 精品国产一区二区三区在线播出| 中文字幕诱惑制服人妻丝袜美丝袜美| 欧美国产日韩清纯唯美| 台湾佬中文娱乐网久久久久久久久久com | 欧美暴力猛交| 伊人久久婷婷| 欧美一区二区三区日韩| 国产三级多多影院2022国产AA一级毛片无码 | 后入国产| 午夜美女诱惑电源网| 91N综合网在线| 加勒比日本在线| 少妇诱惑视频| 久久久久久亚洲精品中文字幕人妻| 免费看一级a性色生活片久久无| 欧美国产精品久久九九| 97精品网| 综合欧美色图| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 天天弄天天操| 国产精品久久久亚洲一区| 强上我不卡卡| 日本顶级天天操狠狠操夜夜操中文字幕| 欧美日韩青操| 久草资源在线| 国产一级内射高清视频| 91五十路| 久久婷婷苹果| 少妇同性| 加勒比伊人影院| 国产人伦精品一区二区三区| www.大香| 亚洲五码一区二区三区| 一区二区三区免费岛国片| 日本不卡高清视频| 色伊人91| 亚洲欧洲精品视频发布| 日本一区二区不卡精品| 色爱综合网欧美| 日本在线999| 人妻无一区二区三区| 激情综合婷婷| 久久久久ab| 久久东京热成人| 国产剧情AV不卡在线观看| 在线人人人人人人精品超| 色妇综合网| 日韩在线观看AV| 日韩欧美国产高清视频| 激情小说图片亚洲首页| 精品人妻一二三| 国产91亚洲精品一区二区三区| 操操逼视频| 7777奇米影视久久| 乱伦av国产| 白嫩国模丰满一二三区| 操操啪| 97精品国产97久久久久久| 中文字幕在线播放2中文字幕在线观看2| 日本超碰在线国产一区| 欧美精品第四五页中文字幕在线观看| 久久久久中出| 国产妇女精品视频青青草| 超碰69| 99re这里只有精品2| 诱惑网综合| 免费av在线播放二区| 国产操逼逼网| 亚洲天堂,男人| 日韩人妻网站| 欧美在线|亚洲| 熟女人妻一区二区三区免费看 | 亚州人妻| 天天热精品| 黄页av| 密乳AV免费观看| 欧美大香蕉97| 日韩性爱1级片视频| 青青草精玖玖69精品| 女性喷水高潮在线观看| 日韩传媒在线| 97啪啪| 久久久久成人蜜桃精品| 亚洲国产一级中文综合久久天堂在线免费观看 | 91中文字幕| 国产午夜精品理论片a大结局| 久久婷婷电影网| 丰满人妻一区二区三区| 国产精品999zyz| 久久曰曰| 日本999精品| 91bbbbbb| 翔田千里Av在线| 综合一区中亚洲国产成人综合精品| 在线视频五十市| 久热这里只有精品9| 国产中文字幕在线点播| 99热在线播放| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 精品国产99| yazhouzaixian| 日韩有码 一区二区三区| 日韩一级特黄av毛片| 麻豆人妻精品一区二区| 亚洲日韩久久精品一区| 国产欧美另类久久久精品课程| 第四色奇米影视777| 九色在线熟女国产黑人| 日本加靬比网站发布页| 亚洲性天堂| 97人人操人人摸人人爱| 夜夜高潮夜夜爽高清视频一| 这里只有97精品| 亚洲av国产av综合av卡| 日本三级黄页| 久久久精品九| 久久精品中文字幕观看| 男人天堂站| 91精品国| 性爱乱伦网址| 97干com| 成人夜夜| 亚欧无码在线| 啊啊啊快操我视频| 性色AV蜜色av色欲av| ?亚洲伊人伊成久久人综合网| 精品四五区| 东京热91| 自拍鲍鱼一区在线高清观看免费| 超碰久在线天天做| 黄色操人| 久久亚州高清| 男人的天堂久久久| 在线不卡视频| 日韩综合色网| 综合操逼| 精品人妻一区二区三区视频| 无码一区二区精品视频久久久春药| 久久人妻视频| 九九热精品视频六| 久久精品国产免费观看99| yy少妇精品久久| 国产精品爱欲| 97久久精品亚洲中六字幕| 蜜臀久久99精品久久久| 日韩人妻精品久久久久| 国产乱不卡| www.久久最新地址| 啊啊啊在线观看免费视频| 小说区 图片区色 综合区| 91婷婷伊人狠人| 97人人爱人人乐| 欧美99热| 亚洲高清色综合| 亚洲午夜福利视频| 疯操AV| 黄色网址在线免费观看| 亚洲精品日韩国产欧美| 日本午夜精品理论片A级APP发布| 乱码人妻一区二区三区| 日韩久久.一级黄色片| 九九九久千久久激情蜜桃在线看 | 五月天黄色av| 97aiaiai| 欧美狠狠弄| 在线亚洲欧美| 色女女女导航| 日韩一区二区精彩视频| 亚洲另类综合欧美| 人人爱人人乐人人操| 欧美狠狠操| 久草加勒比一区在线| 五月婷婷综合网| 97在线免费视频观看| 又黄又爽在线观看视频| 欧美精品三级黄片| 成人热久久精品| 美女极品一区二区三区| 久久人妻一区二区三区高清 | 18一区二区三区| 欧美特大AA级黄片| 少妇第一页| 国产日韩欧美操逼视频 | 久久这里只精品| 极品色社| 国产成人精品必看 | 九九久久一区二区三区| 人妻啪| 加勒比久久av| 五月天婷婷基地| 麻豆精品.欧美精品.日韩精品.| 女人的久久久| 国产精品永久免费10000| 97精品97| 中国一区二区亚洲人妻| 久久伊人影院| 97 超碰 人人做 人人爱| 国产成人精品必看 | 日韩成人精品| 韩日精品福利视频一区不卡在线免| 欧美久久伊人| 精品免费成人久久| 大香蕉123| 亚洲中文字幕熟女| 亚洲人精品午夜不卡| 男人的天堂亚洲| 色操逼网| 国产999精品久久久| 欧美色图天堂网m| 男男H黄动漫啪啪无遮挡网站| 久久超碰com| 性性欧美| 美女诱惑爱爱| 色色香蕉| 色爱亚洲| 亚洲欧美在线综合| 日本天天吊| 高清无码 国产精品| 久草在线| 欧亚日韩综合精品国产| 免费精品99| 国产黄片精品在线| 美女久久久久久久久久久| 亚洲熟女乱综合一区二区三区 | 国产欧美伊人| 国产色精品午夜大片| 操东北女人| 亚洲天堂人人妻| 一区在线观看中文字幕| 免费的黄片有限公司| 东京热,男人的天堂| 操操操操网黑人| 午夜免费视频1000| 欧美午夜一区二区三区| 性爱网站一区二区| 亚洲日韩美女丝袜美腿人妻视频| 偷拍色图| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 桃色五月天| 国产亚洲精品美女久久久m| 国产自制av蜜乳| 精品久久97| 黄久在线| 夜夜操av亚洲一区二区| 8050午夜少妇无码| 中文字幕一区二区三区字幕| 日本 情色 1区| 久久大线蕉一区| 久久久com| 操碰97| 久久肏大逼| 懂色av色欲av蜜臀av| 日本影视久久免费| 天天综合中文字幕 91| 蜜桃午夜视频一区二区 | 999在线电影香蕉| 精品-91人妻子系列| av在线不卡一区二区三区| 精品国产乱码久久久久久日本公司| 操逼精品视频| 97硬碰| 99热99re超碰精品| 人人色97| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 99热在线播放| 簧片免费看视频| 蜜乳AV一区| 天天综合亚洲综合| 少妇精品久久| 先锋女优在线观看视频| 伊色久人大在线| 九九九不卡| 亚洲丝袜二区在线| 秋霞鲁丝午夜无码一区二区三| 91久久18禁| 国产福利夜| 欧美淫穴| 男人的天堂2018东京热啪啪啪| 中文字幕在线播放2中文字幕在线观看2| 国产高潮AA片免费看| www网站黄| 国产精品久久99日日| 亚洲国产尤物yw在线观看| 久久精品久久九九精品| 在线岛| 中日亚韩免费视频| 国产av又色又爽又黄| 天天爽夜夜爽夜夜爽精| 伊人影院日本| 国产辣妈在线视频福利| 粉嫩av平台| 免费家庭乱伦视频| 吖在线不卡一区二区国产剧情| 伊人五月天婷婷| 国产久久成人| 国产精品一区二区校花| 懂色天天爱天天日天天射天天澡| 成人性爱视频在线看| 国产中文精品一区二区在线观看| 99这里只有精品国产| 26uuu欧美日韩| 欧美大香蕉同搞| 亚欧Av| 丁香婷婷九月| 欧日韩不卡视.频| 18一区二区三区| 中国黑人三级片网站上区| 色婷婷久久综合超碰| 天天操天天7| 国产精品一区在线播放| 91日韩国产欧美亚洲另类精盘州至城都| 酒色综合网| 日本中文字幕不卡视频| 中国一级操逼视频| 亚洲最大AV网| 天天摸,夜夜摸| 天天欧美欧美亚洲网| 好吊色一区| 欧美色图人妻| 欧美日韩小说| 啊啊啊爽爽| 欧洲黄色网| 亚洲最新中文字幕免费| 亚洲另类电影| 91女网站| 日韩人妻无码精品系列| 玖玖大干人妻| 亚洲在线欧美| 91狠狠| 国产精品久久99日日| 国产尤物AV尤物在线观看不卡| 超碰在线国产| 久久综合久久综合人久久夜精品| 亚州色图片在线色| 日韩无码服务区| 偷拍综合网| 91丝袜美女视频| 可以在线观看的黄色网址| 翔田千里av一区二区三区| 人妻久热在线| 男人的天堂久久狠| 自拍啪啪视频| 色色色日本| 国产精品视频精品一二| 中文一区二区婷婷视频| 综合97久久| 熟女熟妇一区二区三四区| 国产精品久久妻无码网站| 操逼大黄片| 五月婷在线| 亚洲第91页 | 亚洲一区二区精品福利| 国产高清1234区| 好爽免费视频,| 国产美女高潮| 亚洲无线码一区国产欧美国| 欧美色图片91| 熟妇人妻一二三区免费| 大香蕉免费3| www久| 十八禁黄色成人网站观看| 99精品九九九九九九| 欧美影院一区二区三区| 搡老熟女老女人老熟妇免费视频| 插入综合网| 加勒比人妻综合| 在线视频97| 免费A V在线| JULIA人妻风俗店中出电影| 九九超碰综合网| 亚洲春色欧美激情自拍| 免费综合亚洲中文| 日本A级视频| 伊人欧美大香蕉视频| 亚洲天堂一区二区久久| 亚州宗合另类| 91AV天美在线视频| 国产精品无码成人精品| 9999免费精彩视频| 色哟哟1区2区| 久久丁香久草综合网| 91GD.COM| AV色五月天| 精品成人无码| 四虎AV无码| www亚洲欧美| 色综合网1| 亚洲国产丝袜在线观看| 日韩一级性爱无码| 99成人| 欧美久久人体| 熟女五十路一区二区三| 久久色人体| 亚洲AV色图| 国产精选三级在线观看| 污污污8888| 国产福利一区二| 亚洲国产欧美日韩人妻日中文| 亚洲欧美综合图片| 精品人妻美妇91job| 日韩av色图| 飘花国产午夜精品不卡| 春色校园综合网| 男女无套 免费网站| 午夜免费视频1000| 蜜桃臀久久| 人妻人人做人人澡人人爽欧美一区| av线电影| 91爆操视频| 欧洲精品欧洲精品| 亚洲乱码尤物193YW| 偷拍片久久| 欧美成人一区二区三区在线播放| 成人日本片久久久蜜桃| 图片区小说区| 亚州五月| 色狠狠综合| 亚洲女优有码无码高清| 国产精品老师| 熟妇高潮二区三区| 午夜欧美女人操逼| 自拍第一页| 日韩中文字幕人妻视频| 狠色婷婷久久一区二区三区_| 国产精品一区午夜福利| 日韩欧美资源| 日本狂喷奶水在线播放212| www.男人天堂| 国产呦精品一区二区三区下载| 超碰97综合网| 亚洲欧美精品一区天堂久久 | 久久久久日本视| 国产精品麻豆成人av| 少妇500双飞99| 无码操逼网| 国产精品动态一区二区三区四四| 色吧综合网| 高潮精品| 欧美五区| 国产一区二区av综合| 91精品免费| 伊人激情| 高清国产无码av| 九九九九九精品十六| 最近的最新的中文字幕视频| 色97干| 超碰97资源大奶| 99热99在线播放激情| 加勒比久久av| 欧美久久九九| 色综合久久av| 亚洲图片偷拍欧美| 91 亚洲 欧洲| 成年人三级黄色片视频| 91激情国产| 亚洲精品久| 久久久久免费看少妇A片特黄| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 天天做天天爽| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 亚洲骚女一区二区三区| 亚洲精品一二区| 东京太热男人的天堂久久久| 精品大久久| 亚洲古典另类欧美在线| 猛猛干| 97精品国产97久久久久久户外免费| 欧美五十路熟| 加勒比综合在线| 97硬碰| 国产精品无码论坛| 大香蕉一级黄色片久久| 后入式视频国产自| www.99色| 日本成人A片免费看| 在线视频资源| 小骚逼被操的爽不爽| 欧美激情五月天| 成人AV超碰免费在线| 日天天九九天堂666| 亚洲视频小说| 97操碰| 国产精品一区午夜福利| 97欧美综合网| 九九九精品一区二区无码| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 久久婷婷五月综合| 91丨豆花丨熟女| 欧洲精品二区| 香蕉色网| 色鬼在线综合| 超碰成人免费| 欧美日韩操逼动图| 91免费看一区二区三区| 蜜桃香蕉久草精品在线| 双插在线| 五月天啪啪| 日本一区二区做爱的视频| 国产精品一二三区18| 好湿好紧视频| 久久AV色| 综合久欧洲| 青青草日韩无码| 小情侣高清国产在线视频| 亚欧毛片基地国产毛片基地| 99久在线精品99re8蜜桃| 天天超级碰碰碰| 亚洲欧洲偷拍一区| 亚洲精品日韩国产欧美| 精品午夜福利国产一区二区在线观看| 女生91网站| 大香蕉99re| 国产麻豆一区二三区| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 啊操爽品善一区二区三区| 日韩精品区二区三区不卡| 国产成人在线观看综合| 韩国黄片aaaa| 成 人 A V免费视频在线观看| 青草一区二区| 亚洲天堂一二| 99热8| 伊人精品国产| 亚洲精品骚逼| 日韩在线视频1234| 五月婷丁香| 久久五月视频| 欧美性爱系列| 国产中文字幕曰本毛片| 一级片视频啪啪| 伊人操| 亚洲国产精品无石码久久| 吊色| 97精品在线| 久9久精品视频| 熟妇一区二区三区| 女一区二区| 亚洲综合码| 激情四射婷婷四五月天| 操狠狠| 国内91熟女人妻丝袜天天精品视频在线 | 国产资源中文字幕在线| 男人的天堂 在线一区| 91久久青青草原精品| 97欧美综合| 久久超碰97| 国产激情视频一区区三区| 97免费视频在线| 超碰美女97| 91高潮| 亚洲日韩电影| 成年无码动漫av片无尽在线 | 91成人国产综合久久精品蜜月| 亚熟在线| 精品一区二区三区四区女| 精品九九九九九九九| 妇女视频网站| 热热热热日日漂亮永久永久国产日| 欧美日动态视频| 久久婷婷亚洲欧| 欧洲精品区| 欧美 日韩第一性色| 四虎免费在线播放| 久热这里只有精品9| 麻豆天美一区二区| 国产女人视频三四五区| 伊人国产成人av网站| 亚洲国产成人精品999| 另类TS人妖一区二区三区| 日本三级A片网站com| 国模不卡| 精品人人插人人操| 色五月婷婷久久| 国产欧美日韩在线观看麻豆传媒公司| 欧洲综合视频| 天天做天天爱天天爽AV| 欧美影音在线| 日日干日日摸| 躁躁躁日日躁2020| 一级做受视频免费是看美女| 日韩免费在线视频观看| 欧美一区二区三区蜜桃| 操99| 国产九九久久久精品| 大香蕉在线86| 99热国产精品| 一区二区影视| 91视频精品| 久操网线| 天天插天天插| 猛交交| 欧美 青青草| 老熟女中文字幕高清| 欧美日日人人天天| 成人天天爽| 国产精品一区在线播放| 国产精品扒开腿做爽爽爽视频| 久久的免费性爱视频| 久操网无码在线| 日本操逼二区| 色综合久久888| 日韩99神马视频播放片在线播放| 精品美女在线视频| 国产午夜视频| 亚洲好色人妻| 欧在线一二区| 99视频这有这里有精品| JIZZJIZZ国产精品喷水| 黑操B| 久久综合久色欧美综合狠狠| 欧美国产婷婷久久| 收看日本人日bb| 九月婷婷| 美女AV一区二区| 夜夜夜夜爽| 国产精品久久久久久久久久久久| ..日韩av毛片精品久久久| 丁香激情五月天| 欧亚第一综合网| 亚洲蜜臀精品视频久久| 亚洲精品一二牛牛| 亚洲古典另类欧美在线| 日本不卡高清免v欧美日韩在线观看| 日本中文字幕一区| 上特色A在线| av网页一区二区三区| 狼天天狼天天大香蕉| 黄久在线| 老妇女91| 欧亚乱色熟女一区二区| 九九九综合精品| 91天天综合在线观看| 黄色视频高清无码网站| 免费的黄片wwwwww| 欧美国产视频| 欲色综合| 激情国产乱伦Av| 97色冈| 性九九九九九九| 东京热一区二区中文字幕| 簧片免费看视频| 一区二区蜜臀| 午夜精品久久久久久久久久久久久| 无码WWW免费视频网站| 夫妻四区五区六区| 91制服丝袜| 熟女五十路一区二区三| 丝袜内射| 亚洲se91| 亚洲97久久精品亚洲| 91在线视频免费中出| 人妻第一页| 看日韩操逼| 欧洲亚洲人妻无码中字久久三区四区 | 亚洲九区| 乱色老一区二区三区的观看方式| 欧美呦呦性爱| 日韩偷拍色图| 熟妇人妻丰满久久久久久久无码 | 在线播放成人网站| 国产精品动态一区二区三区四四| 91人妻精华帖| 91精品综合久久久久久五月丁香| 亚洲女人毛茸茸91| 国产探花精品在线| 2019天天操天天爽天天拍| 99精品人妻| 丁香五月成人| 精品视频一区二区| 亚洲中文字幕精品一区| 懂色AV一区二区三区| 国产成人五月天丁香花| JULIA一区二区三区在线播放| 欧色性第一页| 亚洲黄片免费在线播放| 另类在线| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 国产精品毛片?v一区二区三区 | 美中日韩无码| 无码99| 欲香欲色综合天天伊人| 国产男人又猛又粗又爽| 天天插天天操天天摸天天射天天看| 日韩人妻有码免费视频| 伊人网av| 色综91| 欧美 亚洲 制服 精品| 欧亚日韩中文在线| 狠狠干婷婷| 老司机香蕉久久久久| 涩五月婷婷| 91性情| 婷婷五月天网| 天天综合官网| 国产精品久久久亚洲一区| 久久久亚洲熟妇资源| 九九99精品视频在线观看| 狠狠色五月亚洲91| 日本色色网| 9精品久久久久| 三级三级三级日本99| 97免费在线观看| 四虎影库国产精品免费| 无码人妻精品酒店| 色 婷97| 日韩性爱视频在线免费观看| 不卡九肏| 亚洲高清无毛一区二区| 超碰人妻中文在线| 天天躁日日躁xxxxx| 成人欧美日超碰| 人妻精品一区二区在线| 欧美狠狠狠| 欧美色棕合| 五月亭亭六月丁香| 91最新综合| 亚洲男人久久综合天堂| 东京热精品97综合网| 日韩性爱免费视频在线网站| 欧美爱国产综合、| 五月婷在线| 色妇综合网| 美女淫穴| 日韩精品中文字幕一| 91综合天天看| 任你艹| 亚洲日韩人妻中文字幕一区| av一区二区三区四区五区久草臀| 91c色| 97伊人超碰| 欧美大码在线视频| 涩涩涩综合| 91视频女生|