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

編寫更清晰代碼:去掉所有多余的類型

譯文 精選
開發 前端
最近,在 r/swift 子論壇上,我偶然發現了一篇介紹“整潔架構”項目示例的帖子。這引起了我的興趣,于是我決定在 GitHub 上下載并仔細研究。

最近,在 r/swift 子論壇上,我偶然發現了一篇介紹“整潔架構”項目示例的帖子。這引起了我的興趣,于是我決定在 GitHub 上下載并仔細研究。

帖子截圖帖子截圖

初看代碼頗為復雜,讓我感到迷惑。但在下載和深入研究后,我發現所有組件都整合在一起,項目實現了想要的功能。但我發現該項目的網絡模塊的復雜性較高。僅兩個簡單的網絡查詢操作竟涉及如此多的文件,讓人難以理解,讓我頗為驚訝。

因此,我決定對網絡層進行重構,使其更加模塊化,并對整體組合和用戶界面進行了小幅優化。為此,我創建了獨立的項目對原始項目代碼進行重構,你可以在文末找到原始項目和我重構后的項目鏈接。

網絡層——消除嵌套和多余類型

原項目的網絡層通過協議和類型結構實現了高度模塊化,每個協議和類型分別負責特定功能,大致結構如下:

NetworkManager -> RequestManager -> RequestProtocol -> DataParser -> DataSource -> Repository -> UseCase

上述每一個類型都承擔了網絡過程的一部分職責,例如 DataParser 負責數據解析,如果想改變數據的解析方式,可以通過替換新的 DataParser 來實現,這種組合性是一項優點。

但問題在于,由于這些類型相互嵌套,使人難以整體理解,且每個類型都存于單獨的文件中。許多通過 Swinject 解析器進行注入,這使得整個網絡層的工作流程變得難以追蹤。正如 r/swift 中的一名評論者所言,這為代碼增加了一層不必要的“中間層”。

更令人費解的是,盡管作者增加了許多協議和類型來提高代碼的靈活性,但其中存在很多硬編碼的默認值。例如,DataParser 被直接編碼在代碼中,而 RequestProtocol.request() 的創建僅通過協議本身的擴展方法來實現。這種在增加了類型和復雜性后未充分利用它們的優勢的做法,實在讓人覺得可惜。

為了消除冗余的嵌套以及不必要的類型和協議,我們可以引入一個全新的方法:modelFetcher。

static func modelFetcher<T, U: Codable>(
    createURLRequest: @escaping (T) throws -> URLRequest,
    store: NetworkStore = .urlSession
) -> (T) async -> Result<BaseResponseModel<PaginatedResponseModel<U>>, AppError> {
    let networkFetcher = self.networkFetcher(store: store)
    let mapper: (Data) throws -> BaseResponseModel<PaginatedResponseModel<U>> = jsonMapper()

    let fetcher = self.fetcher(
        createURLRequest: createURLRequest,
        fetch: { request -> (Data, URLResponse) in
            try await networkFetcher(request)
           }, mapper: { data -> BaseResponseModel<PaginatedResponseModel<U>> in
                       try mapper(data)
                      })

    return { params in
          await fetcher(params)
         }
}

此函數的設計旨在保持與原代碼相同的組合功能,但未采用協議(protocols)和類型(types),而是通過直接注入操作行為來實現。需要說明的是,如果這樣更方便,你還可以將其構造成一個帶閉包的結構體,而不僅限于閉包。

接下來,實際的請求獲取閉包創建過程被大大簡化,唯一會變化的是請求創建部分。

static func characterFetcher(
    store: NetworkStore = .urlSession
) -> (CharacterFetchData) async -> Result<BaseResponseModel<PaginatedResponseModel<CharacterModel>>, AppError> {
    let createURLRequest = { (data: CharacterFetchData) -> URLRequest in
                          var urlParams = ["offset": "\(data.offset)", "limit": "\(APIConstants.defaultLimit)"]
                          if let searchKey = data.searchKey {
                              urlParams["nameStartsWith"] = searchKey
                          }

                          return try createRequest(
                              requestType: .GET,
                              path: "/v1/public/characters",
                              urlParams: urlParams
                          )
                         }

    return self.modelFetcher(createURLRequest: createURLRequest)
}

