當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 玩轉(zhuǎn)嵌入式
[導(dǎo)讀]來(lái)源|程序喵大人在軟件中隨處可見(jiàn)命名:要給變量、函數(shù)、參數(shù)、類和封包命名,還要給源代碼及源代碼所在目錄命名,甚至還有jar文件、war文件和ear文件命名。但是,看似簡(jiǎn)單的命名,也是讓不少程序員頭疼的問(wèn)題。有一些小伙伴,在進(jìn)行變量命名的時(shí)候,對(duì)于自己熟悉的英文,可能還會(huì)用英文命名一下,如果需要命名的部分不會(huì)用英文表達(dá),或許就直接用拼音了。有的童鞋一下想不起來(lái)怎么命名,直接用拼音直接用aa,bb等這樣沒(méi)有任何代表意義的字母來(lái)命名,可讀性非常差,可能自己今天寫(xiě)的,一個(gè)星期后回來(lái)再看,也忘記其具體代表的含義了。因此,許多人在寫(xiě)代碼之前,總會(huì)在想啊想啊,用什么命名法好呢?對(duì)于經(jīng)常在C、Java、Pyt...


來(lái)源 | 程序喵大人

軟件中隨處可見(jiàn)命名:要給變量、函數(shù)、參數(shù)、類和封包命名,還要給源代碼及源代碼所在目錄命名,甚至還有jar文件、war文件和ear文件命名。


但是,看似簡(jiǎn)單的命名,也是讓不少程序員頭疼的問(wèn)題。有一些小伙伴,在進(jìn)行變量命名的時(shí)候,對(duì)于自己熟悉的英文,可能還會(huì)用英文命名一下,如果需要命名的部分不會(huì)用英文表達(dá),或許就直接用拼音了。


有的童鞋一下想不起來(lái)怎么命名,直接用拼音直接用aa,bb等這樣沒(méi)有任何代表意義的字母來(lái)命名,可讀性非常差,可能自己今天寫(xiě)的,一個(gè)星期后回來(lái)再看,也忘記其具體代表的含義了。


因此,許多人在寫(xiě)代碼之前,總會(huì)在想啊想啊,用什么命名法好呢?對(duì)于經(jīng)常在C 、Java、Python等主流語(yǔ)言上切換的強(qiáng)迫癥來(lái)說(shuō),換個(gè)語(yǔ)言換種命名風(fēng)格簡(jiǎn)直不要太混亂。


既然有這么多命名要做,不妨做好它。本期內(nèi)容中,異步君為大家?guī)?lái)了起個(gè)好名字應(yīng)遵從的幾條簡(jiǎn)單規(guī)則,一起來(lái)看看吧


01

名副其實(shí)



名副其實(shí)說(shuō)起來(lái)簡(jiǎn)單。我們想要強(qiáng)調(diào),這事很嚴(yán)肅。選個(gè)好名字要花時(shí)間,但省下來(lái)的時(shí)間比花掉的多。注意命名,而且一旦發(fā)現(xiàn)有更好的名稱,就換掉舊的。這么做,讀你代碼的人(包括你自己)都會(huì)更開(kāi)心。


變量、函數(shù)或類的名稱應(yīng)該已經(jīng)答復(fù)了所有的大問(wèn)題。它該告訴你,它為什么會(huì)存在,它做什么事,應(yīng)該怎么用。如果名稱需要注釋來(lái)補(bǔ)充,那就不算是名副其實(shí)。

int d; // elapsed time in days

名稱d什么也沒(méi)說(shuō)明。它沒(méi)有引起讀者對(duì)時(shí)間消逝的感覺(jué),更別說(shuō)以日計(jì)了。我們應(yīng)該選擇指明了計(jì)量對(duì)象和計(jì)量單位的名稱:

int elapsedTimeInDays;int daysSinceCreation;int daysSinceModification;int fileAgeInDays;

選擇體現(xiàn)本意的名稱能讓人更容易理解和修改代碼。下列代碼的目的何在?

public List getThem() { List list1 = new ArrayList();for (int[] x : theList)if (x[0] == 4) list1.add(x);return list1;}

為什么難以說(shuō)明上述代碼要做什么事?里面并沒(méi)有復(fù)雜的表達(dá)式,空格和縮進(jìn)中規(guī)中矩,只用到三個(gè)變量和兩個(gè)常量,甚至沒(méi)有涉及任何其他類或多態(tài)方法,只是(或者看起來(lái)是)一個(gè)數(shù)組的列表而已。


