最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

閑話解耦

2023-05-04 10:26 作者:LeonardTX  | 我要投稿

雖說(shuō)解耦是軟件工程中常常用到的概念這些年也時(shí)常掛在嘴邊,但是第一次聽(tīng)說(shuō)還應(yīng)該是十幾年前做code review的時(shí)候聽(tīng)feng總說(shuō)起的,“不懂得解耦的工程師都只能算初級(jí)工程師”。遺憾的是這幾年發(fā)現(xiàn)不管title是Xx還是Xx、Xx的很多兄弟姐妹們似乎在工作過(guò)程中都搞不清楚到底什么是耦合和解耦,也不知道該怎么做好的解耦,突出表現(xiàn)在不合理的模塊劃分、模塊A的邏輯隱藏式的依賴模塊B的時(shí)序、模塊內(nèi)超超超長(zhǎng)到幾十個(gè)狀態(tài)的FSM、模塊間冗余卻沒(méi)有擴(kuò)展性的interface……趁著路上閑來(lái)無(wú)事,再次講講我從前學(xué)到和自己工作中理解到的解耦到底是什么,該怎么做。 所謂耦合,從字面上理解就是模塊之間的依賴關(guān)系。這里說(shuō)的模塊只是一個(gè)概念,大可以到cpu、gpu、npu、moderm這種子系統(tǒng),小可以到某個(gè)module內(nèi)部?jī)啥尾煌墓δ苓壿嫛南到y(tǒng)設(shè)計(jì)的角度看,既然是把這些功能放進(jìn)一個(gè)產(chǎn)品中,那必然意味著它們之間存在著耦合,解耦的作用是降低模塊之間的依賴關(guān)系,把關(guān)系密切的功能放在一個(gè)模塊,把模塊內(nèi)部的細(xì)節(jié)盡量不暴露給其它模塊,把模塊之間的關(guān)聯(lián)盡量清晰,讓每個(gè)模塊的設(shè)計(jì)更加的獨(dú)立。本質(zhì)上就是一句話,內(nèi)部高聚合,接口清晰,之間低耦合。 一般而言,解耦的好處在于降低模塊設(shè)計(jì)復(fù)雜度、提高模塊設(shè)計(jì)的魯棒性、增強(qiáng)模塊的IP能力(可復(fù)用性和可移植性)。首先要做好的就是功能劃分,需要正確的判斷不同的功能是該進(jìn)行聚合還是應(yīng)該解耦,常用的判斷原則不外乎如下幾點(diǎn): 1. 功能之間是否存在運(yùn)算依賴 舉個(gè)簡(jiǎn)單的例子,c=a+b,d=e*c,f=h^i,其中c=a+b和d=e*c應(yīng)該聚合,f=h^i可以解耦出去 2. 功能之間是否存在數(shù)據(jù)依賴 在進(jìn)行c=a+b的時(shí)候,對(duì)數(shù)據(jù)a、b的load和對(duì)數(shù)據(jù)c的store,它們之間應(yīng)該是解耦的;但是對(duì)數(shù)據(jù)a/b的大小端轉(zhuǎn)換,是可以和對(duì)數(shù)據(jù)a、b的load聚合的 3. 功能之間是否存在軟件關(guān)聯(lián) 需要軟件在一次操作中處理的功能,可以聚合在一起,反之則可以考慮解耦 解耦后的功能模塊,一般特點(diǎn)如下: 1. 模塊內(nèi)部功能定義清晰且邏輯簡(jiǎn)單 2. 模塊對(duì)外接口明確且容易擴(kuò)展 3. 模塊之間無(wú)內(nèi)在/隱含依賴關(guān)系 4. 模塊之間的交互明確且最小化 5. 模塊本身易于理解可讀性強(qiáng) 凡事皆有例外,以上特點(diǎn)在特殊場(chǎng)景下不成立,譬如CPU核的流水線控制。 寫(xiě)到這里感覺(jué)依然很抽象,下面具體以十幾年前做過(guò)的一個(gè)模塊CipherHWA設(shè)計(jì)為例,介紹下如何進(jìn)行良好的模塊劃分和解耦的