優化后,我們無需深入到許多不同的文件中,也無需理解眾多的協議和類型,因為我們可以通過直接注入閉包來實現相同的行為。NetworkStore 負責實際將數據發送到網絡,我們將其傳遞到構造函數中是為了方便后續的測試模擬(如果有需要的話)。

下面的例子展示了如何通過使用行為替代類型,將原始項目中的協議和類型進行轉換:

protocol NetworkManager {
    func makeRequest(with requestData: RequestProtocol) async throws -> Data
}

class DefaultNetworkManager: NetworkManager {
    private let urlSession: URLSession

    init(urlSession: URLSession = URLSession.shared) {
        self.urlSession = urlSession
    }

    func makeRequest(with requestData: RequestProtocol) async throws -> Data {
        let (data, response) = try await urlSession.data(for: requestData.request())
        guard let httpResponse = response as? HTTPURLResponse,
        httpResponse.statusCode == 200 else { throw NetworkError.invalidServerResponse }
        return data
    }
}

這段代碼還可以繼續優化變得更簡潔:

static func networkFetcher(
    store: NetworkStore
) -> (URLRequest) async throws -> (Data, URLResponse) {
    { request in
     let (data, response) = try await store.fetchData(request)
     if let httpResponse = response as? HTTPURLResponse,
     httpResponse.statusCode != 200 {
         throw NetworkError.invalidServerResponse
     }

     return (data, response)
    }
}

可以看出,我們在移除類型和協議的情況下實現了相同的功能。

另一個案例是通過函數創建一個 JSON 映射器,并將其作為閉包返回,保留協議的靈活性,卻不依賴協議。例如:

static func jsonMapper<T: Decodable>() -> (Data) throws -> T {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    return { data in
            try decoder.decode(T.self, from: data)
           }
}

在我看來,與基于協議/類型的方法相比,這種組合方式讓網絡層的實現變得更為直觀和簡潔。

這并不意味著你不應使用協議,但在選擇使用協議和類型時,應明確了解其用途,并思考是否真的需要為每 2-3 行代碼創建一個完整的類型。

項目模塊劃分

總體上,應用程序的模塊劃分還算理想。然而,我覺得可以進一步完善項目,方法是對網絡模塊進行明確的劃分。讓我們思考一下:應用程序真的需要了解它將使用哪個 JSON 映射器作為網絡特性嗎?我們是否可以更改網絡特性的JSON映射器而不破壞整個結構?如果網絡模塊能夠自主處理這些內容,那就更好了,這樣我們可以專注于使用它的主要目的:獲取超級英雄數據。

我們應該限制網絡模塊接收的內容,僅限于有意識地改變的部分,如用于測試的輸入,而不過多暴露。此外,我們可以只公開實際使用的部分,例如fetcher功能,而不是整個NetworkStore模塊的所有底層特性,并將其設為public。

值得注意的是,網絡模塊不應涉及域的內容,最好將ArkanaKeys依賴從整個項目中獨立出來,單獨置于網絡模塊中。擁有一個完全隔離的網絡模塊,可以讓我們在制作任何關于漫威超級英雄的應用時,輕松地復用所有的網絡邏輯。

在提供的示例代碼中,我僅進行了“虛擬模塊化”操作,沒有為網絡模塊創建獨立的框架,也沒有將ArkanaKeys的依賴關系轉移到那里。相反,我創建了一個文件夾并加入了訪問控制,模擬了完全獨立框架的情形。這樣做是為了使演示項目簡潔,實際上,你只需創建一個框架并添加到項目中即可。

另一個更遠大的目標是將 UI 和演示邏輯進行分離。目前這兩者相當耦合,我覺得這并不是問題。我刪除了 Presentation 文件夾,并把它們和 UI 層放在一起,因為在這一點上,很難想象使用 HomeViewModel來做除了 HomeView以外的事情,但這是一個組織代碼的個人喜好問題。

我最終使用了一個簡單的 Container類來代替 Swinject,但這也是個人喜好的問題。無論如何,解析器/容器應該避免嘗試解析太多具體的網絡類型,比如 NetworkManager, DataSource, Repositories和UseCases。在這種情況下,讓我們注入 NetworkStore(我用來替換 NetworkManager的類型)并直接解析UseCase 的依賴。

UI 層的優化更新