問(wèn)題不在于代碼的簡(jiǎn)潔度,而在于代碼的模糊度:即上下文在代碼中未被明確體現(xiàn)的程度。上述代碼要求我們了解類似以下問(wèn)題的答案:

(1)theList中是什么類型的東西?

(2)theList零下標(biāo)條目的意義是什么?

(3)值4的意義是什么?

(4)我怎么使用返回的列表?


問(wèn)題的答案沒(méi)體現(xiàn)在代碼段中,可代碼段就是它們?cè)撛诘牡胤?。比方說(shuō),我們?cè)陂_(kāi)發(fā)一種掃雷游戲,我們發(fā)現(xiàn),盤(pán)面是名為theList的單元格列表,那就將其名稱改為gameBoard。


盤(pán)面上每個(gè)單元格都用一個(gè)簡(jiǎn)單數(shù)組表示。我們還發(fā)現(xiàn),零下標(biāo)條目是一種狀態(tài)值,而該種狀態(tài)值為4表示“已標(biāo)記”。只要改為有意義的名稱,代碼就會(huì)得到相當(dāng)程度的改進(jìn):

public List getFlaggedCells() { List flaggedCells = new ArrayList();for (int[] cell : gameBoard)if (cell[STATUS_VALUE] == FLAGGED) flaggedCells.add(cell);return flaggedCells;}

注意,代碼的簡(jiǎn)潔性并未被觸及。運(yùn)算符和常量的數(shù)量全然保持不變,嵌套數(shù)量也全然保持不變,但代碼變得明確多了。


還可以更進(jìn)一步,不用int數(shù)組表示單元格,而是另寫(xiě)一個(gè)類。該類包括一個(gè)名副其實(shí)的函數(shù)(稱為isFlagged),從而掩蓋住那個(gè)魔術(shù)數(shù)[1]。于是得到函數(shù)的新版本:

public List getFlaggedCells() { List flaggedCells = new ArrayList();for (Cell cell : gameBoard)if (cell.isFlagged()) flaggedCells.add(cell);return flaggedCells;}

只要簡(jiǎn)單改一下名稱,就能輕易知道發(fā)生了什么。這就是選用好名稱的力量。


02

避免誤導(dǎo)



程序員必須避免留下掩藏代碼本意的錯(cuò)誤線索。應(yīng)當(dāng)避免使用與本意相悖的詞,例如,hp、aix和sco都不該用作變量名,因?yàn)樗鼈兌际荱nix平臺(tái)或類Unix平臺(tái)的專有名稱。即便你是在編寫(xiě)三角計(jì)算程序,hp看起來(lái)是一個(gè)不錯(cuò)的縮寫(xiě)[2],但那也可能會(huì)提供錯(cuò)誤信息。


別用accountList來(lái)指稱一組賬號(hào),除非它真的是List類型。List一詞對(duì)程序員有特殊意義。如果包納賬號(hào)的容器并非真是一個(gè)List,就會(huì)引起錯(cuò)誤的判斷。


所以,用accountGroup或bunchOfAccounts,甚至直接用accounts都會(huì)好一些。


提防使用外形相似度較高的名稱。例如,想?yún)^(qū)分模塊中某處的XYZControllerFor-EfficientHandlingOfStrings和另一處的XYZControllerForEfficientStorage-OfStrings,會(huì)花多長(zhǎng)時(shí)間呢?這兩個(gè)詞的外形實(shí)在太相似了。


以同樣的方式拼寫(xiě)出同樣的概念才是信息。拼寫(xiě)前后不一致就是誤導(dǎo)。我們很享受現(xiàn)代Java編程環(huán)境的自動(dòng)代碼完成特性。鍵入某個(gè)名稱的前幾個(gè)字母,按一下某個(gè)熱鍵組合(如果有的話),就能得到一列該名稱的可能形式。


假如相似的名稱依字母順序放在一起,且差異很明顯,那就會(huì)相當(dāng)有助益,因?yàn)槌绦騿T多半會(huì)壓根不看你的詳細(xì)注釋,甚至不看該類的方法列表就直接看名字挑一個(gè)對(duì)象。