CipherHWA用于3G/4G的數(shù)據(jù)加解密和完整性保護(hù),從功能上劃分,它被切割成了不同的四個(gè)單元: 1. 進(jìn)行加解密和完整性保護(hù)的運(yùn)算單元SCRT 2. 完成PDCP PDU/SDU load/store的數(shù)據(jù)搬移單元DCH 3. 基于producer-consumer模型的軟硬件接口self_config 4. 用于密鑰派生的獨(dú)立單元KDF 每個(gè)單元都完成自己的獨(dú)立功能,單元之間的接口則盡量干凈,某個(gè)單元對(duì)其它單元的功能無(wú)感。以SCRT和DCH為例,它們之間的接口僅僅是一個(gè)數(shù)據(jù)FIFO,SCRT對(duì)PDU/SDU在內(nèi)存和總線上的搬移完全無(wú)感知,僅僅關(guān)注需要從FIFO中push/pop多少數(shù)據(jù);DCH不關(guān)注數(shù)據(jù)是否進(jìn)行加解密和采用了哪種加解密算法,僅僅關(guān)心需要load/store多少數(shù)據(jù)。SCRT/DCH均不關(guān)心PDU/SDU在內(nèi)存中的存儲(chǔ)格式、軟件配置descriptor的格式、軟件使用加速器的流程,self_config將descriptor解析后按照單個(gè)包為單位將它們所需要的信息發(fā)送到模塊端口上并完成req/done握手。 完成頂層單元定義后,對(duì)下一次單元還可以繼續(xù)進(jìn)行解耦設(shè)計(jì),譬如:SCRT可以進(jìn)一步劃分為用于加解密的UEA/EEA和用于完整性保護(hù)的UIA/EIA,按照算法可以再進(jìn)一步劃分為no operation、kasumi、snow-3g、aes、zuc;pdu/sdu descriptor可以被分割成通信協(xié)議部分和數(shù)據(jù)包部分,其中數(shù)據(jù)包直接提供給DCH使用,通信協(xié)議部分則由self_config調(diào)度…… 最后再提個(gè)問(wèn),3gpp協(xié)議中的golden c提供的測(cè)試數(shù)據(jù),沒(méi)記錯(cuò)的話是大端格式,通信系統(tǒng)中處理的數(shù)據(jù),常常是小端格式。啟動(dòng)新項(xiàng)目或來(lái)了新BSP同事之后,常常在數(shù)據(jù)格式上折騰許久。那數(shù)據(jù)格式的轉(zhuǎn)化,到底是該解耦成獨(dú)立的單元,還是聚合到某個(gè)單元上更好,如果聚合的話該聚合在什么位置?沒(méi)記錯(cuò)的話這問(wèn)題當(dāng)初我花了好幾個(gè)星期才讓Zx兄弟們搞明白該怎么解… 來(lái)個(gè)題外話,現(xiàn)在看到十幾年前自己畫(huà)的圖,也實(shí)在是弱了點(diǎn)??词虑榈倪壿?、解決問(wèn)題的方法、畫(huà)圖的能力、coding的水平,其實(shí)都是很重要的。

閑話解耦的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
酉阳| 新民市| 深泽县| 城口县| 金川县| 会理县| 扶绥县| 青州市| 杭锦后旗| 赤峰市| 金湖县| 呼伦贝尔市| 怀仁县| 正镶白旗| 木里| 扬中市| 乌审旗| 广河县| 巨野县| 武邑县| 韩城市| 辉县市| 怀来县| 靖边县| 龙口市| 邢台县| 台山市| 仙居县| 称多县| 德兴市| 广南县| 五常市| 桑日县| 长宁区| 犍为县| 灵丘县| 咸宁市| 且末县| 海伦市| 民县| 富民县|