AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

通過(guò)Python腳本支持OC代碼重構(gòu)實(shí)踐:模塊調(diào)用關(guān)系分析

來(lái)源: 責(zé)編: 時(shí)間:2023-10-27 09:14:30 255觀看
導(dǎo)讀在軟件開(kāi)發(fā)中,經(jīng)常會(huì)遇到一些代碼問(wèn)題,例如邏輯結(jié)構(gòu)復(fù)雜、依賴(lài)關(guān)系混亂、代碼冗余、不易讀懂的命名等。這些問(wèn)題可能導(dǎo)致代碼的可維護(hù)性下降,增加維護(hù)成本,同時(shí)也會(huì)影響到開(kāi)發(fā)效率。這時(shí)通常通過(guò)重構(gòu)的方式,在不改變軟件的

在軟件開(kāi)發(fā)中,經(jīng)常會(huì)遇到一些代碼問(wèn)題,例如邏輯結(jié)構(gòu)復(fù)雜、依賴(lài)關(guān)系混亂、代碼冗余、不易讀懂的命名等。這些問(wèn)題可能導(dǎo)致代碼的可維護(hù)性下降,增加維護(hù)成本,同時(shí)也會(huì)影響到開(kāi)發(fā)效率。oGf28資訊網(wǎng)——每日最新資訊28at.com

這時(shí)通常通過(guò)重構(gòu)的方式,在不改變軟件的功能和行為的前提下,對(duì)軟件的代碼進(jìn)行重新組織和優(yōu)化。達(dá)到增強(qiáng)代碼的可讀性,降低維護(hù)成本,提升研發(fā)效率和質(zhì)量的目的。通過(guò)合理的重構(gòu),可以大大提高軟件的可維護(hù)性和可擴(kuò)展性,從而延長(zhǎng)其生命。oGf28資訊網(wǎng)——每日最新資訊28at.com

本系列的內(nèi)容介紹了百度App搜索側(cè)業(yè)務(wù)如何使用Python腳本實(shí)現(xiàn)自動(dòng)化工具,以支持百度App配置數(shù)據(jù)項(xiàng)調(diào)用方式升級(jí)為數(shù)據(jù)通路的重構(gòu)過(guò)程。通過(guò)Python腳本,我們實(shí)現(xiàn)一些自動(dòng)化的工具,包括配置數(shù)據(jù)項(xiàng)調(diào)用關(guān)系分析、配置數(shù)據(jù)項(xiàng)接入數(shù)據(jù)通路的實(shí)現(xiàn)、數(shù)據(jù)項(xiàng)使用方接入數(shù)據(jù)通路的適配等,以期提高工作效率、減少出錯(cuò)率。oGf28資訊網(wǎng)——每日最新資訊28at.com

01、代碼重構(gòu)時(shí)的關(guān)鍵步驟及挑戰(zhàn)

在代碼重構(gòu)過(guò)程中,需要考慮重構(gòu)的效率和重構(gòu)后的代碼質(zhì)量。與其相關(guān)的關(guān)鍵的步驟如下,這些步驟先后依賴(lài),相互影響:oGf28資訊網(wǎng)——每日最新資訊28at.com

熟悉業(yè)務(wù)及技術(shù)現(xiàn)狀:在開(kāi)始重構(gòu)之前,研發(fā)首先要理解業(yè)務(wù)邏輯和流程,熟悉業(yè)務(wù)能力及技術(shù)實(shí)現(xiàn)時(shí)存在的問(wèn)題,確定重構(gòu)的范圍。oGf28資訊網(wǎng)——每日最新資訊28at.com

確定重構(gòu)方案:基于對(duì)業(yè)務(wù)邏輯和現(xiàn)有代碼問(wèn)題的理解,確定重構(gòu)方案,重點(diǎn)關(guān)注有兩點(diǎn),有問(wèn)題的代碼如何重構(gòu)和依賴(lài)于該代碼的調(diào)用如何適配。oGf28資訊網(wǎng)——每日最新資訊28at.com

分階段實(shí)施:根據(jù)重構(gòu)方案,分階段的修改代碼,并測(cè)試代碼的功能是否正常。在修改過(guò)程中,應(yīng)該盡量避免影響到不相關(guān)模塊,這樣可以更好地控制風(fēng)險(xiǎn)。oGf28資訊網(wǎng)——每日最新資訊28at.com