以下是關于 UI 層的一些優化更新,通過減少縮進和刪除 AnyView類型來提高可讀性和性能。將 View從 body中提取出來以提高可讀性,在我看來,盡可能減少縮進到只有幾個級別是有幫助的。原始應用程序在 HomeView中達到了 13 個縮進級別!而且,它是應用程序的根視圖,所以從一開始就盡可能地使其可讀是一個好主意。通過將 homeView提取為一個計算屬性,我們可以很容易地將縮進減少到只有五個級別。
示例如下:

public var body: some View {
    NavigationStack {
        ZStack {
            BaseStateView(
                viewModel: viewModel,
                successView: homeView,
                emptyView: BaseStateDefaultEmptyView(),
                createErrorView: { errorMessage in
                                    BaseStateDefaultErrorView(errorMessage: errorMessage)
                                   },
                loadingView: BaseStateDefaultLoadingView()
            )
        }
    }
    .task {
        await viewModel.loadCharacters()
    }
}

我想最后提一下的是,這個應用使用了一個 BaseStateView,它接受四個不同的 AnyView來表示應用的不同狀態,比如成功、空、錯誤等。BaseStateView使用泛型來代替 AnyView會更合適,因為 AnyView對于 SwiftUI 來說并不總是性能很好。這樣會提高性能,但是一個缺點是,它讓我們必須傳入我們想要的具體的 View,比如成功/空/創建/加載,而不是讓它們在構造函數中自動為我們完成。
示例如下:

struct BaseStateView<S: View, EM: View, ER: View, L: View>: View {
    @ObservedObject var viewModel: ViewModel
    let successView: S
    let emptyView: EM?
    let createErrorView: (_ errorMessage: String?) -> ER?
    let loadingView: L?
    ...
}

為了提高可讀性,你可以使用如SuccessView、EmptyView等名稱。

在 SwiftUI 的上下文中,使用單一基礎控制器/視圖的方法可能不太符合習慣。與直接將所有這些狀態處理器添加到基礎視圖上相比,以 ViewModifiers的形式將它們組合起來并添加感覺更為自然。不過,每種方法都有其優劣之處。如果你想強調構造函數的使用,并且想通過減少 ZStacks 的使用來實現,那么這種方法也是可取的。

struct ErrorStateViewModifier<ErrorView: View>: ViewModifier {
    @ObservedObject var viewModel: ViewModel
    let errorView: (String) -> ErrorView

    func body(content: Content) -> some View {
        ZStack {
            content
            if case .error(let message) = viewModel.state {
                errorView(message)
            }
        }
    }
}

結論

衷心感謝 mohaned_y98 提供的啟發和出色的示例項目!本文基于清晰的架構原則,采用了與原始項目不同的風格進行探索。相較于我所重構的項目,原始項目有其獨特的優勢,你可根據項目需求選擇適合的設計方案。

在盡量保留初衷的同時,我對項目進行了重構,增強了其人體工程學和可讀性。鑒于用戶界面或展示層已經構建得非常穩固,我未在這些方面投入過多精力。如果從頭開始,我可能會選擇不同的編碼方式,但現有的代碼編寫得恰到好處,且運作正常。

原始項目和我重構后的項目鏈接放在下方,歡迎下載閱讀我重構后的項目。你認為我忽略了哪些方面?你會有哪些不同的實現方法?

原始項目: https://github.com/Mohanedy98/swifty-marvel我重構后的項目:https://github.com/terranisaur/Demo-SwiftyMarvelous

譯者介紹

劉汪洋,51CTO社區編輯,昵稱:明明如月,一個擁有 5 年開發經驗的某大廠高級 Java 工程師,擁有多個主流技術博客平臺博客專家稱號。

原文標題:Clean Code Review: Removing All the Extra Types,作者:Alex Thurston

責任編輯:華軒 來源: 51CTO
相關推薦

2020-12-08 05:45:16

JavaScript代碼開發

2023-07-30 17:10:32

TypeScript開發

2024-11-26 11:39:29

2020-08-06 16:34:48

Python開發工具

2022-08-28 19:03:18

JavaScript編程語言開發

2020-02-25 20:55:20

JavaScript開發 技巧

2020-10-04 13:15:37

代碼技術開發

2014-08-19 09:39:46

程序員

2022-05-10 10:28:21

JavaScript代碼

2023-12-18 10:01:40

Golang代碼開發

2023-12-19 22:40:23

Golang編程函數

2022-01-13 14:06:37

Python 開發編程語言

2023-09-19 23:30:25

單元測試代碼