誤導(dǎo)性名稱真正可怕的例子,是用小寫(xiě)字母l和大寫(xiě)字母O作為變量名,尤其是在組合使用的時(shí)候。當(dāng)然,問(wèn)題在于它們看起來(lái)完全像是常量“壹”和“零”。

int a = l;if (O == l) a = O1;else l = 01;

讀者可能會(huì)認(rèn)為這純屬虛構(gòu),但我們確曾見(jiàn)過(guò)充斥這類名稱的代碼。有一次,代碼作者建議用不同字體寫(xiě)變量名,好顯得更清楚些,但前提是這種方案得要通過(guò)口頭和書(shū)面?zhèn)鬟f給未來(lái)所有的開(kāi)發(fā)者才行。后來(lái),只是做了簡(jiǎn)單的重命名操作,就解決了問(wèn)題,而且也沒(méi)引起別的問(wèn)題。


03

做有意義的區(qū)分



如果程序員只是為滿足編譯器或解釋器的需要而寫(xiě)代碼,就會(huì)制造麻煩。例如,因?yàn)橥蛔饔梅秶鷥?nèi)兩樣不同的東西不能重名,你可能會(huì)隨手改掉其中一個(gè)的名稱,有時(shí)干脆以錯(cuò)誤的拼寫(xiě)充數(shù),結(jié)果就會(huì)出現(xiàn)在更正拼寫(xiě)錯(cuò)誤后導(dǎo)致編譯器出錯(cuò)的情況。


光是添加數(shù)字系列或是廢話遠(yuǎn)遠(yuǎn)不夠,即便這足以讓編譯器滿意。如果名稱必須相異,那么其意思也應(yīng)該不同才對(duì)。


以數(shù)字系列命名(a1、a2…aN)是依義命名的對(duì)立面。這樣的名稱純屬誤導(dǎo)——完全沒(méi)有提供正確信息,沒(méi)有提供導(dǎo)向作者意圖的線索。試看:

public static void copyChars(char a1[], char a2[]) {for (int i = 0; i < a1.length; i ) { a2[i] = a1[i]; }}

如果參數(shù)名改為source和destination,這個(gè)函數(shù)就會(huì)像樣許多。


廢話是另一種沒(méi)意義的區(qū)分。假設(shè)你有一個(gè)Product類,如果還有一個(gè)名為ProductInfo或ProductData的類,那它們的名稱雖然不同,意思卻無(wú)區(qū)別。Info和Data就像a、an和the一樣,是意義含混的廢話。


注意,只要體現(xiàn)出有意義的區(qū)分,使用a和the這樣的前綴就沒(méi)錯(cuò)。例如,你可能把a(bǔ)用在域內(nèi)變量,而把the用于函數(shù)參數(shù)[5]。但如果你已經(jīng)有一個(gè)名為zork的變量,又想調(diào)用一個(gè)名為theZork的變量,麻煩就來(lái)了。


廢話都是冗余。variable一詞永遠(yuǎn)不應(yīng)當(dāng)出現(xiàn)在變量名中。table一詞永遠(yuǎn)不應(yīng)當(dāng)出現(xiàn)在表名中。NameString會(huì)比Name好嗎?難道Name會(huì)是一個(gè)浮點(diǎn)數(shù)?如果是這樣,就違反了關(guān)于誤導(dǎo)的規(guī)則。

設(shè)想有一個(gè)名為Customer的類,還有一個(gè)名為CustomerObject的類,它們的區(qū)別何在呢?哪一個(gè)是表示客戶歷史支付情況的最佳方式?


有一個(gè)應(yīng)用反映了這種狀況。為當(dāng)事者諱,我們改了一下,不過(guò)犯錯(cuò)的代碼的確就是這個(gè)樣子:


getActiveAccount(); getActiveAccounts(); getActiveAccountInfo();程序員怎么知道該調(diào)用哪個(gè)函數(shù)呢?


如果缺少明確約定,那么變量moneyAmount與money就沒(méi)區(qū)別,customerInfo與customer沒(méi)區(qū)別,accountData與account沒(méi)區(qū)別,theMessage也與message沒(méi)區(qū)別。要區(qū)分名稱,就要以讀者能鑒別不同之處的方式來(lái)區(qū)分。


04

使用讀得出來(lái)的名稱