效果評(píng)估及監(jiān)控:重構(gòu)方案開(kāi)發(fā)完成,線下對(duì)實(shí)現(xiàn)的效果進(jìn)行評(píng)估,線上對(duì)實(shí)現(xiàn)的效果進(jìn)行監(jiān)控,及時(shí)發(fā)現(xiàn)異常止損和重構(gòu)的效果。oGf28資訊網(wǎng)——每日最新資訊28at.com

在重構(gòu)的工作中,大部分的工作是人工的方式完成,是一個(gè)耗時(shí)且容易出錯(cuò)的過(guò)程。對(duì)于研發(fā)人員來(lái)講,在不改變軟件的功能和行為的前提下,保證質(zhì)量和效率完成對(duì)已有功能的重構(gòu),是一個(gè)極大的挑戰(zhàn)。oGf28資訊網(wǎng)——每日最新資訊28at.com

02、百度App(iOS)搜索側(cè)的配置數(shù)據(jù)項(xiàng)重構(gòu)

為了更好的提升系統(tǒng)穩(wěn)定性和降低配置數(shù)據(jù)項(xiàng)變更時(shí)對(duì)上層依賴(lài)方組件的影響, 我們決定對(duì)百度App(iOS)搜索側(cè)的配置數(shù)據(jù)項(xiàng)進(jìn)行重構(gòu)。重構(gòu)過(guò)程的關(guān)鍵節(jié)點(diǎn)中有超過(guò)80%的工作是由自動(dòng)化工具完成,支持重構(gòu)工作上線后零bug,和全部的配置數(shù)據(jù)項(xiàng)接口內(nèi)斂,提升了系統(tǒng)的安全性和穩(wěn)定性。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

2.1 重構(gòu)背景

百度App(iOS)-搜索側(cè)的配置數(shù)據(jù)項(xiàng),大部分集中在一個(gè)類(lèi)(XXXSetting)中管理。該類(lèi)(XXXSetting)以獨(dú)立組件的方式發(fā)布,被超過(guò)30個(gè)其它組件依賴(lài)。oGf28資訊網(wǎng)——每日最新資訊28at.com

如圖-1 所示數(shù)據(jù)項(xiàng)使用模塊直接調(diào)用數(shù)據(jù)項(xiàng)提供模塊(XXXSetting),是直接依賴(lài)的關(guān)系,數(shù)據(jù)項(xiàng)的增刪相當(dāng)于接口的變更,對(duì)上層的依賴(lài)方會(huì)產(chǎn)生影響,當(dāng)接口存在不兼容變更時(shí),連帶上層的依賴(lài)方組件也需要二次的發(fā)布。且該組件中的數(shù)據(jù)項(xiàng)主要為實(shí)驗(yàn)類(lèi)開(kāi)關(guān),變動(dòng)較為頻繁,影響面也被放大,故需使用比較穩(wěn)定的方式實(shí)現(xiàn)不同模塊之間的數(shù)據(jù)項(xiàng)共享。oGf28資訊網(wǎng)——每日最新資訊28at.com

圖-1圖-1oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

2.2 技術(shù)方案

在技術(shù)實(shí)現(xiàn)的層面,主要分為兩步oGf28資訊網(wǎng)——每日最新資訊28at.com

1、第一步為實(shí)現(xiàn)多模塊之間數(shù)據(jù)通訊的模塊,在本系列的內(nèi)容中以數(shù)據(jù)通路代指該模塊。oGf28資訊網(wǎng)——每日最新資訊28at.com

2、第二步為基于數(shù)據(jù)通路提供的能力,XXXSetting組件為作數(shù)據(jù)提供方接入數(shù)據(jù)通路,原使用XXXSetting組件的使用方接入數(shù)據(jù)通路,這樣就完成了XXXSetting組件中的數(shù)據(jù)項(xiàng)遷移。oGf28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)通路的實(shí)現(xiàn),目標(biāo)實(shí)現(xiàn)以Key-Value的方式讀取及更新配置項(xiàng),需要從無(wú)到有的構(gòu)建,在本系列的其它章節(jié)中內(nèi)容會(huì)有介紹。但XXXSetting組件對(duì)應(yīng)的重構(gòu)工作,是基于已有的線上能力的改造,Setting中的數(shù)據(jù)項(xiàng)超過(guò)百個(gè),外部的調(diào)用點(diǎn)也是以百為計(jì)算單位,涉及的組件有30+。影響面如何評(píng)估,如何保證重構(gòu)的過(guò)程質(zhì)量和效果是可控的?結(jié)合對(duì)重構(gòu)過(guò)程的理解,我們采用了Python腳本來(lái)支持第二步的工作。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