2025-02-03 10:04:47

擴散模型數據分布

2019-10-22 13:34:06

SQL數據庫語句解讀

2016-10-19 15:42:08

聯想

2019-11-08 09:20:57

代碼開發工具

2020-10-22 09:13:14

NVIDIA

2023-06-12 15:01:07

縮放神器Web工具

2012-01-12 14:51:15

傲游網絡
點贊
收藏

51CTO技術棧公眾號

欧美凹凸一区二区三区视频| 欧美黑人又粗大| 日韩欧美黄色大片| 快射av在线播放一区| av中文字幕播放| 91丨精品丨国产| 亚洲国产视频直播| 日韩高清dvd| xxxx国产精品| 日韩av电影免费观看高清完整版| 色噜噜狠狠狠综合曰曰曰| 激情av中文字幕| 蜜桃视频成人m3u8| 亚洲香蕉伊在人在线观| 日韩欧美视频第二区| 精品国产亚洲AV| 日日夜夜免费精品| 欧美激情一区二区三级高清视频| 国产精品国产三级国产专业不| 国产亚洲观看| 在线观看一区不卡| 国产 日韩 欧美在线| aⅴ在线视频男人的天堂| 国产成人精品亚洲日本在线桃色 | 国产亚洲精品久久久久久豆腐| 狂野欧美xxxx韩国少妇| 欧美性一二三区| 欧美变态另类刺激| 午夜伦理大片视频在线观看| 国产三级一区二区三区| 久久av免费一区| 国产福利第一页| 久久国产乱子精品免费女| 97视频在线观看播放| 激情综合五月网| 水蜜桃精品av一区二区| 亚洲午夜av久久乱码| 成人做爰www看视频软件| 电影一区中文字幕| 欧洲精品一区二区| 欧美成人免费高清视频| 松下纱荣子在线观看| 亚洲自拍偷拍图区| 日韩一二区视频| 黄色av免费在线| 亚洲欧洲精品一区二区三区不卡 | 国产精品99一区| 国产无码精品一区二区| 艳女tv在线观看国产一区| 在线观看日韩视频| 国产一区二区三区精品在线| 欧美人妖在线| 亚洲美女av网站| 久久久久久久久久久国产精品| 好吊妞视频这里有精品| 欧美videos中文字幕| 天天久久综合网| 精品久久国产一区| 日韩手机在线导航| 99久久综合网| 东京久久高清| 亚洲国产日韩欧美在线动漫| 久久久久久久无码| 天天躁日日躁狠狠躁欧美| 亚洲国产欧美一区二区丝袜黑人| 五十路六十路七十路熟婆| 亚洲图片久久| 亚洲午夜av电影| 四虎影视一区二区| 你懂的视频一区二区| 欧美大片免费看| 国产稀缺真实呦乱在线| 亚洲精品人人| 日韩av理论片| 91片黄在线观看喷潮| 韩国一区二区视频| 91蜜桃网站免费观看| 亚洲精品喷潮一区二区三区| 91在线你懂得| 手机成人在线| 黄页网站大全在线免费观看| 午夜欧美2019年伦理| 国产女女做受ⅹxx高潮| 成人久久网站| 日韩欧美国产综合一区| 色综合久久五月| 国产精品片aa在线观看| 视频在线观看99| 九九精品在线观看视频| 在线亚洲免费| 成人激情免费在线| 天天色综合久久| 欧美国产欧美亚州国产日韩mv天天看完整 | 久久夜色精品亚洲噜噜国产mv| 美国黄色小视频| 在线亚洲精品| 91亚洲va在线va天堂va国| 国产小视频免费观看| 国产日韩精品久久久| 亚洲高潮无码久久| 中文字幕影音在线| 欧美一区二区视频网站| 日本黄色录像片| 99久久夜色精品国产亚洲狼| 69av成年福利视频| 国产精品久久婷婷| 久久综合九色综合欧美98| 亚洲精品一品区二品区三品区| 国产丝袜在线播放| 欧美精品一级二级三级| 无码熟妇人妻av| 欧美日本一区二区高清播放视频| 99精品国产热久久91蜜凸| 国产国语刺激对白av不卡| 国产视频手机在线| 国产情人综合久久777777| 日韩成人三级视频| 亚洲伊人精品酒店| 亚洲最新av在线| 国产中文字幕免费| 国产麻豆精品在线观看| 日韩欧美视频第二区| 高潮在线视频| 欧美一二三四区在线| аⅴ天堂中文在线网| 国产精品久久久久9999高清| 91传媒在线免费观看| 一级日本在线| 91久久国产最好的精华液| 亚洲一区二区在线免费| 黄色av日韩| 99久热re在线精品视频| 黄色免费网站在线| 欧美猛男gaygay网站| 天天躁夜夜躁狠狠是什么心态| 先锋亚洲精品| 国产亚洲欧美另类一区二区三区| 在线三级中文| 欧美一区二区三区人| 日本激情视频一区二区三区| 日本不卡123| 日日夜夜精品网站| 欧美性理论片在线观看片免费| 日韩电影在线观看中文字幕| 日本熟妇一区二区| 成人午夜在线免费| 久久这里只有精品8| 亚洲国产欧美国产第一区| 理论片在线不卡免费观看| 亚洲一区在线观| 中文字幕亚洲成人| 九九九九九伊人| 99精品视频精品精品视频| 国产乱肥老妇国产一区二| 91美女视频在线| 欧美日韩高清一区二区| 日韩亚洲欧美中文字幕| 激情久久五月天| 五月天av影院| 2023国产精华国产精品| 久久久久免费精品国产| 天堂中文在线资| 色狠狠色狠狠综合| 超碰人人干人人| 狠狠色狠狠色综合系列| 一二三四中文字幕| 都市激情亚洲欧美| 26uuu亚洲国产精品| 久久精品蜜桃| 欧美老年两性高潮| 久久久久97国产| 99精品热视频| 激情五月俺来也| 中文字幕一区二区av| 国产伦精品一区| 成人福利视频| 久久精品视频一| 天天摸夜夜添狠狠添婷婷| 在线亚洲高清视频| 极品魔鬼身材女神啪啪精品| 成人久久视频在线观看| 老熟妇仑乱视频一区二区| 色琪琪久久se色| 99热在线国产| 久久电影tv| 久久久成人精品视频| 欧性猛交ⅹxxx乱大交| 日本精品视频一区二区| 一起操在线播放| 91老师片黄在线观看| 久久黄色片网站| 亚洲大片在线| 一道精品一区二区三区| 岛国成人av| 国产精品永久免费| 第一av在线| 中国人与牲禽动交精品| 亚洲v欧美v另类v综合v日韩v| 美女免费久久| 日韩av在线电影网| 国产情侣激情自拍| 欧美日韩在线视频首页| 色老板免费视频| 久久久久久电影| 永久av免费在线观看| 久久久青草婷婷精品综合日韩| 国产精品88久久久久久妇女| 九九视频精品全部免费播放| 91九色露脸| 成人日韩在线观看| 国模极品一区二区三区| 男人影院在线观看| 亚洲欧美日韩天堂| 成人免费视频国产| 欧美精品aⅴ在线视频| 草莓视频18免费观看| 亚洲综合色婷婷| 亚洲综合图片一区| 欧美国产精品一区二区三区| 久久福利小视频| 国产精品1区2区3区在线观看| 能在线观看的av网站| 亚洲欧洲一区| www国产免费| 先锋资源久久| 亚洲午夜精品久久久中文影院av | 松下纱荣子在线观看| 欧美激情视频一区二区三区不卡 | 久久久久久伊人| av黄色在线| 久久综合久久八八| 欧美人xxx| 中文字幕日韩欧美在线视频| 可以免费看污视频的网站在线| 精品国内二区三区| 亚洲成人一级片| 日韩一区二区不卡| 国产av一区二区三区| 在线视频中文字幕一区二区| 日韩综合在线观看| 色狠狠av一区二区三区| 久久久久久少妇| 日韩欧美亚洲成人| 中文字幕一区在线播放| 亚洲国产美女搞黄色| 免费人成年激情视频在线观看| 成人免费在线视频| 亚洲一级生活片| 亚洲乱码中文字幕| 妺妺窝人体色www婷婷| 亚洲一区二区在线免费看| 久久免费视频6| 亚洲一区二区精品久久av| 99国精产品一二二线| 爆操欧美美女| 欧美美女18p| а√天堂中文资源在线bt| 久久久亚洲网站| 美女91在线看| 欧美专区国产专区| 91大神在线观看线路一区| 国产欧美日韩91| 欧美黄视频在线观看| 国产精品加勒比| 亚洲精品3区| 亚洲精品在线视频观看| 婷婷成人基地| 成人免费看片'免费看| 亚洲久久视频| 粉嫩虎白女毛片人体| 久久精品国产亚洲高清剧情介绍| а 天堂 在线| av毛片久久久久**hd| 欧美图片第一页| 亚洲欧洲成人精品av97| 久久免费公开视频| 色哟哟欧美精品| 国产伦精品一区二区三区四区| 欧美成人激情免费网| 日漫免费在线观看网站| 日韩视频免费中文字幕| free性欧美16hd| 国产精品mp4| 国产一区二区三区免费在线| 国产综合18久久久久久| 不卡视频在线| 91.com在线| 免费在线欧美视频| 韩国三级视频在线观看| 久久精品亚洲国产奇米99| 国产97免费视频| 一区二区三区在线观看视频| 无码免费一区二区三区| 色噜噜夜夜夜综合网| 国产福利免费视频| 亚洲欧美制服第一页| 视频在线观看入口黄最新永久免费国产 | 色呦呦在线播放| 国产精品白嫩初高中害羞小美女| 日韩欧美一级| 天天人人精品| 夜夜嗨av一区二区三区网站四季av| 日韩免费性生活视频播放| 国产伦精品一区二区三区四区| 日韩av在线免费观看| av在线免费观看网址| 国产91热爆ts人妖在线| 亚洲国产中文在线二区三区免| 性欧美大战久久久久久久免费观看| 激情久久久久| 中文字幕精品一区二区三区在线| 久久综合精品国产一区二区三区| 国产一二三区精品| 欧美午夜精品理论片a级按摩| 午夜av免费观看| 欧美国产第一页| 亚洲91在线| 日本高清一区| 国产一区二区高清| 911亚洲精选| 一区二区久久久久久| 国产一区二区视频免费观看| 亚洲欧美色婷婷| 欧美男人天堂| 国产伦视频一区二区三区| 欧美独立站高清久久| 国产精品拍拍拍| 国产色婷婷亚洲99精品小说| 久久国产视频播放| 亚洲国产欧美一区二区丝袜黑人| 在线视频观看国产| 666精品在线| 久久久久久久久99精品大| 日本美女高潮视频| 国产婷婷色一区二区三区四区| 国产成人精品一区二三区| 亚洲成人网在线观看| 免费在线观看的电影网站| 亚洲自拍偷拍第一页| 亚洲网色网站| 永久av免费在线观看| 亚洲女女做受ⅹxx高潮| 国产美女免费看| 国产不卡在线视频| 无码人妻一区二区三区免费n鬼沢| 日韩一区有码在线| 国产一区二区视频免费观看 | 在线免费观看污| 999国内精品视频在线| 亚洲情侣在线| 日本少妇xxxx软件| 亚洲一卡二卡三卡四卡无卡久久 | 久久久久久久一区| 手机在线看片1024| 亚洲人成电影网站色xx| 影视一区二区三区| 亚洲成人午夜在线| 久久99精品国产麻豆婷婷洗澡| 精品在线观看一区| 欧美一区二区播放| 久草在线视频福利| 久久精品美女| 日本不卡视频一二三区| 日本精品在线免费观看| 日韩女优av电影| а√天堂资源官网在线资源| 久久一区二区精品| 青娱乐精品视频| 成年人一级黄色片| 精品国产91久久久久久久妲己| av午夜在线观看| 欧美自拍资源在线| 毛片av一区二区| 久久一区二区三| 亚洲精品永久免费精品| yy6080久久伦理一区二区| 免费成人进口网站| av爱爱亚洲一区| 中国一区二区视频| 欧美第一淫aaasss性| 亚洲区小说区图片区qvod| 亚洲一区在线不卡| 免费亚洲电影在线| 精品欧美一区二区久久久伦| 久久久久久久欧美精品| 国产黄色录像片| 亚洲黄色成人网| 国模私拍国内精品国内av| 欧美亚洲色图视频| 久久久99精品久久| 国产夫绿帽单男3p精品视频| 欧美在线观看视频| 一区二区三区在线观看免费| 在线观看国产网站| 4438成人网| 亚洲欧美韩国| 日韩一区二区高清视频| 国产精品美女久久久久av爽李琼 | 日韩网站中文字幕| av一区二区三区免费观看|