日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记一次代码重构

發布時間:2024/1/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次代码重构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單一職責

功能單一

功能單一是SRP最基本要求,也就是你一個類的功能職責要單一,這樣內聚性才高。

比如,下面這個參數類,是用來查詢網站Buyer信息的,按照SRP,里面就應該放置查詢相關的Field就好了。

@Data public class BuyerInfoParam {// Required Paramprivate Long buyerCompanyId;private Long buyerAccountId;private Long callerCompanyId;private Long callerAccountId;private String tenantId;private String bizCode;private String channel; //這個Channel在查詢中不起任何作用,不應該放在這里 }

可是呢? 事實并不是這樣,下面的三個參數其實查詢時根本用不到,而是在組裝查詢結果的時候用到,這給我閱讀代碼帶來了很大的困惑,因為我一直以為這個channel(客戶來源渠道)是一個查詢需要的一個重要信息。

那么如果和查詢無關,為什么要把它放到查詢param里面呢,問了才知道,只是為了組裝查詢結果時拿到數據而已。

所以我重構的時候,果斷把查詢沒用到的參數從BuyerInfoParam中移除了,這樣就消除了理解上的歧義。

Tips:不要為了圖方便,而破壞SOLID原則,方便的后果就是代碼腐化,看不懂,往后要付出的代價更高。

功能內聚

在類的職責單一基礎之上,我們還要識別出是不是有功能相似的類或者組件,如果有,是不是要整合起來,而不要讓功能類似的代碼散落在多處。

比如,代碼中我們有一個TenantContext,而build這個Context統一是在ContextPreInterceptor中做的,其中Operator的值一開始只有crmId,但是隨著業務的變化operator的值在不同的場景值會不一樣,可能是aliId,也可能是accountId。

這樣就需要其它id要轉換成crmId的工作,重構前這個轉換工作是分散在多個地方,不滿足SRP。

//在BaseMtopServiceImpl中有crmId轉換的邏輯public String getCrmUserId(Long userId){AccountInfoDO accountInfoDO = accountQueryTunnel.getAccountDetailByAccountId(userId.toString(), AccountTypeEnum.INTL.getType(), false);if(accountInfoDO != null){return accountInfoDO.getCrmUserId();}return StringUtils.EMPTY;}//在ContextUtilServiceImpl中有crmId轉換的邏輯public String getCrmUserIdByMemberSeq(String memberSeq) {if(StringUtil.isBlank(memberSeq)){return null;}MemberMappingDO mappingDO = memberMappingQueryTunnel.getMappingByAccountId(Long.valueOf(memberSeq));if(mappingDO == null || mappingDO.getAliId() == null){return null;}}

重構的做法是將build context的邏輯,包括前序的crmId的轉換邏輯,全部收攏到ContextPreInterceptor,因為它的職責就是build context,這樣代碼的內聚性,可復用性和可讀性都會好很多。

@Overridepublic void preIntercept(Command command) {...String crmUserId = getCrmUserId(command);if(StringUtil.isBlank(crmUserId)){throw new BizException(ErrorCode.BIZ_ERROR_USER_ID_NULL, "can not find crmUserId with "+command.getOperater());}...}//將crmId的轉換邏輯收攏至此private String getCrmUserId(Command command) {if(command.getOperatorIdType() == OperatorIdType.CRM_ID){return command.getOperater();}else if(command.getOperatorIdType() == OperatorIdType.ACCOUNT_ID){MemberMappingDO mappingDO = memberMappingQueryTunnel.getMappingByAccountId(Long.valueOf(command.getOperater()));if(mappingDO == null || mappingDO.getAliId() == null){return null;}return fetchByAliId(mappingDO.getAliId().toString());}else if(command.getOperatorIdType() == OperatorIdType.ALI_ID){return fetchByAliId(command.getOperater());}return null;}

開閉原則

OCP是OO非常重要的原則,遵循OCP可以極大的提升我們代碼的擴展性,要想寫出好的OCP代碼,前提是要熟練掌握常用的設計模式,常用的有助于OCP的設計模式有Abstract Factory,Template,Strategy,Chain of Responsibility, Obeserver, Decorator等

關于OCP的重構需要注意兩點:

  • 不要濫用設計模式:不要有了錘子就到處亂錘,不恰當的使用不解決問題不說,還會增加復雜度。
  • 要敢于重構:很多的功能點一開始都不需要擴展的,但是隨著業務的發展,會變得需要擴展,此時就需要果敢一點,該重構重構,該上設計模式,上,不能等,不能將就!

這里主要以Template和Chain of Responsibility為例,來介紹關于OCP的重構。

模板方法

比如,在處理Leads的時候,針對不同的Leads來源,其處理可能稍有不同,所以我重構的時候,覺得模板方法是比較好的選項。

因為對于不同的Leads來源,只有在線索已存在,但沒創建過客戶的情況下,處理邏輯不同,其它邏輯都可以共用,那么把processRepeatedLeadsWithNoCustomer設置為abstract就好了。

Tips:在使用設計模式的時候,最好能在類的命名上體現這個設計模式,這樣看代碼的人會更容易理解。

public abstract class AbstractLeadsProcessTemplate implements LeadsProcessServiceI {...@Overridepublic void processLeads(IcbuLeadsE icbuLeadsE) {IcbuLeadsE existingLeads = icbuLeadsE.checkRepeat();//1.新線索if(existingLeads == null){processBrandNewLeads(icbuLeadsE);}// 2. 線索已經存在,但是沒有創建過客戶else if(existingLeads.isCustomerNotCreated()){processRepeatedLeadsWithNoCustomer(existingLeads, icbuLeadsE);}//3. 線索已經存在,且創建過客戶,嘗試撿回私海else{processRepeatedLeadsAndCustomer(existingLeads, icbuLeadsE);}}/*** 處理線索已存在,客戶未創建* @param existingLeads 系統中已存在的Leads* @param comingLeads 新來的Leads*/public abstract void processRepeatedLeadsWithNoCustomer(IcbuLeadsE existingLeads, IcbuLeadsE comingLeads);

責任鏈

在我們的營銷系統中,有一個EDM(Email Direct Marketing)的功能,在發送郵件之前,我們要根據規則過濾掉一些客戶,比如沒有郵箱地址,沒有訂閱關系,3天內重復發送等等,而且這個規則隨著業務的變化,很可能會增加或減少。

這里用if-else當然也能解決問題,但很明顯不滿足OCP,如果用一個Pipeline的模式,其擴展性就會好很多,類似于Servlet API中的FilterChain,增加、刪除Filter都很靈活。

FilterChain filterChain = FilterChainFactory.buildFilterChain(NoEmailAddressFilter.class, EmailUnsubscribeFilter.class, EmailThreeDayNotRepeatFilter.class);//具體的Filter public class NoEmailAddressFilter implements Filter {@Overridepublic void doFilter(Object context, FilterInvoker nextFilter) {Map<String, Object> contextMap = (Map<String, Object>)context;String email = ConvertUtils.convertParamType(contextMap.get("email"), String.class);if(StringUtils.isBlank(email)){contextMap.put("success", false);return;}nextFilter.invoke(context);} }

SOFA框架

這次代碼重構中發現,對于框架概念的誤用,也是造成代碼混亂的原因之一,在SOFA框架中我們明確定義了module,package和class的scope和功能,但是在實施過程中,還是出現了在層次歸屬,命名和使用上的一些混亂,特別是Convertor,Assembler和擴展點。

Convertor

在SOFA中有三類主要的對象:

  • ClientObject: 也就是二方庫中的數據對象,主要承擔DTO的職責。
  • Entity/ValueObject: 也就是既有屬性又有行為的領域實體。
  • DataObeject:是用來獲取數據用的,主要是DAO使用。
  • 而Convertor在上面三個對象之間的轉換起到了至關重要的作用,然而Convertor里面的邏輯應該是簡單的,大部分都是setter/getter, 如果屬性重復度很高的話,也可以使用BeanUtils.copyProperties讓代碼變得更簡潔。

    但事實情況是,現在系統中很多的Convertor邏輯并沒有在Convertor里面。

    比如將詢盤數據convert成LeadsE,處理類是LeadsBuildStrategy,這個命名是不合適的。

    所以我將這段邏輯重構到ICBULeadsConvertor也等于是在清晰的告訴看代碼的人,這里是做了一個Client數據到LeadsEntity的轉換,僅此而已。

    Assembler

    Assembler在SOFA框架中的定義是組裝參數使用的,所以看到Assembler我就很清楚這個類是用來組裝參數的。

    例如,組裝OpenSearch的查詢條件,原來用的是擴展點CustomerRepeatRuleExtPt
    但是RuleExt這個概念,只有在不同業務場景下的業務擴展才需要用到,所以這種命名和使用是不恰當的,組裝參數直接用RepeatCheckConditionAssembler就好了。

    重構前:

    List<RepeatConditionDO> repeatConditions = ruleExecutor.execute(CustomerRepeatRuleExtPt.class, repeatExt -> repeatExt.getRepeatCondition(queryField));

    重構后:

    RepeatConditionDO repeatConditionDO = repeatCheckConditionAssembler.assembleCustomerRepeatCheckCondition(repeatCheckParam);

    擴展點

    擴展點是我SOFA框架中針對不同業務或租戶的一種擴展機制,現在代碼中有一些使用,但是因為我們目前只有ICBU的場景,所以基本上所有的擴展點只有一個擴展實現。

    如果這樣的話,我建議先不要提前抽出來擴展點,等有多業務場景的時候,再去重構。

    例如OppotunityDistributeRuleExtPt、OpportunityOrgChangeRuleExtPt、LeadsCreateCustomerRuleExtPt、CustomerNoteAppendRuleExtPt等等,這樣的case有很多。

    如果是業務內的擴展,使用Strategy Pattern就好了。

    Tips:簡單一點,敏捷一點,不要太多的“提前設計和規劃”,等變化來了再重構,Keep it Simple!

    領域建模

    領域建模的核心,是在深入理解業務的基礎上,進行合理的領域抽象,將重要的業務知識、領域概念用通用語言(Ubiquitous Langua)的方式,統一的在PRD,模型和代碼中進行顯性化的表達,從而提升代碼的可讀性和可維護性。

    所以能否合理的抽象出Value Object,Domain Entity,領域行為和領域服務,將成為DDD運用是否得當的關鍵。

    Tips:錯誤的抽象,隨心而欲的亂抽象,還不如不要抽象。

    領域對象

    領域對象主要包括ValueObject和Entity,二者都是在表達一個重要的領域概念,其區別在于ValueObject是immutable的,而Entity不是,它需要有唯一的id做標識。

    在進行領域對象抽取的時候,要注意以下兩點:

    1、不要把重要的領域概念遺棄在Domain外面:

    比如這次重構的主要業務——Leads引入,原來的Leads Entity形同虛設,業務邏輯都散落在外面,像Leads判重,Leads生成客戶等業務知識都沒有在Entity上體現出來,所以這種建模就是不合理的,也違背了DDD的初衷。

    2、不要把非領域概念的對象強加到Domain中:

    比如RepeatQueryFieldV只是一個Search的查詢參數,不應該是一個ValueObject,更合適的做法是定義成一個RepeatCheckParam放到Infrastructure層去,這樣理解起來更方便。

    分析領域

    客戶通的Leads來源很大部分來自于網站的詢盤(inquiry)聯系人,所以對于新的詢盤,我們當成新的Leads來處理。但是網站那邊的詢盤聯系人修改呢,這個很明顯是Contact域的事情,如果你和Leads揉在一起,會導致混亂。