2.3 使用Python支持重構(gòu)過(guò)程

要規(guī)避以人工方式為主的重構(gòu)過(guò)程,引入錯(cuò)誤的風(fēng)險(xiǎn),提升重構(gòu)過(guò)程的質(zhì)量及效率。需要引入Python腳本實(shí)現(xiàn)自動(dòng)化工具支持重構(gòu)過(guò)程的工作。下面以重構(gòu)的關(guān)鍵步驟,自動(dòng)化工具的應(yīng)用目標(biāo)進(jìn)行列舉。oGf28資訊網(wǎng)——每日最新資訊28at.com

1、在熟悉業(yè)務(wù)及技術(shù)現(xiàn)狀階段,可以使用自動(dòng)化工具對(duì)工程中現(xiàn)有的代碼、技術(shù)架構(gòu)進(jìn)行分析,獲取當(dāng)前需要重構(gòu)的代碼的依賴(lài)和調(diào)用關(guān)系信息,確定重構(gòu)過(guò)程的變動(dòng)影響,使用自動(dòng)化的方式會(huì)更加的精準(zhǔn)。oGf28資訊網(wǎng)——每日最新資訊28at.com

2、在確定重構(gòu)方案階段,可以基于自動(dòng)化工具產(chǎn)生的數(shù)據(jù),支持重構(gòu)方案的決策,包括是否需要重構(gòu),如何重構(gòu),調(diào)用方如何適配等。oGf28資訊網(wǎng)——每日最新資訊28at.com

3、在分階段實(shí)施階段,可以使用自動(dòng)化的方式支持代碼的重構(gòu)工作,包括需要重構(gòu)的模塊的升級(jí)、調(diào)用方代碼的適配等。對(duì)比IDE提供的查找、替換等基礎(chǔ)工具,自動(dòng)化工具可以批量處理更加復(fù)雜的重構(gòu)工作。同時(shí)實(shí)施的階段通常是繁瑣且容易出錯(cuò)的,但使用自動(dòng)化的方式可以自動(dòng)完成這些任務(wù),并減少人為錯(cuò)誤。oGf28資訊網(wǎng)——每日最新資訊28at.com

4、在效果評(píng)估及監(jiān)控階段,可以使用自動(dòng)化的方式對(duì)重構(gòu)前后的代碼進(jìn)行對(duì)比測(cè)試保證功能的一致性,收集關(guān)鍵指標(biāo)數(shù)據(jù),發(fā)現(xiàn)指標(biāo)的異常。oGf28資訊網(wǎng)——每日最新資訊28at.com

03、用Python腳本實(shí)現(xiàn)模塊的調(diào)用關(guān)析分析

在實(shí)際的配置數(shù)據(jù)項(xiàng)的調(diào)用關(guān)系來(lái)看,公開(kāi)的數(shù)據(jù)項(xiàng)可為幾種情況,對(duì)應(yīng)的重構(gòu)方案可有不同。oGf28資訊網(wǎng)——每日最新資訊28at.com

1、配置數(shù)據(jù)項(xiàng)僅在XXXSetting模塊內(nèi)使用,這部分?jǐn)?shù)據(jù)項(xiàng)不需要接入數(shù)據(jù)通路。oGf28資訊網(wǎng)——每日最新資訊28at.com

2、配置數(shù)據(jù)項(xiàng)在XXXSetting模塊內(nèi)使用,也在其它的模塊中使用,這類(lèi)數(shù)據(jù)項(xiàng)在XXXSetting模塊中維護(hù),數(shù)據(jù)項(xiàng)需要接入數(shù)據(jù)通路。oGf28資訊網(wǎng)——每日最新資訊28at.com

