免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

C++代碼復(fù)雜性量化與治理:從圈復(fù)雜度到重構(gòu)落地

C++代碼復(fù)雜性量化與治理:從圈復(fù)雜度到重構(gòu)落地 做C這些年我越來越覺得真正勸退大家的不是語法坑也不是內(nèi)存問題而是藏在代碼結(jié)構(gòu)里的“壞味道”。最近在清理一個遺留的交易系統(tǒng)模塊不大才一萬多行但每次改需求都像拆炸彈——牽一發(fā)動全身。我慢慢意識到C代碼復(fù)雜性分析這件事不是寫幾篇文檔就能糊弄過去的它得用數(shù)據(jù)說話用工具落地用重構(gòu)行動去壓。這篇博文我就用自己的實操經(jīng)驗把為什么代碼會變復(fù)雜、怎么量化復(fù)雜度、怎么用工具體檢、以及怎么一步步把復(fù)雜度降下來講清楚。1. 為什么C代碼的復(fù)雜性值得單獨深挖1.1 C的“自由度陷阱”特性越多失控風(fēng)險越大C是一門給了開發(fā)者極大自由的語言。從經(jīng)典的三大件——類繼承、運(yùn)算符重載、模板——到現(xiàn)代C引入的RAII、移動語義、lambda、concept每一項特性都是好工具但每一項也都能成為復(fù)雜度放大器。同樣是寫一個配置解析有人用簡單的std::ifstream加字符串處理一百行內(nèi)解決有人會疊上模板元編程、可變參數(shù)、類型擦除硬生生把解析器寫成一個“小型編譯器”。代碼都能跑看起來都很“C”但后者的維護(hù)成本是前者的十倍不止。我見過太多生產(chǎn)代碼問題不在底層邏輯而在于開發(fā)者“敢于使用一切特性”的習(xí)慣。類繼承能抽象出七八層運(yùn)算符重載能讓obj1 obj2變成一個網(wǎng)絡(luò)包發(fā)送模板工具類嵌套得像俄羅斯套娃。這些代碼在寫的那一刻確實聰明三個月后再讀連作者自己都要翻半天的上下文。C的工程復(fù)雜性往往不是業(yè)務(wù)復(fù)雜度帶來的而是這些語言自由度堆出來的。1.2 技術(shù)債的正反饋越復(fù)雜越不敢改越不敢改越復(fù)雜有人可能會說代碼復(fù)雜就復(fù)雜唄能用就行。這個想法在項目初期問題不大但一旦代碼進(jìn)入維護(hù)期復(fù)雜性會形成一個惡性循環(huán)。比如你負(fù)責(zé)一個模塊里面某個核心函數(shù)的圈復(fù)雜度高達(dá)50邏輯盤根錯節(jié)函數(shù)簽名還帶著四個輸出參數(shù)。新需求來了改吧怕改壞老功能不改吧新功能沒地方塞。最后只能在外面再包一層判斷把原來就亂的分支變得更加不可預(yù)測。這個循環(huán)一旦形成對團(tuán)隊的打擊是全方位的。新人看代碼無從下手老人改代碼心驚膽戰(zhàn)Code Review也只能停留在“能編譯、能跑”的層面根本沒人敢深入優(yōu)化結(jié)構(gòu)。長期下來模塊就像一座慢慢腐爛的危樓看著還能住人可誰也不敢大動。這也解釋了為什么C項目里經(jīng)常出現(xiàn)“誰寫的代碼誰自己最清楚、別人一概不敢碰”的現(xiàn)象。C代碼復(fù)雜性分析存在的意義就是打破這個循環(huán)用客觀數(shù)據(jù)把問題擺到臺面上逼著大家正面處理。2. 復(fù)雜度指標(biāo)先量化再談優(yōu)化2.1 圈復(fù)雜度最常用的入門指標(biāo)圈復(fù)雜度Cyclomatic Complexity是McCabe在1976年提出的度量核心思想是統(tǒng)計代碼中線性無關(guān)路徑的數(shù)量。簡單說就是看一個函數(shù)里有多少個獨立的執(zhí)行路徑路徑越多測試用例要覆蓋的情況越多邏輯越復(fù)雜越容易出Bug。計算規(guī)則其實很樸素圈復(fù)雜度 決策點數(shù)量 1。這里的決策點包括if、else if、for、while、do-while、switch的每個case、catch以及三元運(yùn)算符?:和、||。來看一段實際代碼我建議你自己也拿這段去跑跑看int handle_request(Request req) { int result 0; if (req.type TYPE_A) { // 決策點 1 if (req.state STATE_READY) { // 決策點 2 result process_a(req); } else if (req.state STATE_BUSY) { // 決策點 3 result -EBUSY; } else { result -EINVAL; } } else if (req.type TYPE_B) { // 決策點 4 for (auto item : req.items) { // 決策點 5 if (item.valid()) { // 決策點 6 result item.value; if (result LIMIT) { // 決策點 7 result LIMIT; break; } } } } return result; }按McCabe的標(biāo)準(zhǔn)數(shù)一數(shù)最外層兩個if/else if算2個內(nèi)層if/else if算2個for算1個item.valid()和result LIMIT各算1個一共7個決策點。圈復(fù)雜度就是718。8意味著什么按業(yè)界常見的參考閾值15以上算高風(fēng)險10~15算中等風(fēng)險而8已經(jīng)逼近“需要拆解”的邊界了。這個函數(shù)不到30行圈復(fù)雜度就到了8說明里面分支的密度相當(dāng)高。2.2 認(rèn)知復(fù)雜度比圈復(fù)雜度更貼近“人”圈復(fù)雜度有一個讓很多開發(fā)者不滿的地方它按“決策點”計數(shù)但沒有懲罰嵌套的深度。一個函數(shù)有5個連續(xù)的if和5個層層嵌套的if圈復(fù)雜度都是5可人腦閱讀后者的負(fù)擔(dān)要重得多。為了彌補(bǔ)這個缺陷SonarQube提出了另一個指標(biāo)——認(rèn)知復(fù)雜度Cognitive Complexity。認(rèn)知復(fù)雜度強(qiáng)調(diào)“人閱讀代碼時的理解成本”每多一層嵌套額外的權(quán)重就會增加else if、三元運(yùn)算符、和||這類邏輯連接符也會按規(guī)則疊加分?jǐn)?shù)。所以兩段圈復(fù)雜度相同的代碼認(rèn)知復(fù)雜度可能差出好幾倍認(rèn)知復(fù)雜度越高的代碼同事review起來越容易崩潰。我實踐中的一個感受是圈復(fù)雜度你想控制到15以下其實不算難難的是讓認(rèn)知復(fù)雜度也掉下來。真正啃不動的舊代碼往往是嵌套特別深、邏輯特別繞的那種。這就是為什么我建議團(tuán)隊在做復(fù)雜度分析時兩個指標(biāo)一起看不要只盯一個。2.3 規(guī)模、耦合與其他輔助指標(biāo)除了復(fù)雜度還有一些輔助指標(biāo)能幫我們判斷代碼的“體型”是否健康。我平時最少會看三個維度的數(shù)據(jù)代碼規(guī)模單個文件行數(shù)、單個函數(shù)行數(shù)。一般來說函數(shù)超過100行就需要打一個問號超過200行基本就是重構(gòu)候選。參數(shù)數(shù)量函數(shù)參數(shù)超過4個就該考慮是否需要用結(jié)構(gòu)體/類來聚合參數(shù)了。C里的參數(shù)列表長往往也意味著調(diào)用方要背很多隱含約束。耦合程度看一個類對外部類型的依賴數(shù)量可以用扇入和扇出粗略衡量。某個類的頭文件里塞了幾十個其他類的#include它的可測試性通常很差。另外一個經(jīng)典度量是Halstead復(fù)雜度它通過統(tǒng)計程序里的操作符和操作數(shù)個數(shù)估算“程序詞匯量”“程序長度”“工作量”等指標(biāo)。說實話Halstead在C這種語言里顯得有點笨重因為它會把模板實例、lambda一起算進(jìn)去數(shù)據(jù)噪音很大。我更愿意把它當(dāng)作一個背景參考而不是核心決策依據(jù)。3. 實戰(zhàn)如何用工具給C工程做一次代碼體檢3.1 工具選型Lizard、clang-tidy、SonarQube怎么配合聊完指標(biāo)進(jìn)入實戰(zhàn)。我給C工程做“體檢”時常用的工具組合是這樣的先上Lizard快速摸底再用clang-tidy對重點文件做交叉檢查有條件的話在CI里掛SonarQube做長期跟蹤。先說Lizard。這是一個用Python寫的輕量級代碼復(fù)雜度分析工具支持C/C、Java、Python等十幾種語言不需要編譯你的工程就能掃描。它最實用的地方是能在幾秒內(nèi)跑完一個大型工程直接輸出每個文件的NLOC代碼行數(shù)、每個函數(shù)的圈復(fù)雜度等指標(biāo)還能按復(fù)雜度排序幫你快速鎖定熱點。缺點是它對C的理解停留在詞法層面遇到復(fù)雜的模板、宏展開會有些失真但作為排查工具足夠用了。clang-tidy則更“懂”C。它基于Clang的AST來做分析可以結(jié)合編譯數(shù)據(jù)庫對代碼進(jìn)行精確的語法制導(dǎo)掃描。clang-tidy里有一些和復(fù)雜度相關(guān)的檢查項比如readability-function-size可以配置函數(shù)行數(shù)、參數(shù)數(shù)量、語句數(shù)量上限。它還能給出重構(gòu)建議甚至用--fix自動改一些簡單問題。缺點是速度比Lizard慢不少而且必須先生成compile_commands.json編譯數(shù)據(jù)庫配置成本高一些。SonarQube適合團(tuán)隊長期用。它能收集歷史趨勢和CI結(jié)合把復(fù)雜度紅線變成“門禁”機(jī)制。缺點也很明顯——部署和運(yùn)維成本高對個人項目來說有點殺雞用牛刀。我的建議是個人項目用Lizard就夠了公司級項目再考慮上SonarQube。3.2 用Lizard掃描并定位熱點Lizard的安裝和上手都極其簡單一條命令的事pip install lizard然后直接對源碼目錄跑lizard src/ -l cpp --csv加上--csv是為了拿到結(jié)構(gòu)化輸出方便用Excel或腳本進(jìn)一步分析。如果你只想快速看一眼結(jié)果可以不加CSV默認(rèn)終端表格更直觀。我拿一個真實項目跑過之后輸出大概是這個感覺——不同版本字段略有差異但關(guān)鍵列就是下面這幾個NLOC Avg.NLOC AvgCC Avg.token Function ------------------------------------------------ 123 45 18.4 1294 parse_configsrc/config.cpp 89 30 14.7 1120 handle_messagesrc/network.cpp 67 22 11.2 541 apply_settingsrc/config.cppNLOC表示函數(shù)凈代碼行數(shù)AvgCC就是圈復(fù)雜度。看到parse_config的圈復(fù)雜度到了18我的反應(yīng)通常是兩種要么這個函數(shù)真的邏輯復(fù)雜要么它能把簡單的邏輯表達(dá)得很復(fù)雜。不管是哪種該拆了。實際操作中我一般還會加一個過濾參數(shù)只關(guān)注復(fù)雜度超過閾值的函數(shù)lizard src/ -l cpp -C 15 -w-C 15表示只列出圈復(fù)雜度大于15的函數(shù)-w會忽略警告級別的誤報。這樣幾分鐘之內(nèi)整個工程里最“危險”的幾十個函數(shù)就都被撈出來了。3.3 用clang-tidy對高復(fù)雜度文件做交叉檢查Lizard把熱點撈出來后第二步是用clang-tidy對熱點文件做精確檢查。前提是先讓CMake導(dǎo)出編譯數(shù)據(jù)庫cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDSON編譯數(shù)據(jù)庫生成后在build/compile_commands.json里就能看到每個源文件的編譯命令。然后對目標(biāo)文件跑clang-tidyclang-tidy -p build/ src/config.cpp \ -checks-*,readability-function-size這個命令的意思是把所有默認(rèn)檢查關(guān)掉-*只開啟readability-function-size。你還可以通過--config-file自定義閾值比如把函數(shù)超過60行就報警clang-tidy -p build/ src/config.cpp \ -checks-*,readability-function-size \ --config{CheckOptions: [{key: readability-function-size.LineThreshold, value: 60}]}clang-tidy的好處是它能從AST層面告訴我哪些變量未使用、哪些構(gòu)造函數(shù)可以explicit、哪些函數(shù)可以const這些信息結(jié)合Lizard給出的復(fù)雜度數(shù)據(jù)能讓我在重構(gòu)前把文件里所有潛在問題都過一遍。兩個工具一快一慢、一粗一細(xì)配合起來效率很高。3.4 匯總問題清單排出重構(gòu)優(yōu)先級掃描不是目的目的是生成一份能指導(dǎo)行動的問題清單。我通常會把數(shù)據(jù)整理成下面這種表格按評估結(jié)果排序文件 / 函數(shù)圈復(fù)雜度認(rèn)知復(fù)雜度行數(shù)評估結(jié)果建議動作config.cpp / parse_config1824123高風(fēng)險立即拆解優(yōu)先處理network.cpp / handle_message141989中高風(fēng)險下一輪拆解dbwrapper.cpp / write_batch8645可控暫時不動觀察utils.cpp / trim218健康無需處理判斷優(yōu)先級我有一條很樸素的原則先拆“高頻改動高復(fù)雜度”的代碼再碰“低頻改動但高復(fù)雜度”的代碼。前者直接切斷技術(shù)債的增長源頭后者屬于歷史遺留可以放到重構(gòu)窗口期慢慢處理。像trim這種圈復(fù)雜度只有2的函數(shù)就算寫得再丑也沒有必要動它冒險重構(gòu)的收益接近零。4. 降低復(fù)雜度的重構(gòu)策略從最容易見效的開始4.1 拆函數(shù)、砍嵌套成本最低收益最明顯的動作復(fù)雜度數(shù)據(jù)出來后第一刀應(yīng)該砍向哪我強(qiáng)烈建議先從拆大函數(shù)、消滅深層嵌套開始。這個動作技術(shù)門檻最低出錯概率最小而且效果立竿見影。最常見的兩個招式是“衛(wèi)語句提前返回”和“提取子函數(shù)”。舉一個我實際處理過的例子。有一段配置解析代碼原版長這樣——縮進(jìn)一層疊一層每個分支都往里鉆int parse_config(const std::string path, Config cfg) { int status 0; FILE* fp fopen(path.c_str(), r); if (fp) { char line[256]; while (fgets(line, sizeof(line), fp)) { std::string s(line); trim(s); if (!s.empty() s[0] ! #) { auto eq s.find(); if (eq ! std::string::npos) { std::string key s.substr(0, eq); std::string value s.substr(eq 1); if (key timeout) { cfg.timeout std::stoi(value); } else if (key retries) { cfg.retries std::stoi(value); } else if (key debug) { cfg.debug (value 1 || value true); } else { status WARN_UNKNOWN_KEY; } } } else { continue; } } fclose(fp); } else { status ERR_OPEN_FAILED; } return status; }這段代碼邏輯本身不算深但嵌套層次一眼望過去就讓人煩躁。重構(gòu)之后我把它拆成四個小函數(shù)每個函數(shù)只做一件事bool is_blank_or_comment(const std::string s) { return s.empty() || s[0] #; } bool parse_key_value(const std::string s, std::string key, std::string value) { auto eq s.find(); if (eq std::string::npos) return false; key s.substr(0, eq); value s.substr(eq 1); return true; } int apply_setting(const std::string key, const std::string value, Config cfg) { if (key timeout) { cfg.timeout std::stoi(value); } else if (key retries) { cfg.retries std::stoi(value); } else if (key debug) { cfg.debug is_truthy(value); } else { return WARN_UNKNOWN_KEY; } return 0; } int parse_config(const std::string path, Config cfg) { FILE* fp fopen(path.c_str(), r); if (!fp) return ERR_OPEN_FAILED; int status 0; char line[256]; while (fgets(line, sizeof(line), fp)) { std::string s(line); trim(s); if (is_blank_or_comment(s)) continue; std::string key, value; if (!parse_key_value(s, key, value)) { status WARN_INVALID_LINE; continue; } int rc apply_setting(key, value, cfg); if (rc ! 0 status 0) status rc; } fclose(fp); return status; }重構(gòu)后的效果非常明顯parse_config本身的圈復(fù)雜度從原來的十幾降到了4左右apply_setting的圈復(fù)雜度也只有5而且每個函數(shù)看名字就能猜出職責(zé)。最關(guān)鍵的是以后想加一個max_connections配置項只需要改apply_setting一個函數(shù)不再需要在主解析函數(shù)里上下求索。4.2 用狀態(tài)機(jī)把“開關(guān)地獄”理清楚另一種典型的復(fù)雜度聚集地是那種“根據(jù)狀態(tài)和事件做分支”的代碼。最原始的寫法是if (state A event X) ... else if (...) ...寫到最后可能出現(xiàn)幾十個分支。這種場景下我建議把邏輯轉(zhuǎn)成有限狀態(tài)機(jī)尤其是狀態(tài)和事件都相對固定的時候。舉個報文處理的例子。模塊要處理四種狀態(tài)、四種事件如果用嵌套if處理狀態(tài)一變就要在好幾個地方同步改漏改一個就會出線上事故。我改成一張規(guī)則表enum class State { kIdle, kRunning, kFaulted, kStopped }; enum class Event { kStart, kPause, kError, kReset, kStop }; using Handler std::functionvoid(const Message); struct TransitionRule { State from; Event event; State to; Handler handler; }; const std::vectorTransitionRule kRules { {State::kIdle, Event::kStart, State::kRunning, handle_start}, {State::kRunning, Event::kPause, State::kIdle, handle_pause}, {State::kRunning, Event::kError, State::kFaulted, handle_error}, {State::kFaulted, Event::kReset, State::kIdle, handle_reset}, {State::kIdle, Event::kStop, State::kStopped, handle_stop}, {State::kRunning, Event::kStop, State::kStopped, handle_stop}, }; State next_state(State current, Event evt, const Message msg) { for (const auto rule : kRules) { if (rule.from current rule.event evt) { if (rule.handler) rule.handler(msg); return rule.to; } } return current; }這段代碼圈復(fù)雜度幾乎恒定為1因為整個循環(huán)里只存在一次if邏輯全部被數(shù)據(jù)表承載了。以后要新增一個狀態(tài)本質(zhì)上是往表里加一行不用再到處找case和else if。需要提醒一句狀態(tài)機(jī)不是萬能藥。如果狀態(tài)數(shù)量不大、變化不頻繁硬塞一個規(guī)則表反而是過度設(shè)計判斷標(biāo)準(zhǔn)很簡單——當(dāng)新增一個狀態(tài)或事件需要改動超過兩個地方時才考慮換狀態(tài)機(jī)。4.3 簡化依賴接口隔離和依賴注入復(fù)雜度不只來自函數(shù)內(nèi)部還來自類型之間的依賴糾纏。C里最常見的壞味道是“一個類什么都自己來”。在業(yè)務(wù)代碼里我看到過太多直接在構(gòu)造函數(shù)里new具體依賴的實現(xiàn)比如下面的寫法class PaymentService { public: PaymentService() : gateway_(new CreditCardGateway()) {} // 寫死具體實現(xiàn) void pay(double amount) { gateway_-charge(amount); } private: CreditCardGateway* gateway_; };這段代碼在單測時很痛苦因為CreditCardGateway沒法替換成樁。一旦業(yè)務(wù)要求支持更多支付渠道PaymentService內(nèi)部就要塞一堆if (type ...) new ...圈復(fù)雜度和參數(shù)數(shù)量都會蹭蹭上漲。改成接口注入之后依賴關(guān)系清晰了不少class PaymentGateway { public: virtual ~PaymentGateway() default; virtual void charge(double amount) 0; }; class PaymentService { public: explicit PaymentService(std::unique_ptrPaymentGateway gateway) : gateway_(std::move(gateway)) {} void pay(double amount) { gateway_-charge(amount); } private: std::unique_ptrPaymentGateway gateway_; };PaymentService不再關(guān)心具體網(wǎng)關(guān)的構(gòu)造邏輯測試時可以輕松注入一個MockGateway。不過這里要非常謹(jǐn)慎接口抽象是把雙刃劍。我見過有的團(tuán)隊為了“解耦”每個類都抽一個接口結(jié)果接口數(shù)量翻了四倍代碼跳轉(zhuǎn)路徑長了三倍閱讀起來反而更累。接口隔離的核心目標(biāo)是“把變化點封裝起來”而不是“讓所有類都實現(xiàn)接口”。一個沒有第二實現(xiàn)方的接口大概率是過度設(shè)計的產(chǎn)物。4.4 模板復(fù)雜度限制別讓自己的模板變成新一門語言C的模板是把雙刃劍這個說法大家耳朵都聽出繭了。但落到復(fù)雜度分析上模板導(dǎo)致的坑往往比普通業(yè)務(wù)代碼更隱蔽——工具算不出圈復(fù)雜度可編譯器會告訴你編譯時間翻了十倍、二進(jìn)制體積膨脹三倍。我接手過一個內(nèi)部序列化庫作者為了“通用”把類型、字節(jié)序、壓縮算法全部做成了模板參數(shù)調(diào)用的時候要寫一長串SerializeBinaryCodec, LZ4Compressor, LittleEndian。抽象能力確實強(qiáng)但每次模板實例化失敗編譯器輸出的幾百行錯誤信息能把人看瞎。我的經(jīng)驗是模板代碼必須設(shè)定“復(fù)雜度紅線”模板參數(shù)超過2個的必須有詳細(xì)的文檔說明模板函數(shù)超過50行的先想想是不是真的需要泛化嵌套模板別名using X YZT超過兩層基本該拆了。現(xiàn)代C里很多模板替代品已經(jīng)很好用比如concept約束、std::variant替代部分“多類型重載”的場景、auto參數(shù)簡化泛型lambda。能用這些更易讀的機(jī)制就沒必要硬堆元編程。說到底模板是為了讓調(diào)用方更簡潔而不是為了讓你展示語言功底。5. 常見問題與排查技巧實錄5.1 工具誤報宏、回調(diào)、重構(gòu)邊界用工具做代碼體檢最怕的一件事就是工具掃描出來的“高復(fù)雜度”其實名不副實。我在工程里遇到最多的情況是宏定義把復(fù)雜度藏起來了。比如這個經(jīng)典宏#define CHECK_RETURN(expr) \ do { int rc_ (expr); if (rc_ ! 0) return rc_; } while (0)Lizard在掃描時會直接展開宏調(diào)用的結(jié)果導(dǎo)致一個使用大量CHECK_RETURN的函數(shù)圈復(fù)雜度虛高??蓪嶋H上這些宏代表的是統(tǒng)一的錯誤處理模式邏輯并不復(fù)雜。遇到這種情況我的做法是把宏納入白名單或者直接在結(jié)果里把這類函數(shù)標(biāo)記為“已知合理項”不參與排名。另一個常見誤報來自回調(diào)函數(shù)。在C里函數(shù)指針、std::function、虛函數(shù)調(diào)用都會增加代碼的“間接層”Lizard這類詞法分析工具往往會把這些間接層當(dāng)作普通分支算進(jìn)去。這里我強(qiáng)調(diào)的是復(fù)雜度指標(biāo)是向?qū)Р皇桥袥Q書工具報告里數(shù)字高只能說明“該看一眼了”不能說一定是壞代碼。我一般要求團(tuán)隊成員用“人的判斷”去復(fù)核工具的結(jié)論如果這個函數(shù)讀起來邏輯清晰、測試也好寫那數(shù)字高一點無妨如果讀起來就暈?zāi)菙?shù)字低也值得重構(gòu)。5.2 舊代碼重構(gòu)先織“測試安全網(wǎng)”再動手給老項目做復(fù)雜度治理最忌諱的是“操起鍵盤就拆”。C代碼的隱性耦合太強(qiáng)了一個看似內(nèi)聚的函數(shù)可能被編譯單元外部的全局變量、靜態(tài)單例、回調(diào)注冊表悄悄影響。我踩過的最大坑就是重構(gòu)一個協(xié)議解析函數(shù)時自以為邏輯不變結(jié)果漏看了一個全局狀態(tài)變量上線后消息串包。那次之后我給自己定了一條鐵律重構(gòu)之前先織“測試安全網(wǎng)”。所謂安全網(wǎng)就是在重構(gòu)前為原有函數(shù)的行為創(chuàng)建一組特征測試。不需要追求100%覆蓋但要把核心輸入輸出、邊界情況、異常分支都釘住。C做特征測試我常用的工具是Google Test或者Catch2寫起來都很快。測試通過之后再一步一步重構(gòu)每拆出一個子函數(shù)就編譯一次、跑一遍測試確認(rèn)綠燈再繼續(xù)下一步。一次只動一個點提交信息里標(biāo)明“僅重構(gòu)無行為變更”出了問題也能快速回滾。5.3 復(fù)雜度門禁讓“紅線”成為團(tuán)隊的共同記憶代碼復(fù)雜度的治理靠個人自覺是堅持不了多久的。團(tuán)隊協(xié)作的場景下我強(qiáng)烈建議把復(fù)雜度紅線寫進(jìn)門禁系統(tǒng)。具體怎么做呢最輕量的方案是在Code Review清單里加一條新提交的代碼函數(shù)圈復(fù)雜度不得超過10重活是給CI加一個檢查腳本直接用Lizard的--threshold參數(shù)讓超限提交直接失敗。我用過的一個實用方法是在CI里加一個簡單步驟lizard src/ -l cpp -C 15 --warnings_only如果掃描到圈復(fù)雜度超過15的函數(shù)腳本返回非零狀態(tài)流水線直接紅掉。這樣團(tuán)隊里的每個人都會被迫面對數(shù)據(jù)而不是靠某個人review時憑感覺說“這段有點復(fù)雜”。當(dāng)然門禁閾值要設(shè)得合理一開始可以從20開始讓存量代碼先活下去再逐步收緊到15、10。太激進(jìn)的閾值會導(dǎo)致團(tuán)隊天天跟CI搏斗反而沒人關(guān)心代碼到底好不好。5.4 我踩過幾次坑之后的幾條心得把上面的內(nèi)容總結(jié)成幾條大實話。圈復(fù)雜度、認(rèn)知復(fù)雜度這些數(shù)字從來不是為了發(fā)報告好看也不是為了在review時跟同事爭論“你這個函數(shù)9分我接受不了”。它們的最終目的只有一個——讓代碼能夠被“安全地修改”。我的日常工作里每次改代碼前都會問自己一句“如果新需求下周就來我敢不敢動這塊”如果答案是不敢那不管指標(biāo)怎么好看這塊代碼在實質(zhì)上就是高復(fù)雜度的。另外每次給工程做完復(fù)雜度分析我都會做一件很簡單的事挑出“本周最讓我頭疼的一個函數(shù)”花半小時試著拆掉它。不需要大刀闊斧哪怕只是把一層嵌套變成衛(wèi)語句、把一段重復(fù)邏輯提取成函數(shù)都算贏。日拱一卒一個月下來你再跑一次Lizard看到的曲線走勢那種成就感比寫十篇漂亮的架構(gòu)文檔來得真實得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久9久9久9久9久9久9| 色爱亚洲| 色99在线观看| 久操人| WWW.婷婷五月天.COM| 人人爽在线视频综合网| 五月婷婷色影院| 99久久九九视频| 五月天丁香婷婷社区| 操逼福利视频| 色情播放| 天天婷婷天天| 激情六月天| 天天做天天爱天天玩| 新99思思视频| 琪琪秋霞| 激情五月综合视频| 狠色狠色狠狠色综合网| 婷婷久久午夜网| 久久综合中文字幕| 百度4399有码精品V在线观看 | 99在线精品观看99| 五月婷婷丁香综合| 亚洲五月婷婷| 天天拍夜夜撸| 另类婷婷丁香| 亚洲中文乱字字幕线在永久| 综合综合网| 狠色综合网| 久久婷婷丁香| 人人草成人视频| 婷婷伊人久久| 九九综合久久| 亚洲婷婷丁香五月天激情小说| 色域五月婷婷丁香| 99久久久国产大片| 99热在线免费观看精品| 天天日天天操天天干| 久久这里只有国产| 日本美女97在线视频| 五月天另类小说| 狠狠色噜噜狠狠狠狠综合| 色五月激情综合| 亚洲精品乱码久久久久久综合| 六月激情婷婷| 亚洲视频色色| 五月丁香花婷婷玉莉AV| 色五月大| 久久婷婷亚洲| 婷婷在线日韩综合| 绿色小导航AV| 亚洲成人在线免费| 色婷五月天亚洲| 六月婷婷无码| 思思热精品在线观看| 欧美狠狠地| 99热这里只有精品 搜| 五月中旬婷婷丁香六| 五月天激情图| 久久总和99| 91免费看片| 久久婷婷五月综合伊人| www.久久| 久人人操| 九九家庭影院| 99re8在这里只有精品| 国产午夜一区二区三区| 婷婷五月天伊人网| 99热97美女| 91精品综合久久久久久五月丁香| 玖玖资源在线视频| 精品一区久热| 中文字幕,综合,91| 99久久精品色老| 久久久久久综合88| 5月丁香六月婷婷| 狠狠插日日干撸| 国产色色色色| 大香蕉人妻| 免费观看全黄做爰的视频| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 色停停五月,在线观看| 五月天丁香久久| 26UUU欧美| 操操碰| 日韩无码专区| 色五月综合激情| 色色影院aaaav| 五月婷婷深爱六月| 99激情视频| 一本色道久久88加勒比| 日本99久久| 五月丁香成人日| 99re思思久久| 99精品视频在线观看| 婷婷综合干| 五月丁香性爱| 亚洲五月丁香六月婷婷| 任我干视频在线观看| 性爱激情小说AV五月丁香花| 天天看片日日夜夜| 91丨九色丨熟女|新版| A片女女女女女女BBBB| 五月丁香人妻| 玖玖资源站蜜臀| 亚洲超碰在线| 狠狠色噜噜狠狠| 另类小说五月天综合| 熟女激情五月天 | 狠狠干狠狠干| 婷婷综合激情| 丝袜激情网| 免费无码毛片一区二区A片| 婷婷五月六月| 五月婷婷久| 丁香午夜天| 五月天久久小说| 日韩成人免费电影| 婷婷五月综合网| 日本WwW色偷偷丁香花久久久京东热| 色五月婷婷91| 色噜噜五月天| 9久热在线视频精品| 俺去啦综合网| 丁香五月桃花在线激情综合| 狠狠插狠狠| 丁香五月性爱| 亚洲精品99| www.minyis.com【JT】实力收量可预付QQ2101460746 | 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 色五月丁香五月婷婷五月成人网| 欧美三级巜人妻互换| 99色中文| 亚洲永久免费| 天搞天天天天天| 另类图片五月天| 第四色五月婷婷| 五月综合六月丁| 性综合网| 五月丁香婷婷综合在线| 久久婷婷五月天| 欧洲不卡视频| 无码任你操| 97人人操在线| 超碰91在线| 亚洲黄色影视| 97av在线视频| 日本五月视频| 高清国产一级婬片a免费| 久色网五月| 国产成人一区二区三区在线观看| 婷婷五月激情丁香激情| 婷婷五月天综合亚洲| 草美女在线观看视频在线播放| 99精在线| 思思热在线精品视频网站| 人妻丰满精品一区二区A片| yazhou seshipin| 操99| 欧美激情综合色综合| 婷婷碰碰| 丁香六月激情| 色欲日日躁| 国产精品a无线| 五月天综合缴情网网站0| 开心五月网| 五月天色播网| 国内久久婷婷| 婷婷狠狠干| 99热在线观看免费中文| 苗黎美女四级成人版一级二级毛片| 婷婷六月开心网| 亚洲国产精品二二三三区| 天天爱天天做天天舔| 色色99| 婷婷涩涩网| 婷婷五月色播天| 五月丁香婷婷综合视频| 那里有AV网址| 色婷婷aV四虎| 激情五月天婷婷| 日本在线免费中文com.| 人人爽欧美婷婷久久久五月丁香| 色噜噜狠狠一区二区三区| 天天日天天摸天天| 黄色精品五月婷婷| 少妇出轨做爰高潮A片| 国产精品婷婷午夜在线观看| 在线中文亚洲| 婷婷婷婷婷婷婷婷| 97超级碰碰碰久久久| 深爱五月激情| 嫩草AV久久伊人妇女超级A| 中国女人内射6XXXXX| 可以免费看的AV网站| 五月婷婷深深爱| 五月丁香激情啪啪| 久久玖玖综合| 天天操天天谢| 色之综合网| 九九九九热99超碰| 久热9| 色吧网综合| 丁香六月婷婷开心| 丁香5月婷婷| 99re热在线视频| 又大又粗九一在线| 婷婷五月天视频| 丁香婷婷色情社区成人小说| 我爱宗和色| h亚洲| 色五月激情五月| 狠狠干综合| 91婷婷五月天综合视频| 欧美激情五月天婷婷| 91一道本| 五月婷婷六月色| 97在线刺激| 久久久婷婷五月天| 激情五月婷| 曰曰久久| 五月久久网| 丁香8月手机综合| 色婷婷狠狠爱| 久久在线人妻| 五月婷婷在线免费观看| 操九色| 凹凸探花电影| 五月丁香啪啪综合| 一操久久| 99精品视频网站| 丁香五月激情澎湃一区| 日本激情ⅩXX免费视频| 丁香婷婷五月激情综合| 激情综合色| www.AV在线| 伍月激情天| 午夜成人天堂久久无码日韩久久| 欧美在线视频9| 婷婷激情久久| 91综合视频在线| 婷婷五月欧美综合| 天堂成人A片永久免费网站| 欧美性丁香色色五月天干干| 亚洲色网址| 色欲丁香| 天天色天天日| 被强行糟蹋的女人A片| www超碰| 日日操夜夜爽| 天天做天天爱| 久久永久视频| 色激情五月| 任你爽视频| www.91九色| 综合一区二区三区| 久久婷婷五月| 天天躁日日躁狠狠躁日日躁2022年5月9日| 日韩艹比| 六月激情网| 热九九九九| 超91在线视频| www.maotanji.com| 婷婷放心五日爱| 狠狠搞五月天| 六月天六月婷| 79精品视频在线观看,| 五月六月婷| 性色五月天| 五月天播播中文字幕| 伊人激情影院| 九九色热| 亚洲 在线 性爱 | 色综合天天网| 激情五月婷婷开心网| 激情五月丁香六月婷婷| www.五月天婷婷| 深爱激情五月天| 久操福利| 2025超碰| 性视频久久| 色六月 婷婷| 亚洲色爱综合| 五月天婷婷在线播放| 色色色色色综合| 深爱激情五月天| 丁香综合日产精品久久| 99久久久久久| 国产另类综合| 人妻22p| 天天爽夜爽| 香蕉AV福利精品导航| 岛国在线观看91| 久久九九99桃花视频| 啪啪一区| 色五月色五天免费视频| 97人人干| 丁香五月91| 在线VA视频| 天天摸色吧天天摸色吧| 天天干夜夜谢| 99热九九在线| www久久久| 无毒黄色网址| 色综合播放| 成人色五婷婷| 无码激情AAAAA片-区区| 丁香六月婷婷开心| 色在线视频网2025| 国产精品美女久久久久AV超清 | 六月丁香婷婷视频综合在线观看| 五月天精品视频| 色优久久| 婷婷va| 色综合五月在线| 99热这里有精力| 99免费视频| 欧美碰碰| 亚洲人人操BD| 激情五月激情综合网| 色婷婷精| 思思久久思思| 婷婷五月天伊人| 久久嘟嘟丁香| 五月婷婷色激情| 成人AV在线电影| 综合一区二区三区| 天天日夜夜拍| Caoub青青超碰 | 美国少妇性做爰| 中文字幕av在线| 丁香 婷婷 亚洲 熟女| 色99色| 在线观看av网站| 思思久热6| 玖玖在线视频福利| 51XX午夜影福利| 丁香五月婷婷亚洲天堂| 婷婷五月天激情诱惑| 婷婷丁香六月| www.99热国产| 五月天丁香| 丁香五月天堂网| 激情爱爱网站| 97人人搞| 九九综合九九| 色播五月婷婷| 色情五月婷婷| 《战争与艾拉》完整版| 99色在线视频| 丁香五月在线| 婷婷激情五月天综合| 97碰| 在线播放中文字幕| 五月婷婷婷婷| 日日日,com| 亚洲激情综合| 欧美色色色色色色色色色色影视| 久操婷婷| 激情五月婷婷伊人| 婷婷五月天A V| 天天日人人| av中文在线| 婷婷五月天成人在线视频| 色呦呦美女| 久久 婷婷 五月天| 亚洲色热| 深爱激情五月天婷婷网| AV在线二十六页| 五月激情天天干| 青青色com久久| 婷婷婷婷色| 91seAV| 日本婷婷色日| 99精品在线观看视频| 手机在线日韩视频中文字幕| 日日夜夜天天综合| 狠狠色婷婷丁香六月| 六月成人网| 开心五月深爱五月丁香五月激情五月| 日本精品九九九| 亚洲99综合| 99热这里只有99| 免费做A爰片77777| 99精品热| 开心激情色婷婷五月天| 99操不停| 婷婷五月天激情文学| 电影蜘蛛女| 丁香五月婷婷国产av| 久久人妻伦理| 久色视频在线| 久热99久热| www.婷婷| 99热国产在线| 日本人妻A片成人免费看片| 丁香五月天视频| 精品色色色| 色综合中文色综合网| 九九aV| 婷婷丁香五月综合激情视频| www.色综合| 国产片XXXXA片国语对白| 激情丁香六月| 99热这里只有精品国产免费| 激情丁香五月天图片| 色综合久久88色综合天天99| 五月丁香色婷婷熟女| 激情综合色婷婷啪啪六月天| 黑人糟蹋人妻HD中文字幕| 99re热视频这里只精品5| 激情六月婷婷| 婷婷五月天丁香久久| 五月天精品视频| 97婷婷五月| 亚洲AV免费在线| 就爱日五月天| 搡BBBB搡BBB搡18| 成人必爱视| 国外亚洲成AV人片在线观看| 99爱免费在线视频| 日本狠狠爽| 久久久aaa| 在线中文av| 噜噜噜精品欧美成人在线观看| 欧洲亚洲免费视频9| 丁香婷婷九月在线| 国产亚洲色婷婷久久99精品91| 日日天天干| 日韩人妻无码一区二区| 欧美大香蕉视频| www.夜夜爱.com| 色五月首页| 狠狠色丁香婷婷久久综合| xxx日本东京热| 色噜噜狠狠色综合无码久久欧美| 99伊人性爱在线影院| 亚洲精品无AMM毛片| 日韩成人中文字幕| 婷婷久久综| 青青草激情网| 久久色五月天综合网| 五月丁香拍拍激情综合| 噜噜色五月| 五月婷婷色色色| 婷婷五月激情五月丁香五月| 久久天堂女人| 日韩AV在线免费| 青青草视频免费观看| 五月天婷婷视频| 久操综合| 婷婷基地爱| 丁香六月婷婷开心| 六月婷婷色综合| 日本三久久| 婷婷五月天基地| 亚洲a色| 激情网五月婷婷| 五六月丁香激情视频| 五月丁香婷婷激情在线视频| 五月婷婷开心色伊人| 人人草成人视频| 五月丁香婷婷综合网| 成人网在线视频| 色婷婷文字幕| 色情丁香五月婷婷精品| 久久五月视频| 亚洲色五月天是什么| 欧美成人无码一区二区三区| 中文不卡一二三区| 99热99这里免费的精品| 婷婷天天日婷婷| 直接看的AV| 婷婷五月天视频亚洲| 婷婷五月天电影网| 婷婷久久久| 色婷婷网| 狠狠色噜噜狠狠狠777奇米| ztEJj| 五月天丁香欧美激情| www.9797国产| 久久久com| 五月激情丁香六月狠狠干| 梁铮版《蜘蛛女侠》在线| 欧美精品久久久久久视频观看| 五月婷婷久久综合| 色播激情五月天| 亚洲激情综合| 91精品久久久久久77777| 无码免费人妻A片AAA毛片西瓜| 九久久婷婷| 热99一二三| 人人97碰| 久久久久人无码人妻| 婷婷五月天在线综合| 五月丁香六月玩女人| 97狠狠色| av免费在线看不卡无毒| 激情综合网色五月| 婷婷的五月天另类视频| 综合五月婷婷| av在线资源| 五月丁香花成人社区| 97在线干| 婷婷丁香五| 天天干天天日天天操| 狠狠色丁香| 综合AV网| 色五月激情综合网| 999热在线视频| 五月婷婷六月天| 9久久狠狠的| 亚洲成人另类| 亚洲精品久久久久久久久久吃药| 色九网| 91干婷婷| 婷婷五月中文在线| 五月婷婷五月色| 99精品久久| 久久亚洲天堂| 深爱激情网噜噜色| www婷婷| 97香蕉人人在线观看| 噜综合| 99精品热| 精品热九九| 欧美天天草人人草| 99热天堂| 欧美婷婷精品激| 六月香五月婷| 五月激情在线| 亚卅毛片| 五月丁香婷婷基地| 激情五月天婷婷播播久久综合91| 婷婷五月丁香综合亚洲| 亚洲熟妇无码乱子AV电影| 激情内射人妻1区2区3区| 成人五月天丁香婷| 五月婷婷啪啪| 日韩AV在线电影| 九九热再线九九视频免费在线观看| 婷婷五月花| 国产原创视频91九色| 久久视频这里都是精品| 99热一区| 色播五月丁香| 91Chinese在线| 国产综合久久久777777| 九九99一区| 超碰成人黄色网| 五月情丁香色| 午夜一区| 色黑鬼导航| 六月婷婷国产| 婷婷五月激情网| 六月婷婷开心| 激情五月天视频| 激情av在线| www.91AV.COM| 亚洲五月婷婷| 任你擦免费视频| 激情五月丁香六月| 996热re视频在线观看视频| www.狠狠干com| 亚洲精品V天堂中文字幕| 久久98| 人人舔天天| 97人人射| 天天高潮夜夜爽| 99色这里| 欧韩性爱| 九九精品99| 色色激情网| 五月涩涩网| 伊人网碰碰| 五月天伊人| 婷婷五月天天| 伊人久久婷婷| 可似看的AV| 五月天成人综合| 婷婷五月天中文字幕| 五月熟妇婷婷久久| 久99热| 色色色网站| 五月婷性爱| 久久五月天婷婷| 五月婷婷欧美| 九月婷婷综合| 天天干天天 亚洲| 级人人91| 日本99色| 色婷婷丁香六月| 成人草榴视频| 婷婷五月天基地| 亚洲综合视频网| 伊人色综合网| 综合五月激情| 亚洲午夜视频| 色婷婷网大全在线| av在线免费网站 | 91精品人妻少妇无码影院| 91热在线| 五月丁香六月婷婷免费视频| 欧美激情 日韩无码 婷婷 五月天| 99re这里只有| 日日干日日色| 91操在线| 99日韩| 五月婷婷亞洲中文| 亚洲美女高潮久久久久久69| 欧美色一级色| 99九九视频精彩在线| 免费国产VA国产免费| 日本色啪| 久碰视频| 五月婷婷激情久久| 色五月成人婷婷| 婷婷综合干| 丁香五月天激情综合| 天天综合影院| 人人色婷婷五月天| 99在线视频免费| 最近中文字幕2019视频1| 免费精品99| 欧美激情xxxXX| 久久久A级视频| 99热这里有精品| 免费AV在线| 颜射 精品性爱av| 超碰男人色| 亚洲AV在线免费看| 这里只有精彩视频| 婷婷六月天| 久久这里有精品99| 99热99在线| 99热色婷婷| 成人做爰黄A片免费看直播室男男| 六月99天天婷婷激情综合| 99热这里只有精品2024| 五月丁香网av| 久九色| 丁香香蕉婷婷| 五月天三级| WWW.久久久久久久| 94干大香蕉| 色婷婷综合久久| 人人草人人爱| 国产成人网| 五月婷婷丁香六月| 欧美激情综合五月色丁香| 久久五月婷综合网| 五月丁香六月婷婷,婷| 国产五月天婷婷| 婷婷干六月综合旧址| 黄网在线免费观| 丁香五月影院| 欧美性爱五月天| 五月婷婷啪| 这里有精品| 五月丁香中文| 色婷狠狠| 久久金品黃色| 五月婷在线观看| av性爱网站| 美女美女美女三级色天天天天天| 在线A色| 99色热视频| 亚洲综合五月天综合| 久久久妻人人人| 婷婷丁香五月天婷婷| 婷婷丁香五月麻豆| 久er免费视频| 六月亚洲婷婷6月中文字幕| 久久久久这里只有精品| 五月天综合色| 一点色成人网| 五月综合激情啪啪啪啪啪| 国产亚洲精品久久久久苍井松| 91丨九色丨熟女高潮| 婷婷啪啪| 4399无码视频| 蜜乳AV成人| 六月婷在线| 日韩在线观看亚洲| 久久久婷婷婷| 婷五月天在线草| 天天综合色综合| 开心五月深爱激情| 五月天天天天天天天天天天天婷婷婷| 色婷婷五月天成人网| 伊人干综合| 久久伊人大香蕉| 亚洲亚洲人成综合网络| 另类国产欧美视频| 91肏| 丁香六月婷婷开心| 丁香激激情网| 婷婷成人视频| 性一交一乱一交A片久久四色| AA片在线观看视频在线播放| 99热一本| 五月天无码| 玩熟女五十AV一二三区| 伊人青涩网| www.97碰碰com| 99热在这里只有免费精品| 五月激情综合深爱| 九九亚洲综合| 国产精自产拍久久久久久蜜 | 97影院一级片| 婷婷色系婷色| 五月香婷婷| 黄网在线播放| 玖玖玖婷婷婷| 九九热这里有精品视频| 天天爽夜夜爽天天爽夜夜爽| 五月丁香久久网| 人与禽A片啪啪| 久久久27操| 国产99精品免费视频| 99热精品在线免费观看| 九九在线精点品| 色婷婷av综合网| 色9999日韩国产| 国产精品色一哟哟| 色色色色五月天| 人妻激情久久| 天天操夜夜爽天天操| 婷婷激情五月天小说校园| 91婷婷在线| 色色色宗合网| 久久只有精品| 激情综合网址| 中文字幕人妻AV| 蜜桃婷婷五月| 超碰色色综合| 色婷婷播放| 久婷婷五月丁香在线观看| 色五月婷婷基地| 嫩草AV久久伊人妇女超级A| 97碰成超视频免费视频| 操嫩逼电影| 久久机热/这里只有精品| 免费观看高清无码| 青青草蜜臀| 夜夜谢天天干| 91干视频| 免费视频99| 婷婷五月丁香激情| 有码人妻久久| 99热亚洲| 亚洲欧洲另类| 九色七七| 亚洲成人无码网站| 开心五月网| 亚洲黄网在线| 亚洲色色色色| 日韩无码专区| 夜夜涩涩涩| 六月丁香激情网| 99热思思在线观看| 欧美黑人巨大猛烈cuckold| 大香蕉五月丁香| 色色色色色网| 久久色吧| 丁香六月婷婷激情| www.99.色| 色久五月| 碰97 久| a69在线视频| www.五月天| 一区色色色色网| 欧美精品999| 99九九在线观看免费| 婷婷五月色惰| 色情婷婷。| 人人综合久| 色婷婷五月在线| 操操自拍| 亚洲综合婷婷五月| a在线观看| 日本久久天堂| 99久久婷婷国产综合| 欧美狠狠草| 这里有精品| 伊人五月人妻精品| 97人人妻人人艹| 亚洲色情网站| 影音先锋天天日| 综合色影院| 久99久在线| 五月天综合婷婷| 亚洲无码成人网| 中文字幕永久在线| 五月婷深深爱激情网| 校园春色亚洲色| 开心激情网在线| 九九精品99久久久| 无码啪啪| 天天爱天天做天天舔| 五月婷婷视频| 日韩五月丁香| 丁香五月91| 9l视频自拍9l九色成人| 五月丁香婷中文| 9 1大香蕉| 五月婷婷与六月丁香图片激情| 超碰91在线| 少妇做爰免费视看片| 五月开心深深爱激情综合 | 五月婷婷激情刺激| 国产午夜成人免费看片无遮挡| 天天操天天草天天草天天| www.99精品视频| 激情五月婷| 天天色综合网吨吧| 9久久久久久久久久久| 天天弄天天操| 亚洲精品大片| 久久久人妻不卡| 五月婷丁香在线视频在线| 国产精品男人AV不卡| 丁香婷婷91在线观看视频| 丁香六月色香蕉视频| 99欧美热| 另类视频综合| 26UUU在线观看| 色在线99| 国产AV一区二区三区日韩| 国产精品久久久海的味道| a色色片| 综合九九日本| 狠狠狠狠狠干| 综合色播| 97激情五月天| 国产精品日日躁夜夜躁| 四季8848精品成人免费网站| 99九无网码| 激情综合网激情五月欧美| 偷偷操99| 婷婷99视频全集高清| 99综合免费视频| 蜜臀嫩草| 六月婷婷深深爱| 九草性爱| 丁香六月婷婷色XXXX| 97在线视频人妻九色| 人人看人人摸人人| 日日日,com| 日91高清无玛| 91丨九色丨首页| 日本狠狠干| 99超级碰碰| 久久 视频这里只有精总| 黄色99视频| 98永久精品| 视频一区二区在线| 色婷婷五月天| 久热9| 五月婷婷色| 这里只有精品免费视频在线观看| 狠狠夜夜五月丁香| 五月丁香色色| 97黑人精品区| 色播五月丁香综合| 淫五月停停| 九月丁香| 五月丁香| 婷综合| 激情六月天| 色欲色香伊人| 亚洲丁香网| 激情黄色小说五月天| 熟女重口味αV| 我爱大香蕉| 91精品91久久久中77777久久玖玖九九 | 亚洲综合视频网| 久久综合播放| 婷婷玖玖丁香| 人人操碰| 大香蕉久久久久久久久| 亚洲AV成人一区二区在线观看| 少妇被下春药玩弄A片| 这里只有精品视频| 中文字幕 中文字幕明步| 亚洲一区国产传媒| 99热综合色图| 综合久久五月天| 98永久精品| 久久加勒比| 日本免费91| 九热久| 成年视频免费观看| 五月激情综合性爱| 婷婷性爱视频在线| 亚洲色色五月天| 98永久精品| 色天堂A| 综合久久综合久久| www久久99| 五月六月播婷婷| 天天射影| 亚洲色欲欧美一区二区三区| 日在线V视频在线播放| 天天摸日日舔狠狠添婷婷婷 | 五月婷婷草| 丁香五月婷婷偷拍| 99综合久久| 丁香五月六月久久综合| 狠狠操天天操天天操| 五月天性色| 色五狠狠| 成人版视频在线观看| 无码啪啪| 丁香婷婷综合激情五月色| 91男女视频在线观看| 久久久日韩特色特黄AAAA| 香蕉中文在线| 久久六月天| 欧洲亚洲免费视频9| 久久有码| 人人色婷婷| 色墦五月丁香| 9久久狠狠的| 97操| 五月婷婷高清| 五月开行婷婷色五月| 秋霞AV淫| 能看的av| 日韩成人综合| 视频这里只有精品| 都市激情小说婷婷| 97干免费视频| 日韩一本操| 九九99热| 婷婷九月激情网| www.五月丁香| 天天干天天干天天| 日韩AV在线电影| 97色婷婷成人综合在线观看| 九九草热在线观看| 任你搞网站| 亚洲国产精品VA在线看黑人| 大香蕉欧美在线| 色五月涩涩婷婷蜜桃| 五月激情综合美女久久| 丁香五月大香蕉| 欧美日韩成人h| 久久伊人大香蕉| 五月激情久久综合网| 99色性爰网络| 碰碰碰97免费精彩视频| 五月天婷婷黄色视频| 亚洲第79页| 日本久久精品| 综合激情专区| 密乳视频| 婷婷五月六月| 操人精品| 色婷婷六月精品| 一起草av| 亚洲免费av观看| 逼里香不卡| 精热在线综合网| 熟妇人妻中文字幕无码老熟妇| 九月大香蕉| 男人综合网| 99热综合在线| 色婷婷最新域名| 久综合| 三日本无码| 色噜噜狠狠色综合伊人| 91人操| 色色色色色日韩午夜激情 | 婷婷性爱视频在线| 五月婷婷乱| 中文激情网| 色婷婷av在线| 五月婷在线| 色五月色开心开心五月| 亚洲色婷婷激情| 超碰久热| 婷婷五月综合网| 婷婷天天日婷婷| 人妻激情久久| 午夜丁香六月婷| 日日噜噜夜夜狠狠久久丁香五月| 日本97在线| 天天舔天天操| 五月久久丁香| 97婷婷丁香五月天激情图片| 久久久这里有精品| 国产综合色婷婷精品久久| 色综合天天| 99啪啪骑| 夜夜骑夜夜操| www,久久久人人| 深爱激情六月| 人妻有码乱操| 蜜臀嫩草| 67194线路二在线观看| 九九热在线观看视频网站| 超碰人人色| 婷婷亚洲五| 五月激情综合网| 欧美成性色| 久久精品99| 九九精品片一| 亚州美女| 九九这里精品| 五月婷三级片| 五月婷婷开心综合| 婷婷五月娱乐在线| 五月丁香影视| 超碰93在线观看| 任我肏| 国产人妻操逼| 天天操夜夜操| 天天操天天操| 久热精品免费视频4| 婷婷五月综合视频| 亭亭丁香97| 五月天天久久香| 久草视频一,二三四| 中文激情网| 精热在线综合网| 国产成人精品亚洲线观看| www.日韩艹| 嫩草哈哈操| 色婷婷激情四射视频| 影音先锋一区| 操一区| 人人干Av| 欧美日韩国产日本精品四虎网网站物 | 五月天.com| 婷婷五月天激情综合| 蜜臀久久99精品久久久久久酒店| 99成人小视频| www.五月婷婷.com| 超碰在线成人| 日日激情网| 婷婷终合色图| 性色五月天| 欧美另类五月激情| 97伊人综合婷婷| 亚洲精品午夜国产va久久成人| 天天舔夜夜操www com| 色婷婷狠狠18yy| 成人丁香色| 婷婷六月色丁香视频在线观看| 五月丁香婷婷欧美色图视频五月丁香777电影 | 日亚二欧美| 色婷婷六月| 思思热久久婷婷五月天| 热99久| 五月丁香婷婷啪啪| 天天视频亚洲| 色情综合网| 色就色94欧美setu| www.99久| 开心五月婷婷99| 五月婷啪| 久久久一级AAA| 色色五月天丁香婷婷| 六月伊人婷婷| A1片久久久| 国精产品一区一区三区免费视频 | 大香蕉五月天| 丁香五月天成人网站| 丁香五月天色综合| 久人人操| 成人无码髙潮喷水A片| 五月婷婷色五月| 久久99最新| 婷婷丁香五月色偷偷| 老师的粉嫩小又紧水又多A片视频| 婷婷丁香五月天激情| 激情5月婷婷狠狠干| 久综合九| 日本婷婷激情四射中文字幕在线观看| 99久久99久久| 秋霞三及片| 五月网激情| 婷婷五月综合啪| 狠狠色 综合色区| 激情婷婷| 欧美Va婷色| 五月婷婷啪啪网| 久久只有精| 五月99久久| 五月刺激丁香月综合| 色综合色综合网| 99九九综合久久九九| 五月之婷婷| 天天狠狠插| 狠狠色丁香| 99久久精品国产色欲| 9色资源在线| 日本欧美成人片AAAA| 婷婷色播婷婷| 亚洲激情久久| 五月花综合视频| 婷婷五月天com| 免费视频舔| 人人操91| 991精品在线视频| 天天透天天干| 91人妻人人操| 人妻丰满精品一区二区A片| 99热综合| 婷婷五月色情天| 色婷婷偷拍| 久久这里有精品| 亚洲日日操| 色婷亚洲| 丁香婷婷六月激情综合| 激情欧美婷五月| 天堂婷婷五月在线| 婷婷色婷婷亚洲成人| 久操综合| 996热re视频精品视频| 91九色在线视频| 婷婷成人AV| 99久久.www| 色综合香蕉视频| 奇米网大香蕉| www.久久9| 久99精品视频| A级毛片高清免费不卡播放谢谢谢谢| 亚洲成人av在线观看| 色亭亭九月| 久久九九99.www| 婷婷香蕉视频| 久久大香免费| 吊色AV男人的天堂| 任你搞网站| 99热9999| 激情五月天婷婷直播| 综合激情五月四射婷婷| 亚洲婷婷五月天在线激情综合网| 婷婷大香蕉| 日日操夜夜爽白洁| 五月丁香直播| 综合综合网| 五月丁香六月激情综合欧美| 色五月丁香五月天| 久久小视频| 超碰人人干| 天天插天天爽| 五月婷在线| 九色综合网| 久久精品日| 在线观看996精品| 久久五月网| 丁香六月婷婷开心| 天天干天天 亚洲| 五月婷婷六月开心| 久久精品夜色噜噜亚洲a∨| 日韩欧美一级大黄网站| 五月丁香综合| 91黄色五月天视频| 久艹伊| 激情小说五月天| 色色丁香五月婷婷| 婷婷丁香五月亚洲免费| 射久久丁香五月| 这里只有精品视频免费在线观看| 欧美搡BBBBB摔BBBBB| 色婷婷激情视频| 五月丁香六月成人| 亚洲精品乱码久久久久久综合| 99爱免费在线视频| 久热免费视频| 国产成人+综合亚洲+天堂| 久久婷婷五月综合色丁香花| 久久天堂精品| 亚洲va日| 丁香五月a| 婷婷精品视频| 色和综合网| 玖玖色综合网| 五月天激情网页| 亚洲av网站在线观看| 久久国产一区二区三区| 秋霞丝袜啪啪啪| 丁香香五月激情免费视频| 啄木鸟丝袜美女福利视频| 亚洲欧美成人在线| tingtingcaobi| 婷婷激情性爱| 婷婷六月天激情影院| 激情综合网址| 亚洲三级无码| 99自拍视频网站| 丁香五月丁香伊人| 丁香婷婷五月天激情四射| 江苏少妇性BBB搡BBB爽爽爽 | 97av在线视频| 婷婷激情啪啪| 丁香五月色综合色播五月| 丁香综合婷婷五月天| AA片在线观看视频在线播放| WWW·色色色·COM| 婷婷深爱五月亚洲综合| 超碰99久久| 亚洲99热| 天天搞夜夜叫| 人妻aV在线| 岛国AAAV| 狠狠干天天内射| 婷婷久久五月天丁香| 操精品9| 六月色伊人婷婷| WWW,五月| 丁香五月桃花在线激情综合| 五月噜噜噜色综合| 五月丁香六月激情| 欧美A片在线视频免费观看| 五月网激情| 色5月婷婷色| 91精品国产色猫| 天天日,夜夜爽| 色婷婷亚洲婷婷| 婷婷丁香九月| 色五月激情五月| 91麻豆国产三级精品福利在线观看 | 99热99这里有免费的精品| 五月天久久婷婷| 99噜噜| 五月丁香偷拍| 日本色超碰| 另类小说五月天综合网| 婷婷操逼| 99免费综合网| 成人AV免费观看| 91互操| www.色婷婷.com| 色婷大香蕉| 五月婷婷伊人在线| 秋霞少妇AV网站| 五月丁香婷婷激情| 亚洲激情久久| 综合婷婷六月| 九九热九九| 99久热这里只有精品视频删减版| 婷婷久久99| 五月色亚洲| 五月天国产| 丁香婷婷久久综合在线| 丁香五月婷婷色五月| 亚洲第一成人无码A片| www.五月丁香| 94干大香蕉| 日本色爽| 九九99香蕉在线视频播放| 九九色色| 久久最新色| 97碰碰视频在线观看免费| 九九热re99re6在线精品| 欧美影院| 成人婷婷| 亭亭五月色男人| 天堂AV三级| 国外亚洲成AV人片在线观看| 操逼在线视频| 天天日P天天射P|