人類長(zhǎng)于記憶和使用單詞。大腦的相當(dāng)一部分就是用來(lái)容納和處理單詞的。單詞能讀得出來(lái)。人類的大腦中有那么大的一塊地方用來(lái)處理言語(yǔ),若不善加利用,實(shí)在是種恥辱。


如果名稱讀不出來(lái),討論的時(shí)候就會(huì)像個(gè)傻鳥(niǎo)。“哎,這兒,鼻涕阿三喜摁踢(bee cee arr three cee enn tee)[6]上頭,有個(gè)皮挨死極翹(pee ess zee kyew)[7]整數(shù),看見(jiàn)沒(méi)?”這不是小事,因?yàn)榫幊瘫揪褪且环N社會(huì)活動(dòng)。


有一家公司,程序里面寫(xiě)了一個(gè)genymdhms(生成日期,年、月、日、時(shí)、分、秒),他們一般讀作“gen why emm dee aich emm ess”[8]。我有見(jiàn)字照拼讀的惡習(xí),于是開(kāi)口就念“gen-yah-mudda-hims”。


后來(lái)好些設(shè)計(jì)師和分析師都有樣學(xué)樣,聽(tīng)起來(lái)傻乎乎的。我們知道典故,所以會(huì)覺(jué)得很搞笑。搞笑歸搞笑,實(shí)際是在強(qiáng)忍糟糕的命名。在給新開(kāi)發(fā)者解釋變量名的意義時(shí),他們總是讀出傻乎乎的自造詞,而非恰當(dāng)?shù)挠⒄Z(yǔ)詞。比較

class DtaRcrd102 {private Date genymdhms;private Date modymdhms;private final String pszqint = "102";/* ... */};
class Customer {private Date generationTimestamp;private Date modificationTimestamp;private final String recordId = "102";/* ... */};

現(xiàn)在讀起來(lái)就像人話了:“喂,Mikey,看看這條記錄!生成時(shí)間戳(generation timestamp)[9]被設(shè)置為明天了!不能這樣吧?”


05

使用可搜索的名稱



對(duì)于單字母名稱和數(shù)字常量,有一個(gè)問(wèn)題,就是很難在一大篇文字中找出來(lái)。


找MAX_CLASSES_PER_STUDENT很容易,但想找數(shù)字7就麻煩了,它可能是某些文件名或其他常量定義的一部分,出現(xiàn)在因不同意圖而采用的各種表達(dá)式中。如果該常量是個(gè)長(zhǎng)數(shù)字,又被人錯(cuò)改過(guò),就會(huì)逃過(guò)搜索,從而造成錯(cuò)誤。


同樣,e也不是一個(gè)便于搜索的好變量名,它是英文中最常用的字母,在每個(gè)程序、每段代碼中都有可能出現(xiàn)。由此而見(jiàn),長(zhǎng)名稱勝于短名稱,搜得到的名稱勝于用自造編碼代寫(xiě)就的名稱。


竊以為單字母名稱僅用于短方法中的本地變量。名稱長(zhǎng)短應(yīng)與其作用域大小相對(duì)應(yīng)?[N5]。若變量或常量可能在代碼中多處使用,則應(yīng)賦予其便于搜索的名稱。再比較:

for (int j=0; j<34; j ) { s = (t[j]*4)/5;}
int realDaysPerIdealDay = 4;const int WORK_DAYS_PER_WEEK = 5;int sum = 0;for (int j=0; j < NUMBER_OF_TASKS; j ) {int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;int realTaskWeeks = (realTaskdays / WORK_DAYS_PER_WEEK); sum = realTaskWeeks;}

注意,上面代碼中的sum并非特別有用的名稱,不過(guò)至少搜得到它。采用能表達(dá)意圖的名稱,貌似拉長(zhǎng)了函數(shù)代碼,但要想想看,WORK_DAYS_PER_WEEK比數(shù)字5好找得多,而列表中也只剩下了體現(xiàn)作者意圖的名稱。


06

避免使用編碼



編碼已經(jīng)太多,無(wú)謂再自找麻煩。把類型或作用域編進(jìn)名稱里面,徒然增加了解碼的負(fù)擔(dān)。沒(méi)理由要求每位新人都在弄清要應(yīng)付的代碼之外(那算是正常的),還要再搞懂另一種編碼“語(yǔ)言”。這對(duì)解決問(wèn)題而言,純屬多余的負(fù)擔(dān)。帶編碼的名稱通常也不便發(fā)音,容易打錯(cuò)。