3、配置數(shù)據(jù)項(xiàng)在XXXSetting模塊內(nèi)沒(méi)有使用,只在一個(gè)模塊中使用,這類(lèi)數(shù)據(jù)項(xiàng)應(yīng)該遷移到使用該數(shù)據(jù)項(xiàng)的模塊中。oGf28資訊網(wǎng)——每日最新資訊28at.com

4、配置數(shù)據(jù)項(xiàng)在XXXSetting模塊內(nèi)沒(méi)有使用,但在一個(gè)以上模塊中使用,這類(lèi)數(shù)據(jù)項(xiàng)可以在XXXSetting模塊中維護(hù),但數(shù)據(jù)項(xiàng)需要接入數(shù)據(jù)通路。oGf28資訊網(wǎng)——每日最新資訊28at.com

基于這樣的改造,XXXSetting模塊的數(shù)據(jù)項(xiàng)接口就可以全部不公開(kāi),對(duì)于配置數(shù)據(jù)項(xiàng)的變更,只影響依賴(lài)配置數(shù)據(jù)項(xiàng)的模塊。那么每個(gè)數(shù)據(jù)項(xiàng)的調(diào)用應(yīng)該是如何重構(gòu)呢,用手動(dòng)查找及分析的方式成本過(guò)高,在項(xiàng)目實(shí)際過(guò)程評(píng)估及修改出錯(cuò)的概率也會(huì)增高,我們使用Python腳本實(shí)現(xiàn)了調(diào)用關(guān)系的分析工具,為重構(gòu)工作提前進(jìn)行數(shù)據(jù)支持及決策。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.1 提取公開(kāi)數(shù)據(jù)項(xiàng)及類(lèi)型

在分析數(shù)據(jù)項(xiàng)的外部調(diào)用情況之前,需要先提取XXXSetting類(lèi)中所有公開(kāi)的數(shù)據(jù)項(xiàng)。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.1.1 公開(kāi)數(shù)據(jù)項(xiàng)在OC類(lèi)中的寫(xiě)法

Setting文件由OC語(yǔ)言開(kāi)發(fā),在Setting頭文件件中公開(kāi)的數(shù)據(jù)項(xiàng)的定義,OC類(lèi)中成員變量的定義,書(shū)寫(xiě)方式如下oGf28資訊網(wǎng)——每日最新資訊28at.com

@property (nonatomic, assign) BOOL value;@property (nonatomic, copy) NSString *value1

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.1.2 提取的是變量類(lèi)型和變量的名稱(chēng)

因頭文件中,包含其它非成員變量的代碼,比如include、前置聲明、類(lèi)定義、空代碼行、注釋、函數(shù)等,需要預(yù)處理下代碼及使用正則表達(dá)式變量定義代碼段,依次的讀取.h文件中的每一行代碼,以相關(guān)實(shí)現(xiàn)及的關(guān)鍵代碼如下。oGf28資訊網(wǎng)——每日最新資訊28at.com

去除注釋

因代碼中的注釋寫(xiě)法存在不確定性,會(huì)對(duì)后面的正則匹配產(chǎn)生影響,故先把注釋刪除。oGf28資訊網(wǎng)——每日最新資訊28at.com

# 原代碼行 @property (nonatomic, copy) NSString *value1; // 注釋 ; * () 這些字符都有可能有,會(huì)影響后面的正則判斷newline = re.sub(r'//.+', "", line)# 處理過(guò)后的代碼行 @property (nonatomic, copy) NSString *value1;
提取數(shù)據(jù)項(xiàng)類(lèi)型及數(shù)據(jù)項(xiàng)

去除注釋代碼之后,下一步為提取成員變量名稱(chēng)及類(lèi)型,可以使用正則中的分組匹配的能力,提取變量類(lèi)型及變量名。這里使用了正則的原因是代碼的寫(xiě)法存在不確定性,@property的寫(xiě)法也會(huì)因變量類(lèi)型不同而變化,故通過(guò)分組匹配的方式來(lái)實(shí)現(xiàn)。oGf28資訊網(wǎng)——每日最新資訊28at.com

# 原代碼行 @property (nonatomic, copy) NSString *value1;matchObj = re.match(r"@property.+/)/s+(.*)", line, re.M|re.I)if matchObj:    # matchObj.group(1) 是成員變量類(lèi)型和變量名 -- NSString *value1;