    public static LeadsEntryEvent ofAction(String action, LeadsE leads) {LeadsEntryEvent event = null;LeadsEntryAction entryAction = LeadsEntryAction.of(action);if (null != entryAction) {switch (entryAction) {case ADD:event = new LeadsAddEvent(leads);break;case UPDATE://TODO: This is not Leads, 是聯系人,不要放在Leads里處理event = new LeadsUpdateEvent(leads);break;case DELETE://TODO: This is not Leads, 是聯系人,不要放在Leads里處理event = new LeadsDeleteEvent(leads);break;case ASSIGN://TODO: This is not Leads, 不要放在Leads里處理event = new LeadsAssignEvent(leads);break;case SYNC://TODO: to deleteevent = new LeadsSyncEvent(leads);break;case IM_ADD:event = new LeadsImChannelAddEvent(leads);break;case MC_ADD:event = new LeadsMcChannelAddEvent(leads);break;default:

    很多的行為,放在多個Domain上都可以做,這個時候就要仔細分析,多動動頭腦,想想哪個Domain是最合適的Domain,而不是戴著耳機,瞧著代碼,實現業務功能,完事走人,留下滿地的衛生紙!

    領域行為 vs. 領域服務

    區分領域行為和領域服務,可以參考下面的劃分:

    • 領域行為:是我這個Entity范疇之內的,添加到Entity身上,千萬不要不假思索的就抽成一個DomainService,這樣Entity很容易被架空。
    • 領域服務:不是一個Entity能handle了的行為,可以考慮抽到更上層的DomainService中去。

    因此,對于增加新Leads這個動作來說,直覺上應該是屬于LeadsEntity的,但是仔細分析一下,我們會發現在增加新Leads的同時,還要創建客戶、聯系人。如果有分配需要的話,還要將機會分配到業務員的私海。

    這么多的邏輯,這么多Entity的交互,如果再放到LeadsEntity就不合適了,所以重構的時候,我抽象出LeadsProcessService這個DomainService,這樣在表達上會更加清晰,同事擴展起來也更方便。

    @Overridepublic void processLeads(IcbuLeadsE icbuLeadsE) {IcbuLeadsE existingLeads = icbuLeadsE.checkRepeat();//1.新線索if(existingLeads == null){processBrandNewLeads(icbuLeadsE);}// 2. 線索已經存在,但是沒有創建過客戶else if(existingLeads.isCustomerNotCreated()){processRepeatedLeadsWithNoCustomer(existingLeads, icbuLeadsE);}//3. 線索已經存在,且創建過客戶,嘗試撿回私海else{processRepeatedLeadsAndCustomer(existingLeads, icbuLeadsE);}}

    統一語言

    PRD中的語言,我們平時溝通的語言,模型中的語言和我們的代碼中的語言要保持一致,如果不一致,或者缺失都會極大的增加我們的代碼理解成本,使得代碼維護變得困難。

    比如客戶判重,聯系人判重都是非常重要的領域概念,但是在我們領域模型上并沒有被體現,應該將其凸顯出來:

    /*** 客戶判重** @return 如果有重復的客戶,返回其customerId, 否則返回null*/public String checkRepeat() {RepeatCheckParam repeatCheckParam = RepeatCheckParam.ofCompanyName(companyName);...}/*** 聯系人判重,主要通過email來判重* @return 如果有重復的聯系人,返回其contactId, 否則返回null*/public String checkRepeat(){if(email == null || email.size() == 0){return null;}//只檢查第一個email,因為icbu業務線中一個聯系人只有一個emailRepeatCheckParam repeatCheckParam = RepeatCheckParam.ofContactEmail(email.iterator().next());...}

    在系統中目前還有checkConflict表示判重,這個需要團隊達成一致,如果大家都同意用checkRepeat表示判重,那以后就統一用checkRepeat。

    這地方不要糾結翻譯的準確性什么的,就像公海這個概念我們用的是PublicSea,這是一個很明顯的chinglish,但是大家讀起來順口,也容易理解,我覺得對于中國程序員來說就比SharedTerritory要好。

    業務語義顯性化

    還是那句話,代碼是寫給人讀的,機器能執行的代碼誰都可以寫,寫出人能讀懂的代碼才是NB。

    下面以兩個重構案例來說明什么是業務語義顯性化,大家自己體會一下差別:

    1、判斷Leads是否創建過客戶,其邏輯是看Leads是否有CustomerId

    重構前:

    if (StringUtil.isBlank(existLeads.getCustomerId())

    重構后:

    if(existingLeads.isCustomerNotCreated())

    Tips:雖然只是一行代碼,但是卻是編程認知的差別。

    2、判斷Customer是否在自己的私海

    重構前:

    public boolean checkPrivate(CustomerE customer) {IcbuCustomerE icbuCustomer = (IcbuCustomerE)customer;return !PvgContext.getCrmUserId().equals(NIL_VALUE)&& icbuCustomer.getCustomerGroup() != CustomerGroup.AliCrmCustomerGroup.CANCEL_GROUP;}

    重構后:

    /*** 判斷是否可以被撿入私海* @return*/public boolean isAvailableForPrivateSea(){//如果不是業務員操作,不能撿入私海if(StringUtil.isBlank(PvgContext.getCrmUserId())){return false;}//如果是"刪除分組"的客戶,不撿入私海,放到公海if(this.getCustomerGroup() == CustomerGroup.AliCrmCustomerGroup.CANCEL_GROUP){return false;}return true;}

    性能優化

    B類的服務壓力相對沒有那么大,性能往往不是瓶頸,但是并不意味著可以隨便揮霍。

    比如,Leads更新操作中,發現一個更新,只需要更新一個字段,但是使用的是全字段更新(有幾十個字段),明顯的浪費資源,所以新增了一個單字段更新的SQL。

    //重構前用這個<update id="update" parameterType="CrmLeadsDO">UPDATE crm_leads SET GMT_MODIFIED = now()<if test="modifier != null">, modifier = #{modifier}</if><if test="isDeleted != null">, is_deleted = #{isDeleted}</if><if test="customerId != null">, customer_id = #{customerId}</if><if test="referenceUserId != null">, reference_user_id = #{referenceUserId}</if>... 此處省略N多字段<if test="bizCode != null">, biz_code = #{bizCode}</if>where id = #{id} and tenant_id = #{tenantId} and IS_DELETED = 'n'</update>//重構后用這個<update id="updateCustomerId" parameterType="CrmLeadsDO">UPDATE crm_leads SET GMT_MODIFIED = now()<if test="customerId != null">, customer_id = #{customerId}</if>where id = #{id} and tenant_id = #{tenantId} and IS_DELETED = 'n'</update>

    Tips:性能優化要扣細節,不要一提到性能,就上ThreadPool。

    測試代碼

    看了大家的測試代碼,大部分都寫的很亂,沒有結構化。

    實際上,測試代碼很容易結構化的,就是三個步驟:

  • Prepare:準備數據,包括準備請求參數和數據清理
  • Execute:執行要測試的代碼
  • Check:校驗執行結果
  • 下面是我寫的創建Leads,但是客戶沒有創建過的測試用例:

    @Testpublic void testLeadsExistWithNoCustomer(){//1. PrepareIcbuLeadsAddCmd cmd = getIcbuIMLeadsAddCmd();String tenantId = "cn_center_10002404";LeadsE leadsE = leadsRepository.getLeads(tenantId, cmd.getContactId());if(leadsE != null) {leadsE.setCustomerId(null);leadsRepository.updateCustomerId(leadsE);}//2. ExecutecommandBus.send(cmd);//3. CheckleadsE = leadsRepository.getLeads(tenantId, cmd.getContactId());Assert.assertEquals(leadsE.getCustomerId(), "179001");}

    測試代碼允許有重復,因為這樣可以做到更好的隔離,不至于改了一個數據,影響到其他的測試用例。

    Tips:PandoraBoot啟動很慢,如果不是全mock的話,建議使用我寫的TestContainer,這樣可以提效很多。

    總結

    以上是生活随笔為你收集整理的记一次代码重构的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲欧洲国产视频 | 国产不卡精品视频 | 四虎成人精品永久免费av九九 | 日韩av影视 | 黄色a级片在线观看 | 99在线播放| 久久成人精品视频 | 欧美a级片免费看 | 国产精品一区在线观看 | 91精品国自产在线观看欧美 | 黄色软件在线观看 | 国精产品999国精产 久久久久 | 天天干天天拍 | 国产成人精品一区二区三区在线观看 | 日本高清久久久 | 天天在线免费视频 | 中文字幕久久精品一区 | 国产在线精 | 亚洲精品高清视频 | 人人澡超碰碰97碰碰碰软件 | 日韩精品一区二区三区在线视频 | 正在播放 久久 | 国产高清在线观看 | 午夜123 | 久久,天天综合 | 97涩涩视频 | 日韩最新av在线 | 在线观看亚洲精品视频 | 久草在线观看 | 亚洲精品免费在线视频 | 久久久久久久久影视 | av官网在线| 久久精品视频在线看 | 国产成人一级 | 中文字幕人成乱码在线观看 | 精品久久久久久国产91 | 国产免费视频在线 | 中文在线www| 三级av在线免费观看 | 97在线观看免费高清完整版在线观看 | 狠狠狠狠狠狠狠狠 | 欧美日韩一级久久久久久免费看 | 日韩超碰在线 | 色91在线 | 久草视频播放 | 人人草天天草 | 亚洲精品高清在线观看 | 久草在线视频在线观看 | 日韩视频中文 | 精品一区91 | 久久久久久免费毛片精品 | 午夜av激情 | 久久亚洲影视 | 黄色aa久久| 日韩精品不卡在线 | 99热在线观看 | 中文字幕一区二区三区视频 | 久久99偷拍视频 | 日本最新高清不卡中文字幕 | 免费在线观看视频一区 | 精品久久久久久久久久国产 | 色五月色开心色婷婷色丁香 | 中文字幕中文字幕在线中文字幕三区 | 中文字幕91 | 国产成人久久久77777 | 黄色午夜 | 黄色国产区 | 国产亚洲精品成人av久久影院 | 欧美日韩一级在线 | 色国产精品一区在线观看 | 亚洲日本黄色 | 一区二区中文字幕在线播放 | 色久综合 | 黄色特级一级片 | 全久久久久久久久久久电影 | 在线播放日韩av | 亚洲黄色免费在线 | 中文字幕在线观看免费观看 | 91亚洲视频在线观看 | 精品美女国产在线 | 色偷偷88888欧美精品久久 | 国产精品久久久久久久久久免费看 | 久久久久亚洲精品国产 | 在线精品视频在线观看高清 | 激情欧美国产 | 97成人免费视频 | 91亚洲狠狠婷婷综合久久久 | 天天色播 | 欧美性大战 | 狠狠操影视 | 中文字幕av电影下载 | 久久久久国产免费免费 | 性色av香蕉一区二区 | 91香蕉视频污在线 | 久久精品99久久久久久2456 | 美女搞黄国产视频网站 | av久久久 | av中文字幕av | 国产免费专区 | 精品一区二区久久久久久久网站 | 91网页版在线观看 | 日本久久久久久久久 | 天天射天天舔天天干 | 国产精品专区在线观看 | 在线 国产一区 | 91免费高清视频 | 国产麻豆精品一区二区 | 亚州性色 | 天天干天天天 | 国产成人a亚洲精品v | 97天堂 | 色五月色开心色婷婷色丁香 | 黄色小说视频网站 | 国内精品久久久久影院一蜜桃 | 欧美性超爽 | 中文字幕欧美激情 | 色综合天天狠天天透天天伊人 | 欧美日韩亚洲在线 | 成人av资源 | 久久亚洲免费视频 | 欧美 亚洲 另类 激情 另类 | 国产护士在线 | 成人全视频免费观看在线看 | 国产精品久久久久久久99 | 中文字幕大全 | 欧美一级性生活视频 | 国产一级一级国产 | 国产精品一区一区三区 | 亚洲专区 国产精品 | 超碰资源在线 | 国产午夜精品一区二区三区欧美 | 国产对白av | 日韩视频一区二区 | 四虎永久免费 | 久草在线手机视频 | 成人黄色电影免费观看 | 久久99久久99久久 | 97人人人人 | 欧美伦理电影一区二区 | 久久精品2 | 一本一道久久a久久精品 | 中文字幕在线观看你懂的 | 中文字幕首页 | 国产精品久久久久毛片大屁完整版 | 99久久精品免费看国产麻豆 | 精品自拍网 | 欧美 日韩 久久 | 欧美视频国产视频 | 欧美国产三区 | 久热超碰 | 天天综合五月天 | 99中文字幕在线观看 | 亚洲欧洲精品在线 | 国产精品视频免费在线观看 | 日本性xxxxx 亚洲精品午夜久久久 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久久香蕉视频 | 精品免费国产一区二区三区四区 | 在线免费av网站 | 婷婷综合视频 | 成人在线免费观看视视频 | 久久96国产精品久久99漫画 | 日本aa在线| 国产a免费 | 在线观看一级视频 | 欧美午夜精品久久久久 | 成年人电影免费看 | 亚洲免费av一区二区 | 久久久精品网 | 欧美日韩国产色综合一二三四 | 中文av影院 | 胖bbbb搡bbbb擦bbbb | 日韩理论电影网 | 91插插插网站 | 日韩欧美一区二区三区视频 | 中文字幕色网站 | 六月婷婷网 | 一区二区三区四区在线免费观看 | 国产色女| 成人一级 | 在线播放亚洲 | 青青草国产成人99久久 | 九九色在线观看 | 久久99精品国产一区二区三区 | 九九热只有这里有精品 | av一级片在线观看 | 九九日九九操 | 午夜美女福利直播 | 亚洲精品乱码久久久久久蜜桃欧美 | 亚洲激情p | 黄色软件视频网站 | 97精品国产97久久久久久久久久久久 | 97精品国产97久久久久久春色 | 精品久久久久久久久中文字幕 | 在线视频a | 日韩免费一区二区 | 久久精品欧美日韩精品 | 国产小视频免费在线网址 | 欧美精品乱码久久久久久 | 久久综合久久88 | 91在线日韩 | 91免费观看国产 | 日韩欧美在线高清 | 久久久久久久久国产 | 亚洲黄色一级电影 | 中文av在线免费观看 | 久久精品爱爱视频 | 五月天综合网站 | 欧美精品一级视频 | 免费av网址在线观看 | 蜜臀av网站| 97视频免费观看 | 日韩二区在线播放 | 日韩黄色在线 | 国产精品综合在线观看 | 国产又粗又猛又爽又黄的视频先 | 久久久久久久亚洲精品 | 夜夜操夜夜干 | 狠狠操夜夜 | 在线播放日韩 | 黄色日批网站 | 国产精品美女久久 | 天堂av在线免费观看 | 午夜婷婷在线观看 | 欧美黄在线 | 91在线产啪 | 国产小视频在线免费观看 | 欧美久久久久久久久久 | 国产精品麻豆99久久久久久 | 91桃花视频 | 免费黄色在线网址 | 99久久一区| 天天干天天操天天干 | 日韩动态视频 | 国产无遮挡又黄又爽馒头漫画 | 成人91在线 | 二区三区av | 天天综合天天综合 | 成人国产精品免费观看 | 成人小视频在线观看免费 | 国产精品视频免费在线观看 | 国产高清成人 | 久久精品久久99 | 中文字幕av一区二区三区四区 | 国产日产精品一区二区三区四区的观看方式 | 麻豆91在线看 | 奇米网444| 成人网页在线免费观看 | 97**国产露脸精品国产 | 久久观看免费视频 | 免费在线黄网 | 国产xxxxx在线观看 | 国产成人久久精品77777综合 | 91精品爽啪蜜夜国产在线播放 | 久久色在线观看 | 99精品国产亚洲 | 日韩在线电影观看 | 97超碰在线人人 | 免费看黄色91 | 操操操com| 久久久久亚洲精品中文字幕 | 91大神在线看 | 久久久国产一区二区三区四区小说 | 亚洲欧美经典 | 免费观看黄色av | 欧美日韩精品在线 | 久久激情小视频 | 成人国产一区二区 | 日韩二区三区在线 | 成人av影视 | 天天操天天色天天射 | 欧美精品久久久久久久久久久 | 国产资源在线免费观看 | 久热爱 | 亚洲丁香久久久 | 免费网站v | 亚洲人成综合 | 久久久久麻豆 | 精品国产一区二区三区久久久 | 国产一级电影网 | a黄色片在线观看 | 国产成人精品电影久久久 | 久久久精品国产免费观看同学 | 天天爱天天 | 日韩久久片| 婷婷亚洲综合五月天小说 | 在线v片免费观看视频 | 激情视频免费在线观看 | 91黄色视屏| 韩国视频一区二区三区 | 日韩av伦理片 | 在线国产不卡 | 国产精品综合久久久 | 日韩精品一区二区三区免费观看 | 中文字幕在线观看的网站 | www.久久久.com | 揉bbb玩bbb少妇bbb | 久久久精品久久 | 婷婷激情5月天 | 97超视频 | 久久国产手机看片 | 色婷婷电影 | 玖玖爱国产在线 | 久久男人免费视频 | 美女av免费 | 伊人av综合 | 国产视频高清 | 国产精品理论视频 | 国产亚洲永久域名 | 天天操天天艹 | 国产精品久久久久久久免费大片 | 免费在线色电影 | 色综合天天综合在线视频 | 日韩中文在线观看 | 亚洲 欧洲 国产 日本 综合 | 国产精品理论片在线播放 | 日韩在线视频国产 | 国产偷v国产偷∨精品视频 在线草 | www.亚洲激情.com | 久草网站在线观看 | 日日摸日日 | 免费福利在线观看 | 人人澡超碰碰 | 91麻豆精品国产91久久久使用方法 | 亚洲精品欧美精品 | 中文字幕123区 | 亚洲五月婷婷 | 一级片免费观看 | 久久国产精品免费 | 欧美成人91 | 国产高清专区 | 日韩一级黄色av | 日韩精品一区二区在线 | 91视频在线播放视频 | 日韩影视大全 | 久久99国产视频 | 99久久久久国产精品免费 | 在线免费观看一区二区三区 | 综合久久影院 | 手机看片国产日韩 | 国产精品麻豆果冻传媒在线播放 | 看片一区二区三区 | www视频在线免费观看 | 久久免费毛片 | 久草在线免费看视频 | 久久免费视频网站 | 亚洲精品国产精品国自产观看浪潮 | 三级黄色网址 | 天天爽夜夜爽人人爽一区二区 | 成人欧美一区二区三区在线观看 | 亚洲欧美国产精品久久久久 | 成人在线观看免费视频 | 日韩欧美电影 | 国产黄色大片 | 久久精品免视看 | 国产成人精品999在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲五月六月 | www.久久99 | 免费视频在线观看网站 | 欧美精品久久久久a | 97在线观看视频免费 | 999电影免费在线观看2020 | 国产一区二区高清不卡 | 色资源中文字幕 | 色婷婷视频在线观看 | 亚洲高清在线精品 | 91精品久久久久久粉嫩 | 激情片av | www.国产在线视频 | 国产午夜精品免费一区二区三区视频 | 久草视频精品 | 91精品国产乱码在线观看 | 久久久久久久久久久久久9999 | 国产高清av免费在线观看 | 国产精品久久久久久久久费观看 | 啪啪免费视频网站 | 天天草天天干天天 | 午夜av免费 | 成年人视频在线免费观看 | 在线免费国产 | 91视频在线免费 | 久久人人艹 | 99久久精品无码一区二区毛片 | 亚洲激情校园春色 | 久久黄色影院 | 密桃av在线 | 亚洲在线网址 | 奇米网8888| 激情综合亚洲精品 | 精品99在线视频 | 国产精品区免费视频 | 国产高清亚洲 | 国产一区二区三精品久久久无广告 | 伊人中文字幕在线 | 黄色三级在线观看 | 日本久久精品视频 | 五月婷婷,六月丁香 | 特级西西www44高清大胆图片 | 国产一级视频在线 | 91av中文字幕 | www成人精品 | 伊香蕉大综综综合久久啪 | 香蕉久久国产 | 国产精品四虎 | 国产精品永久免费在线 | 日本久热 | 免费a网 | 国产偷在线| 97视频人人澡人人爽 | 亚洲在线看 | 97电影在线 | 深夜福利视频一区二区 | 欧美天堂久久 | 日日爱视频| 91精品推荐 | 人人爽人人爽人人爽学生一级 | 国产福利中文字幕 | 99久久综合国产精品二区 | 九九精品视频在线观看 | 91香蕉视频色版 | 精品夜夜嗨av一区二区三区 | 欧美三级高清 | 91久久精品一区二区三区 | 久久a免费视频 | 欧美亚洲三级 | 成人av一区二区在线观看 | 免费看91的网站 | 人人爱在线视频 | 国产一区二区在线免费播放 | 日韩免费在线观看视频 | 国产xx视频 | 久久亚洲私人国产精品va | 欧美动漫一区二区三区 | 99高清视频有精品视频 | 国产视频综合在线 | 中文字幕在线观看视频网站 | 99久久久久久 | 久久国产乱 | 黄色一级大片在线免费看国产一 | 美女av电影| 在线观看日韩免费视频 | 国产日韩精品欧美 | 免费看特级毛片 | 免费人成在线观看 | 亚洲2019精品 | 精品国产99| 国产精品mm | 欧美aaa一级| 九九在线免费视频 | 日韩电影一区二区在线 | 丝袜美腿亚洲综合 | 久草网在线| av久久在线 | 色鬼综合网 | 91入口在线观看 | 精品特级毛片 | 91精品国产高清自在线观看 | 九九九九九精品 | 成人午夜剧场在线观看 | 亚洲成av人影院 | 午夜在线观看 | 亚洲精品国精品久久99热 | 日韩美视频 | 久久久久免费精品视频 | 97久久久免费福利网址 | 色综合久久久网 | 久久精品79国产精品 | 美女久久一区 | 成人免费一级 | 亚洲精品在线观看的 | 亚洲精品久久在线 | 国产在线精品一区二区不卡了 | 少妇性bbb搡bbb爽爽爽欧美 | 免费观看一级一片 | www.色com| 奇米网777| 久久久久欠精品国产毛片国产毛生 | 狠狠色婷婷丁香六月 | 日韩精品中文字幕久久臀 | 特级aaa毛片 | 人人搞人人干 | 99在线视频精品 | 五月激情丁香婷婷 | 日本大片免费观看在线 | 亚洲国产欧美在线看片xxoo | 999成人精品 | 日韩毛片精品 | 97精品国产91久久久久久 | 91插插插网站 | 一区二区三区www | 成人a免费 | 在线视频日韩 | 天天操月月操 | 久久久精品网 | 天天骚夜夜操 | 天天夜夜狠狠操 | 成人av电影免费观看 | 狠狠干狠狠色 | 国产天天综合 | 91网免费看 | 成人精品久久久 | 天天人人 | 国产精品永久在线 | 亚洲国产网址 | 99久久精品电影 | 国产成人精品一区一区一区 | 天天操天天曰 | 超碰精品在线观看 | 日韩免费高清在线观看 | 成人av在线电影 | 中文字幕乱在线伦视频中文字幕乱码在线 | 操天天操 | 激情视频一区二区 | 黄毛片在线观看 | 中文字幕免费国产精品 | 国产成人精品av在线 | 狠狠干我| 久久伦理 | 午夜电影久久 | 免费国产亚洲视频 | 欧美a级在线播放 | 日韩精品视频在线免费观看 | 亚洲精品国偷自产在线91正片 | 国产精品久久久久久久久毛片 | 日韩在线中文字幕视频 | 丁香av| 免费在线观看日韩视频 | 国产精品综合在线 | 日本黄色大片儿 | 黄色大片国产 | 黄色av一区二区 | 在线观看成人 | 精品国产精品久久 | 91精品国产麻豆国产自产影视 | 激情综合站| 久久夜色精品国产欧美一区麻豆 | 亚洲精品成人av在线 | 天天草天天干天天射 | 97超级碰碰碰视频在线观看 | 国产91免费在线观看 | 成人av资源 | 天天色天天干天天色 | 五月婷婷网站 | 欧美日韩中文国产一区发布 | 在线有码中文字幕 | 国产二区电影 | 四虎在线观看视频 | 精品久久久久一区二区国产 | 免费视频色 | 韩日av在线| 亚洲一区久久 | 性色av免费看 | 韩日色视频 | 手机看片国产日韩 | 国产午夜三级 | 中文字幕有码在线播放 | 国产精品久久久999 国产91九色视频 | 伊人五月天 | 婷婷丁香色综合狠狠色 | 国产123区在线观看 国产精品麻豆91 | 人人爱天天操 | 91亚洲永久精品 | 最近中文字幕 | 97色se| av在线超碰| 日本久久综合视频 | 欧美日韩视频网站 | 成人免费观看电影 | 成年人在线看片 | 日韩r级电影在线观看 | 久久久91精品国产一区二区三区 | 免费看一级黄色大全 | 91在线区| av在线h| 不卡的av电影 | 天天做天天爱夜夜爽 | 在线不卡中文字幕播放 | 成人作爱视频 | 欧美日韩高清在线观看 | 亚洲婷婷综合色高清在线 | av网站在线免费观看 | 大胆欧美gogo免费视频一二区 | 国产视频二 | 亚洲精品美女视频 | 国内精品一区二区 | 久久久久久97三级 | 亚洲综合视频在线播放 | 日日干天天操 | 伊人久久国产精品 | 欧美日韩国产高清视频 | 国产91区 | 97在线影院 | 在线免费观看视频一区 | 最新精品视频在线 | 天天·日日日干 | 黄在线免费看 | 午夜精品一区二区三区免费 | 日韩v在线91成人自拍 | 亚洲激情视频在线观看 | 最新一区二区三区 | 特黄特色特刺激视频免费播放 | 国产精品免费视频网站 | 在线天堂8√ | 97精品超碰一区二区三区 | 伊人婷婷色| 深爱五月激情网 | 玖草在线观看 | 日韩不卡高清 | 亚洲精品高清在线 | 超碰97国产在线 | 又黄又爽又刺激视频 | 久久精品直播 | av电影不卡在线 | 一区二区三区精品在线 | 欧美怡红院 | 一区二区三区国产精品 | av电影一区二区 | 日本成人免费在线观看 | 97香蕉视频 | 久久久精品高清 | 国产精品18久久久久久vr | 中文字幕色网站 | 欧美成人tv| 91亚色在线观看 | 日韩在线免费电影 | 97伊人网 | 久久99中文字幕 | 人人狠狠综合久久亚洲 | 狠狠操天天操 | 久久国产欧美日韩精品 | 国产精品第一视频 | 中文久草 | 国产视频69| 一区二区视频在线看 | 国产精品美女毛片真酒店 | 国产永久免费观看 | 97香蕉久久国产在线观看 | 成人在线视频网 | 麻花天美星空视频 | 丁香激情综合 | 婷婷综合五月天 | 五月天堂网 | 日日操天天射 | av成人资源 | 日日摸日日添日日躁av | 久久精品99精品国产香蕉 | 91精品毛片 | 日韩亚洲精品电影 | 国产剧情在线一区 | 久久精品91久久久久久再现 | 日韩欧美在线高清 | www.狠狠操.com | 久久久国产精品亚洲一区 | 一区二区三区在线免费观看视频 | 精品日本视频 | 在线免费黄色av | 久久久精品国产一区二区三区 | 丁香在线观看完整电影视频 | 国产视频一区二区三区在线 | 夜夜躁狠狠躁日日躁 | 丁香婷婷在线 | 日韩高清精品免费观看 | 狠狠狠综合| 午夜精品麻豆 | 麻豆精品传媒视频 | 91自拍视频在线观看 | 国产一级二级三级视频 | 人人插人人做 | 亚洲另类视频在线观看 | 青青河边草手机免费 | 日韩视频免费播放 | av先锋影音少妇 | 亚洲伊人成综合网 | 午夜精品婷婷 | www一起操 | 在线精品观看 | 日韩在线观看a | 国产国语在线 | 日韩高清免费在线 | 亚洲精品日韩在线观看 | 日韩av手机在线看 | 日韩电影在线观看一区二区三区 | 日韩三级一区 | 婷婷国产视频 | 五月天综合激情 | 91精品麻豆 | 伊人婷婷综合 | 草久电影 | 日韩高清无线码2023 | 麻豆极品 | 成人四虎 | 亚洲精品中文字幕在线 | 国产精品美女久久久久久久久久久 | 久久久这里有精品 | 成人国产网站 | 国产一区二区影院 | 久久精品国产免费 | 日韩欧美在线一区二区 | 久久影院一区 | 激情婷婷久久 | 久草视频在线观 | 91少妇精拍在线播放 | 日韩欧美精品在线观看 | 高清国产在线一区 | a天堂中文在线 | 久久黄色网页 | 精品 一区 在线 | 在线观看的av网站 | 欧美少妇影院 | 日韩成人免费在线电影 | 国产精品a久久 | 97成人在线 | 狠狠综合久久 | 久久久亚洲麻豆日韩精品一区三区 | av黄色一级片 | 99精品成人 | 久久综合色天天久久综合图片 | 国产在线精品播放 | 99高清视频有精品视频 | 亚洲国产影院av久久久久 | 99re8这里有精品热视频免费 | 久久综合欧美精品亚洲一区 | 午夜久久视频 | 久久免费的视频 | 国产午夜精品久久 | 国产亚洲在线视频 | 午夜视频免费 | 免费在线黄色av | 国产精品免费一区二区三区在线观看 | 午夜视频在线网站 | 久久在线免费观看 | 精品一区二区在线观看 | 国产精品丝袜久久久久久久不卡 | 1024手机看片国产 | 在线观看视频国产 | 国产麻豆视频网站 | 涩涩网站在线播放 | 久久久久国产a免费观看rela | 久久婷婷一区二区三区 | 麻豆久久一区二区 | 免费日韩在线 | 首页av在线 | 欧美激情精品久久久久久免费 | 免费在线观看亚洲视频 | 国内精品久久久久久 | 中文字幕免费高清在线观看 | 一区二区免费不卡在线 | 亚洲精品麻豆视频 | 国产资源在线免费观看 | 色吊丝在线永久观看最新版本 | av中文天堂在线 | 日韩在线观看三区 | 97超碰人人干| 亚洲va欧美va人人爽 | 国产一区二区三区高清播放 | 国产精品手机在线播放 | 国产视频一二三 | 日韩在线观看视频在线 | 亚洲国产中文字幕在线观看 | 91精品国产乱码久久 | 中文字幕精品一区久久久久 | 成人a级大片 | 亚洲高清av在线 | 午夜精品三区 | 日日干日日色 | 日日操日日操 | 亚洲欧美激情精品一区二区 | av高清在线观看 | 久久艹艹 | 亚州精品在线视频 | 丁香5月婷婷 | 国产日韩在线一区 | 91人人爱 | 天天色综合1| 中文字幕在线播放一区二区 | 免费久草视频 | 久99久精品| 丁香六月婷婷激情 | 韩国av免费看 | 一区二区三区日韩精品 | 国产一区在线观看视频 | 日韩激情片在线观看 | 天天爽综合网 | 国产视频每日更新 | 美女视频久久 | 国产成人99av超碰超爽 | 欧美精品一区在线发布 | 五月婷婷视频在线 | 国色天香av | 午夜精品一区二区三区免费 | 亚洲国产中文字幕在线观看 | 99欧美| 欧美激情va永久在线播放 | 久久99久久99久久 | 国产精品网在线观看 | www.色婷婷.com | 九九在线精品视频 | 久久久久久高潮国产精品视 | 四虎在线永久免费观看 | 91麻豆精品国产91久久久久久久久 | 久草视频在线免费 | 日韩免费不卡av | 天天插狠狠干 | 国产精品久久久久久久久久久久午 | 国产午夜三级一区二区三 | 日韩a级黄色 | 欧美色道 | 狠狠色综合网站久久久久久久 | 97超碰资源 | 九九热中文字幕 | 一本一本久久a久久精品牛牛影视 | av.com在线| 在线看国产日韩 | 五月婷婷久久丁香 | 中文字幕免费高清在线观看 | 免费中文字幕 | 免费视频 三区 | 1区2区3区在线观看 三级动图 | 91精选在线观看 | 最新中文字幕在线观看视频 | 亚洲国产精品成人女人久久 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 中文字幕在线观看网站 | 黄色av一区 | 97av视频| a黄色影院| 精品国产欧美一区二区 | 色婷婷激情五月 | 69国产成人综合久久精品欧美 | 黄a网站| 午夜色场| 国产二区av | 美女在线黄 | 久久综合久久综合这里只有精品 | 免费久草视频 | 黄色aa久久| 精品国产1区 | 久久精品视频4 | 97国产在线 | 亚洲国产精品500在线观看 | 国模视频一区二区三区 | 91在线最新 | 特级毛片aaa| 久久免费视频精品 | 久久国产精品免费观看 | 九九综合在线 | 久久99精品久久久久久久久久久久 | 免费涩涩网站 | 国产91电影在线观看 | 天天操夜夜操国产精品 | 午夜三级在线 | www.五月天婷婷.com | 国产精品免费视频一区二区 | 777视频在线观看 | 久久观看免费视频 | 中文网丁香综合网 | www黄色大片| 精品一区电影 | 激情综合婷婷 | 亚洲国产精品va在线看 | 最新国产精品视频 | 久久九精品 | 亚洲精品视频在线观看网站 | 成人精品99 | 国产亚洲精品久久久久久无几年桃 | 香蕉视频在线看 | 看黄色91| 亚洲国产三级在线 | 成全在线视频免费观看 | 亚洲一区二区三区在线看 | 欧美激情xxxx性bbbb | 最新国产精品拍自在线播放 | 精品久久久久久久久中文字幕 | 欧美日韩国产在线观看 | 免费一级片在线观看 | 亚洲精品小视频在线观看 | 成人aⅴ视频 | 特级西西444www大精品视频免费看 | 九九视频精品免费 | 国产精品久久在线观看 | 成人黄色小说视频 | 人人模人人爽 | 狠狠色丁香婷婷综合久小说久 | 国产亚洲精品xxoo | a亚洲视频 | 久操视频在线免费看 | 91精品综合在线观看 | 久久亚洲私人国产精品va | 蜜臀久久99静品久久久久久 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 欧美韩日精品 | 久久精品免费看 | 国产综合91 | 人人网av | 99视频在线观看免费 | 丁香五香天综合情 | 亚洲精品字幕 | 亚洲精品久久久久久中文传媒 | 999超碰| 国产三级国产精品国产专区50 | 久久免费视频精品 | 一区二区精品在线视频 | 欧美日韩国产综合网 | 久久久免费精品国产一区二区 | 探花在线观看 | 国产成人中文字幕 | 久久国产亚洲精品 | 99 色| 精品在线视频一区二区三区 | 四虎成人在线 | 天堂成人在线 | 在线观看av网站 | 日韩精品久久久 | 爱爱av网站| 久久免费视频8 | 欧美性生活免费 | www色片| 看片网站黄色 | 成人在线一区二区 | 99热在线国产 | 97超碰人人澡 | 日韩高清一二三区 | 亚洲激情在线观看 | 欧美精品一区在线发布 | 国产玖玖精品视频 | 国产精品视频最多的网站 | 久久精品日韩 | 国产九九精品视频 | 日韩资源在线观看 | 麻豆免费视频网站 | 亚州精品国产 | 成人精品一区二区三区中文字幕 | 成年人免费在线观看 | 欧美精品久久久久久久久久丰满 | 热久久最新地址 | 国产 日韩 中文字幕 | 国产中文字幕视频 | 午夜私人影院久久久久 | 97视频人人免费看 | 在线看国产 | 久久综合久久综合久久 | 国产字幕在线看 | 四虎免费av| 国产品久精国精产拍 | 色婷婷丁香 | 天天插夜夜操 | 欧美一级片播放 | 深爱激情五月婷婷 | 久久午夜鲁丝片 | 欧美日韩不卡一区二区 | 99久久精品国产观看 | 久久免费国产视频 | 去干成人网 | 亚洲免费av在线 | 国产偷在线 | 在线观看91精品国产网站 | 日韩精品视频免费看 | 色播五月激情五月 | 五月婷香蕉久色在线看 | 97成人在线观看视频 | 国产欧美精品一区二区三区四区 | 日韩av成人免费看 | 97超碰免费在线观看 | 国产精品色 | 日本成人免费在线观看 | 天天爽人人爽夜夜爽 | 天天插综合 | 久久这里只有精品1 | 日日摸日日 | 国产精品大片在线观看 | 丁香花在线视频观看免费 | 久久国产精品精品国产色婷婷 | 网站免费黄色 | 五月婷婷六月丁香 | 日韩av中文在线 | 91成年视频 | 超碰在线色 | 国产成人精品一区二区三区在线观看 | 成人久久综合 | 久久久免费播放 | 久久久午夜精品福利内容 | 三上悠亚一区二区在线观看 | 国产精品毛片久久久 | 久久r精品| 精品国产美女 | 国产精品女同一区二区三区久久夜 | 丁香六月色 | 丁香六月婷婷开心婷婷网 | 91精品推荐| 日韩高清在线一区二区三区 | 免费看成人av | 免费在线观看国产精品 | 91成人在线观看高潮 | 亚洲 欧美 日韩 综合 | 亚洲国产成人高清精品 | 操操操日日日干干干 | 欧美 亚洲 另类 激情 另类 |