匈牙利語(yǔ)標(biāo)記法


在往昔名稱長(zhǎng)短很重要的時(shí)代,我們毫無(wú)必要地破壞了不編碼的規(guī)矩,如今后悔不迭。Fortran語(yǔ)言要求首字母體現(xiàn)出類型,導(dǎo)致了編碼的產(chǎn)生。BASIC語(yǔ)言的早期版本只允許使用一個(gè)字母再加上一位數(shù)字。匈牙利語(yǔ)標(biāo)記法[10](Hungarian Notation,HN)將這種態(tài)勢(shì)愈演愈烈。


在Windows的C語(yǔ)言API的時(shí)代,HN相當(dāng)重要,那時(shí)所有名稱要么是一個(gè)整數(shù)句柄,要么是一個(gè)長(zhǎng)指針或者void指針,要不然就是string的幾種實(shí)現(xiàn)(有不同的用途和屬性)之一。那時(shí)候編譯器并不做類型檢查,程序員需要匈牙利語(yǔ)標(biāo)記法來(lái)幫助自己記住類型。


現(xiàn)代編程語(yǔ)言具有更豐富的類型系統(tǒng),編譯器也記得并強(qiáng)制使用類型。而且,程序員趨向于使用更小的類、更短的方法,好讓每個(gè)變量的定義都在視野范圍之內(nèi)。


Java程序員不需要類型編碼,因?yàn)閷?duì)象是強(qiáng)類型的,代碼編輯環(huán)境已經(jīng)先進(jìn)到在編譯開(kāi)始前就能監(jiān)測(cè)到類型錯(cuò)誤的程度!所以,如今HN和其他的類型編碼形式都純屬多余。它們?cè)黾恿诵薷淖兞?、函?shù)或類的名稱或類型的難度,它們?cè)黾恿碎喿x代碼的難度,它們制造了讓編碼系統(tǒng)誤導(dǎo)讀者的可能性。

PhoneNumber phoneString;// name not changed when type changed!

成員前綴


也不必用m_前綴來(lái)標(biāo)明成員變量。應(yīng)當(dāng)把類和函數(shù)做得足夠小,以消除對(duì)成員前綴的需要。你應(yīng)當(dāng)使用某種可以高亮或用顏色標(biāo)出成員的編輯環(huán)境。

public class Part {private String m_dsc; // The textual descriptionvoid setName(String name) { m_dsc = name; }}--------------------------------------------------------------------------------------public class Part { String description;void setDescription(String description) {this.description = description; }}

此外,人們會(huì)很快學(xué)會(huì)無(wú)視前綴(或后綴),而只看到名稱中有意義的部分。代碼讀得越多,眼中就越?jīng)]有前綴。最終,前綴變作了不入法眼的廢料,變作了舊代碼的標(biāo)志物。


接口和實(shí)現(xiàn)


有時(shí)也會(huì)出現(xiàn)采用編碼的特殊情形。比如,你在做一個(gè)創(chuàng)建形狀用的抽象工廠(Abstract Factory),該工廠是一個(gè)接口,要用具體類來(lái)實(shí)現(xiàn)。你怎么來(lái)命名工廠和具體類呢?IShapeFactory和ShapeFactory嗎?我喜歡不加修飾的接口。前導(dǎo)字母I被濫用到了說(shuō)好聽(tīng)點(diǎn)兒是干擾,說(shuō)難聽(tīng)點(diǎn)兒根本就是廢話的程度。


我不想讓用戶知道我給他們的是接口,而就想讓他們知道那是一個(gè)ShapeFactory。如果在接口和實(shí)現(xiàn)中必須選其一來(lái)編碼的話,我寧肯選擇實(shí)現(xiàn)。ShapeFactoryImp,甚至是丑陋的CShapeFactory,都比對(duì)接口名稱編碼好。

深度剖析C語(yǔ)言的main函數(shù)
狀態(tài)機(jī)思路在嵌入式開(kāi)發(fā)中的應(yīng)用
keil用printf函數(shù)打印輸出設(shè)置
STM32單片機(jī),UART的寄存器配置以及工作原理

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