去除無(wú)用字符

這時(shí)的代碼行,因?yàn)閷?xiě)法的不同及變量的不同,需要進(jìn)行標(biāo)準(zhǔn)化,才能提取出變量類(lèi)型及變量名,主要為去除 星號(hào)(*)。代碼行頭中的空格已經(jīng)過(guò)濾(上行代碼中的/s+)。oGf28資訊網(wǎng)——每日最新資訊28at.com

# 原代碼行 NSString *value1;newline = line.replace('*', '')# 處理后的代碼行 NSString value1;

提取標(biāo)準(zhǔn)化后的數(shù)據(jù)項(xiàng)類(lèi)型及數(shù)據(jù)項(xiàng)

這時(shí)代碼行中只剩下類(lèi)型 空格 變量名 分號(hào),使用正則的分組匹配,提取類(lèi)型及變量名。oGf28資訊網(wǎng)——每日最新資訊28at.com

# 原代碼行 NSString value1;# 正則表達(dá)式中/s匹配任何空白字符,包括空格、制表符、換頁(yè)符等等, 等價(jià)于[ /f/n/r/t/v],/s+代表一個(gè)或多個(gè)這類(lèi)的字符matchObj = re.match(r"(.*)/s+(.*);", line, re.M|re.I)if matchObj:    # valueType = NSString    valueType = matchObj.group(1)      # valueName = value1      valueName = matchObj.group(2)

到這了一步,公開(kāi)可訪問(wèn)的數(shù)據(jù)項(xiàng)及類(lèi)型的提取就已級(jí)完成,這時(shí)就可以轉(zhuǎn)換代碼,如果這時(shí)轉(zhuǎn)換代碼,會(huì)存在冗余,因?yàn)槿绻_(kāi)的變量在其它模塊中沒(méi)有使用,那實(shí)際上就不需要使用數(shù)據(jù)通路進(jìn)行封裝,下一步應(yīng)該分析調(diào)用關(guān)系之后,再進(jìn)行。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.2 數(shù)據(jù)項(xiàng)關(guān)聯(lián)調(diào)用組件oGf28資訊網(wǎng)——每日最新資訊28at.com

確定了公開(kāi)的數(shù)據(jù)項(xiàng)之后,需要在工程源碼中查找每個(gè)數(shù)據(jù)項(xiàng)的調(diào)用點(diǎn),之后再跟據(jù)調(diào)用點(diǎn)數(shù)據(jù)確定每個(gè)數(shù)據(jù)項(xiàng)在不同的組件中調(diào)用的情況。oGf28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)項(xiàng)調(diào)用代碼常見(jiàn)于以下寫(xiě)法,OC中也有其它的寫(xiě)法,本文中以下寫(xiě)法作為示例介紹調(diào)用關(guān)系的生成。oGf28資訊網(wǎng)——每日最新資訊28at.com

[XXXSetting share].value1

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.2.1. 查找每個(gè)數(shù)據(jù)項(xiàng)在文件中的調(diào)用

  • 原始數(shù)據(jù)項(xiàng)調(diào)用字串使用數(shù)據(jù)通路的數(shù)據(jù)項(xiàng)綁定。
  • 整體的思路為,依次的從每個(gè)文件中,全字匹配字符串,查找到一次,算作調(diào)用一次,保存到字典中,統(tǒng)一輸出到表格中。
# 定義個(gè)全局字典,存放每個(gè)數(shù)據(jù)項(xiàng)在不同的文件中調(diào)用的次數(shù)# {數(shù)據(jù)項(xiàng):{文件名:該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)}}valueCallInfoDic = {}# 使用上節(jié)中,提取出來(lái)的數(shù)據(jù)項(xiàng)名,拼裝為實(shí)際調(diào)和時(shí)的寫(xiě)法realValueName = '[XXXSetting share].' + valueName# fileNameList 為所有源碼文件(.m 和 .mm)for fileName in fileNameList:    # 記錄該文件調(diào)用數(shù)據(jù)項(xiàng)的次數(shù)    callNum = 0    # 記錄文件每個(gè)文件調(diào)用該數(shù)據(jù)項(xiàng)的次數(shù)信息    fileCallInfoDic = {}    # 依次的讀取源文件的每一行,匹配調(diào)用情況,記錄調(diào)用次數(shù),及文件名,line 為代碼行    for line in f:        # 使用正則全字匹配,查找替換        regAbKey = realValueName.replace('[', '/[')        regAbKey = regAbKey.replace(']', '/]')        regAbKey = regAbKey.replace('.', '/.')        # pattern = /[XXXSetting share/]/.value1/b  主要為了防止數(shù)據(jù)項(xiàng)名有子串的情況        pattern = r'' + fromstr + r'/b'        matchObj = re.match(r'.*' + regAbKey +'', line, re.M|re.I)        if matchObj:            callNum = callNum + 1     if callNum > 0        fileCallInfoDic[fileName] = str(callNum)    # 如果有調(diào)用關(guān)系,則存儲(chǔ)    if len(fileCallInfoDic)         valueCallInfoDic[valueName] = fileCallInfoDic

oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.3 輸出為excel表格文件

使用Python分析的數(shù)據(jù)還是以機(jī)器語(yǔ)言的形式表式,需要以人類(lèi)語(yǔ)言描述,將數(shù)據(jù)輸出為excel表格,這樣就可以借助于表格工具進(jìn)行數(shù)據(jù)的查看及分析。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

3.3.1 數(shù)據(jù)項(xiàng)的詳細(xì)使用情況輸出

表格的輸出Python沒(méi)有使用有excel操作的相關(guān)庫(kù),使用 ,(逗號(hào))作為分隔符,存儲(chǔ)為.csv文件,在excel中導(dǎo)入csv文件使用。oGf28資訊網(wǎng)——每日最新資訊28at.com

具體的實(shí)現(xiàn)為依次的將每個(gè)數(shù)據(jù)項(xiàng)的使用的組件,使用的文件及在這個(gè)文件文件中使用次數(shù),輸出到.csv文件中。oGf28資訊網(wǎng)——每日最新資訊28at.com

# 表頭分別為,數(shù)據(jù)項(xiàng),使用的組件,使用的文件,文件中使用次數(shù)outfiledata = 'value , uselib , usefile , usenum/n'# 遍歷全局字典valueCallInfoDic,獲取每個(gè)數(shù)據(jù)項(xiàng) 及數(shù)據(jù)項(xiàng)的調(diào)用信息# {數(shù)據(jù)項(xiàng):{文件名:該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)}}for.valueName , valueInfo in valueCallInfoDic.items():    # 從數(shù)據(jù)項(xiàng)的調(diào)用信息中獲取,文件名和該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)    # {文件名:該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)}    for.fileName , callNum in valueCallInfoDic.items():        outfiledata += valueName + " , "        # libByFile 函數(shù),實(shí)現(xiàn)根據(jù)文件獲取所在的組件名        outfiledata += libByFile(fileName) + " , "        outfiledata += fileName + " , "        outfiledata += callNum + " /n"
表格數(shù)據(jù)示例

基于輸出的表格數(shù)據(jù),可以比較容易的判斷每個(gè)數(shù)據(jù)項(xiàng)的優(yōu)化影響范圍,下表為表格數(shù)據(jù)的示例。oGf28資訊網(wǎng)——每日最新資訊28at.com

△注:表格數(shù)據(jù)非真實(shí)業(yè)務(wù)場(chǎng)景數(shù)據(jù)△注:表格數(shù)據(jù)非真實(shí)業(yè)務(wù)場(chǎng)景數(shù)據(jù)oGf28資訊網(wǎng)——每日最新資訊28at.com

3.3.2 數(shù)據(jù)項(xiàng)的預(yù)分析統(tǒng)計(jì)輸出

基于數(shù)據(jù)的調(diào)用關(guān)系數(shù)據(jù),確定每個(gè)數(shù)據(jù)項(xiàng)被每個(gè)組件使用的情況,并確定重構(gòu)的方式。oGf28資訊網(wǎng)——每日最新資訊28at.com

同樣,表格的輸出Python沒(méi)有使用有excel操作的相關(guān)庫(kù),使用 ,(逗號(hào))作為分隔符,存儲(chǔ)為.csv文件,在excel中導(dǎo)入csv文件使用。oGf28資訊網(wǎng)——每日最新資訊28at.com

具體的實(shí)現(xiàn)為依次的讀取數(shù)據(jù)項(xiàng),計(jì)算每個(gè)數(shù)據(jù)項(xiàng)被組件的使用情況,并將結(jié)果輸出到.csv文件中。oGf28資訊網(wǎng)——每日最新資訊28at.com

# 表頭分別為 ,數(shù)據(jù)項(xiàng) ,使用的組件 ,組件中總使用次數(shù) , 使用類(lèi)型outfiledata = 'value , uselib , usenum , usetype /n'# 遍歷全局字典,獲取每個(gè)數(shù)據(jù)項(xiàng) 及數(shù)據(jù)項(xiàng)的調(diào)用信息# {數(shù)據(jù)項(xiàng):{文件名:該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)}}for.valueName , valueInfo in valueCallInfoDic.items():    libCallInfo = {}    # 從數(shù)據(jù)項(xiàng)的調(diào)用信息中獲取,文件名和該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)    # {文件名:該文件內(nèi)數(shù)據(jù)項(xiàng)調(diào)用的次數(shù)}    for.fileName , callNum in valueCallInfoDic.items():        # libByFile 函數(shù),實(shí)現(xiàn)根據(jù)文件獲取所在的組件名        libName =  libByFile(fileName)        if libName in libCallInfo:            libCallInfo[libName] = int(libCallInfo[libName]) + int(callNum)        else:            libCallInfo[libName] = callNum    # 每個(gè)組件的使用XXXSetting 的數(shù)據(jù)項(xiàng)情況    hasSelfCall = False    useType = ""    for.libName in libCallInfo:        if libName == "XXXSetting":            hasSelfCall = True            break    if len(libCallInfo) == 1:        if hasSelfCall:            # 配置數(shù)據(jù)項(xiàng)僅在XXXSetting模塊內(nèi)使用,這部分?jǐn)?shù)據(jù)項(xiàng)不需要接入數(shù)據(jù)通路。            useType = "selfCall"        else:            # 配置數(shù)據(jù)項(xiàng)在XXXSetting模塊內(nèi)沒(méi)有使用,只在一個(gè)模塊中使用,這類(lèi)數(shù)據(jù)項(xiàng)應(yīng)該遷移到使用該數(shù)據(jù)項(xiàng)的模塊中。            useType = "otherCall"    else:        if hasSelfCall:            # 配置數(shù)據(jù)項(xiàng)在XXXSetting模塊內(nèi)使用,也在其它的模塊中使用,這類(lèi)數(shù)據(jù)項(xiàng)在XXXSetting模塊中維護(hù),數(shù)據(jù)項(xiàng)需要接入數(shù)據(jù)通路。            useType = "selfAndOtherCall"        else:            # 配置數(shù)據(jù)項(xiàng)在XXXSetting模塊內(nèi)沒(méi)有使用,但在一個(gè)以上模塊中使用,這類(lèi)數(shù)據(jù)項(xiàng)可以在XXXSetting模塊中維護(hù),但數(shù)據(jù)項(xiàng)需要接入數(shù)據(jù)通路。            useType = "othersCall"    for.libName , libCallNum in libCallInfo.items():        outfiledata += valueName + " , "        outfiledata += libName + " , "        outfiledata += libCallNum + " /n"
表格數(shù)據(jù)示例

基于輸出的表格數(shù)據(jù),可以比較容易的判斷每個(gè)數(shù)據(jù)項(xiàng)應(yīng)該如何整改,下表為表格數(shù)據(jù)的示例。oGf28資訊網(wǎng)——每日最新資訊28at.com

注:表格數(shù)據(jù)非真實(shí)業(yè)務(wù)場(chǎng)景數(shù)據(jù)注:表格數(shù)據(jù)非真實(shí)業(yè)務(wù)場(chǎng)景數(shù)據(jù)oGf28資訊網(wǎng)——每日最新資訊28at.com

04小結(jié)

以上的內(nèi)容,介紹了代碼重構(gòu)過(guò)程的工作及挑戰(zhàn),同時(shí)以Python腳本實(shí)現(xiàn)分析模塊的調(diào)用關(guān)系的統(tǒng)計(jì),基于該腳本,在重構(gòu)工作開(kāi)始之前,可以精確統(tǒng)計(jì)每個(gè)XXXSetting類(lèi)對(duì)外公開(kāi)的類(lèi)成員屬性,被其它組件使用的情況。基于統(tǒng)計(jì)的數(shù)據(jù),可以感知對(duì)應(yīng)的每個(gè)成員屬性在App中的使用情況,且可容易的評(píng)估XXXSetting數(shù)據(jù)項(xiàng)重構(gòu)升級(jí)為數(shù)據(jù)通路工作所帶來(lái)的影響。oGf28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)這部分工作,使用人工的方式實(shí)現(xiàn),依次查找每個(gè)成員屬性的在App中的使用情況及分類(lèi)記錄,是一件重復(fù)性高,出錯(cuò)概率高的工作。而使用自動(dòng)化工具,很好的規(guī)避了這些問(wèn)題,且長(zhǎng)期可積累。oGf28資訊網(wǎng)——每日最新資訊28at.com

oGf28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-15312-0.html通過(guò)Python腳本支持OC代碼重構(gòu)實(shí)踐:模塊調(diào)用關(guān)系分析

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 通過(guò)Opencv進(jìn)行各種驗(yàn)證碼圖片識(shí)別

下一篇: OpenJDK JCov-測(cè)試你的代碼覆蓋率

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 一加Ace2 Pro真機(jī)揭曉 鈦空灰配色質(zhì)感拉滿

    終于,在經(jīng)過(guò)了幾波預(yù)熱之后,一加Ace2 Pro的外觀真機(jī)圖在網(wǎng)上出現(xiàn)了。還是博主數(shù)碼閑聊站曝光的,這次的外觀設(shè)計(jì)還是延續(xù)了一加11的方案,只是細(xì)節(jié)上有了調(diào)整,例如新加入了鈦空灰
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個(gè)月一樣,沒(méi)有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒(méi)有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動(dòng),剛剛開(kāi)始的蘋(píng)果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • K8S | Service服務(wù)發(fā)現(xiàn)

    一、背景在微服務(wù)架構(gòu)中,這里以開(kāi)發(fā)環(huán)境「Dev」為基礎(chǔ)來(lái)描述,在K8S集群中通常會(huì)開(kāi)放:路由網(wǎng)關(guān)、注冊(cè)中心、配置中心等相關(guān)服務(wù),可以被集群外部訪問(wèn);圖片對(duì)于測(cè)試「Tes」環(huán)境或者
  • 三言?xún)烧Z(yǔ)說(shuō)透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫(xiě)出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • WebRTC.Net庫(kù)開(kāi)發(fā)進(jìn)階,教你實(shí)現(xiàn)屏幕共享和多路復(fù)用!

    WebRTC.Net庫(kù):讓你的應(yīng)用更親民友好,實(shí)現(xiàn)視頻通話無(wú)痛接入! 除了基本用法外,還有一些進(jìn)階用法可以更好地利用該庫(kù)。自定義 STUN/TURN 服務(wù)器配置WebRTC.Net 默認(rèn)使用 Google 的
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報(bào)道 從三強(qiáng)爭(zhēng)霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來(lái)。無(wú)論是老牌勁旅臺(tái)積電、三星,還是誓言重回先進(jìn)制程領(lǐng)先地位的英特爾,甚至初成立不久的新
  • iQOO 11S新品發(fā)布會(huì)

    iQOO將在7月4日19:00舉行新品發(fā)布會(huì),推出杭州亞運(yùn)會(huì)電競(jìng)賽事官方用機(jī)iQOO 11S。
  • 7月4日見(jiàn)!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級(jí)旗艦都已悉數(shù)亮相,而下半年即將推出的頂級(jí)旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 榮耀Magic4 至臻版 首創(chuàng)智慧隱私通話 強(qiáng)勁影音系統(tǒng)

    2022年第一季度臨近尾聲,在該季度內(nèi),許多品牌陸續(xù)發(fā)布自己的最新產(chǎn)品,讓大家從全新的角度來(lái)了解當(dāng)今的手機(jī)技術(shù)。手機(jī)是電子設(shè)備中,更新迭代十分迅速的一款產(chǎn)品,基
Top