www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 玩轉(zhuǎn)嵌入式
[導(dǎo)讀]if...else 是所有高級(jí)編程語(yǔ)言都有的必備功能。但現(xiàn)實(shí)中的代碼往往存在著過(guò)多的 if...else。雖然 if...else 是必須的,但濫用 if...else 會(huì)對(duì)代碼的可讀性、可維護(hù)性造成很大傷害,進(jìn)而危害到整個(gè)軟件系統(tǒng)?,F(xiàn)在軟件開(kāi)發(fā)領(lǐng)域出現(xiàn)了很多新技術(shù)、新概念,但 if...else 這種基本的程序形式并沒(méi)有發(fā)生太大變化。使用好 if...else 不僅對(duì)于現(xiàn)在,而且對(duì)于將來(lái),都是十分有意義的。今天我們就來(lái)看看如何“干掉”代碼中的 if...else,還代碼以清爽。

前言

if...else 是所有高級(jí)編程語(yǔ)言都有的必備功能。但現(xiàn)實(shí)中的代碼往往存在著過(guò)多的 if...else。雖然 if...else 是必須的,但濫用 if...else 會(huì)對(duì)代碼的可讀性、可維護(hù)性造成很大傷害,進(jìn)而危害到整個(gè)軟件系統(tǒng)?,F(xiàn)在軟件開(kāi)發(fā)領(lǐng)域出現(xiàn)了很多新技術(shù)、新概念,但 if...else 這種基本的程序形式并沒(méi)有發(fā)生太大變化。使用好 if...else 不僅對(duì)于現(xiàn)在,而且對(duì)于將來(lái),都是十分有意義的。今天我們就來(lái)看看如何“干掉”代碼中的 if...else,還代碼以清爽。

問(wèn)題一:if…else 過(guò)多

問(wèn)題表現(xiàn)

if...else 過(guò)多的代碼可以抽象為下面這段代碼。其中只列出5個(gè)邏輯分支,但實(shí)際工作中,能見(jiàn)到一個(gè)方法包含10個(gè)、20個(gè)甚至更多的邏輯分支的情況。另外,if...else 過(guò)多通常會(huì)伴隨著另兩個(gè)問(wèn)題:邏輯表達(dá)式復(fù)雜和 if...else 嵌套過(guò)深。對(duì)于后兩個(gè)問(wèn)題,本文將在下面兩節(jié)介紹。本節(jié)先來(lái)討論 if...else 過(guò)多的情況。
?
   
if?(condition1)?{

}?else?if?(condition2)?{

}?else?if?(condition3)?{

}?else?if?(condition4)?{

}?else?{

}

通常,if...else 過(guò)多的方法,通常可讀性和可擴(kuò)展性都不好。從軟件設(shè)計(jì)角度講,代碼中存在過(guò)多的 if...else 往往意味著這段代碼違反了違反單一職責(zé)原則和開(kāi)閉原則。因?yàn)樵趯?shí)際的項(xiàng)目中,需求往往是不斷變化的,新需求也層出不窮。所以,軟件系統(tǒng)的擴(kuò)展性是非常重要的。而解決 if...else 過(guò)多問(wèn)題的最大意義,往往就在于提高代碼的可擴(kuò)展性。

如何解決

接下來(lái)我們來(lái)看如何解決 if...else 過(guò)多的問(wèn)題。下面我列出了一些解決方法。


  1. 表驅(qū)動(dòng)
  2. 職責(zé)鏈模式
  3. 注解驅(qū)動(dòng)
  4. 事件驅(qū)動(dòng)
  5. 有限狀態(tài)機(jī)
  6. Optional
  7. Assert
  8. 多態(tài)


方法一:表驅(qū)動(dòng)


介紹

對(duì)于邏輯表達(dá)模式固定的 if...else 代碼,可以通過(guò)某種映射關(guān)系,將邏輯表達(dá)式用表格的方式表示;再使用表格查找的方式,找到某個(gè)輸入所對(duì)應(yīng)的處理函數(shù),使用這個(gè)處理函數(shù)進(jìn)行運(yùn)算。

適用場(chǎng)景

邏輯表達(dá)模式固定的 if...else

實(shí)現(xiàn)與示例


   
if?(param.equals(value1))?{
????doAction1(someParams);
}?else?if?(param.equals(value2))?{
????doAction2(someParams);
}?else?if?(param.equals(value3))?{
????doAction3(someParams);
}
//?...
可重構(gòu)為
   
Map?action>?actionMappings?=?new?HashMap<>();?//?這里泛型???是為方便演示,實(shí)際可替換為你需要的類型

//?When?init
actionMappings.put(value1,?(someParams)?->?{?doAction1(someParams)});
actionMappings.put(value2,?(someParams)?->?{?doAction2(someParams)});
actionMappings.put(value3,?(someParams)?->?{?doAction3(someParams)});

//?省略?null?判斷
actionMappings.get(param).apply(someParams);
上面的示例使用了 Java 8 的 Lambda 和 Functional Interface,這里不做講解。
表的映射關(guān)系,可以采用集中的方式,也可以采用分散的方式,即每個(gè)處理類自行注冊(cè)。也可以通過(guò)配置文件的方式表達(dá)??傊问接泻芏?。

還有一些問(wèn)題,其中的條件表達(dá)式并不像上例中的那樣簡(jiǎn)單,但稍加變換,同樣可以應(yīng)用表驅(qū)動(dòng)。下面借用《編程珠璣》中的一個(gè)稅金計(jì)算的例子:

   
if?income?<=?2200
??tax?=?0
else?if?income?<=?2700
??tax?=?0.14?*?(income?-?2200)
else?if?income?<=?3200
??tax?=?70?+?0.15?*?(income?-?2700)
else?if?income?<=?3700
??tax?=?145?+?0.16?*?(income?-?3200)
......
else
??tax?=?53090?+?0.7?*?(income?-?102200)

對(duì)于上面的代碼,其實(shí)只需將稅金的計(jì)算公式提取出來(lái),將每一檔的標(biāo)準(zhǔn)提取到一個(gè)表格,在加上一個(gè)循環(huán)即可。具體重構(gòu)之后的代碼不給出,大家自己思考。

方法二:職責(zé)鏈模式


介紹

當(dāng) if...else 中的條件表達(dá)式靈活多變,無(wú)法將條件中的數(shù)據(jù)抽象為表格并用統(tǒng)一的方式進(jìn)行判斷時(shí),這時(shí)應(yīng)將對(duì)條件的判斷權(quán)交給每個(gè)功能組件。并用鏈的形式將這些組件串聯(lián)起來(lái),形成完整的功能。

適用場(chǎng)景

條件表達(dá)式靈活多變,沒(méi)有統(tǒng)一的形式。

實(shí)現(xiàn)與示例

職責(zé)鏈的模式在開(kāi)源框架的 Filter、Interceptor 功能的實(shí)現(xiàn)中可以見(jiàn)到很多。下面看一下通用的使用模式:
重構(gòu)前:
   
public?void?handle(request)?{
????if?(handlerA.canHandle(request))?{
????????handlerA.handleRequest(request);
????}?else?if?(handlerB.canHandle(request))?{
????????handlerB.handleRequest(request);
????}?else?if?(handlerC.canHandle(request))?{
????????handlerC.handleRequest(request);
????}
}
   

重構(gòu)后:

   
public?void?handle(request)?{
??handlerA.handleRequest(request);
}

public?abstract?class?Handler?{
??protected?Handler?next;
??public?abstract?void?handleRequest(Request?request);
??public?void?setNext(Handler?next)?{?this.next?=?next;?}
}

public?class?HandlerA?extends?Handler?{
??public?void?handleRequest(Request?request)?{
????if?(canHandle(request))?doHandle(request);
????else?if?(next?!=?null)?next.handleRequest(request);
??}
}
   

當(dāng)然,示例中的重構(gòu)前的代碼為了表達(dá)清楚,做了一些類和方法的抽取重構(gòu)。現(xiàn)實(shí)中,更多的是平鋪式的代碼實(shí)現(xiàn)。

注:職責(zé)鏈的控制模式

職責(zé)鏈模式在具體實(shí)現(xiàn)過(guò)程中,會(huì)有一些不同的形式。從鏈的調(diào)用控制角度看,可分為外部控制和內(nèi)部控制兩種。
外部控制不靈活,但是減少了實(shí)現(xiàn)難度。職責(zé)鏈上某一環(huán)上的具體實(shí)現(xiàn)不用考慮對(duì)下一環(huán)的調(diào)用,因?yàn)橥獠拷y(tǒng)一控制了。但是一般的外部控制也不能實(shí)現(xiàn)嵌套調(diào)用。如果有嵌套調(diào)用,并且希望由外部控制職責(zé)鏈的調(diào)用,實(shí)現(xiàn)起來(lái)會(huì)稍微復(fù)雜。具體可以參考 Spring Web Interceptor 機(jī)制的實(shí)現(xiàn)方法。

內(nèi)部控制就比較靈活,可以由具體的實(shí)現(xiàn)來(lái)決定是否需要調(diào)用鏈上的下一環(huán)。但如果調(diào)用控制模式是固定的,那這樣的實(shí)現(xiàn)對(duì)于使用者來(lái)說(shuō)是不便的。

設(shè)計(jì)模式在具體使用中會(huì)有很多變種,大家需要靈活掌握

方法三:注解驅(qū)動(dòng)

介紹

通過(guò) Java 注解(或其它語(yǔ)言的類似機(jī)制)定義執(zhí)行某個(gè)方法的條件。在程序執(zhí)行時(shí),通過(guò)對(duì)比入?yún)⑴c注解中定義的條件是否匹配,再?zèng)Q定是否調(diào)用此方法。具體實(shí)現(xiàn)時(shí),可以采用表驅(qū)動(dòng)或職責(zé)鏈的方式實(shí)現(xiàn)。

適用場(chǎng)景

適合條件分支很多多,對(duì)程序擴(kuò)展性和易用性均有較高要求的場(chǎng)景。通常是某個(gè)系統(tǒng)中經(jīng)常遇到新需求的核心功能。

實(shí)現(xiàn)與示例

很多框架中都能看到這種模式的使用,比如常見(jiàn)的 Spring MVC。因?yàn)檫@些框架很常用,demo 隨處可見(jiàn),所以這里不再上具體的演示代碼了。

這個(gè)模式的重點(diǎn)在于實(shí)現(xiàn)?,F(xiàn)有的框架都是用于實(shí)現(xiàn)某一特定領(lǐng)域的功能,例如 MVC。故業(yè)務(wù)系統(tǒng)如采用此模式需自行實(shí)現(xiàn)相關(guān)核心功能。主要會(huì)涉及反射、職責(zé)鏈等技術(shù)。具體的實(shí)現(xiàn)這里就不做演示了。

方法四:事件驅(qū)動(dòng)

介紹

通過(guò)關(guān)聯(lián)不同的事件類型和對(duì)應(yīng)的處理機(jī)制,來(lái)實(shí)現(xiàn)復(fù)雜的邏輯,同時(shí)達(dá)到解耦的目的。

適用場(chǎng)景

從理論角度講,事件驅(qū)動(dòng)可以看做是表驅(qū)動(dòng)的一種,但從實(shí)踐角度講,事件驅(qū)動(dòng)和前面提到的表驅(qū)動(dòng)有多處不同。具體來(lái)說(shuō):

  1. 表驅(qū)動(dòng)通常是一對(duì)一的關(guān)系;事件驅(qū)動(dòng)通常是一對(duì)多;
  2. 表驅(qū)動(dòng)中,觸發(fā)和執(zhí)行通常是強(qiáng)依賴;事件驅(qū)動(dòng)中,觸發(fā)和執(zhí)行是弱依賴

正是上述兩者不同,導(dǎo)致了兩者適用場(chǎng)景的不同。具體來(lái)說(shuō),事件驅(qū)動(dòng)可用于如訂單支付完成觸發(fā)庫(kù)存、物流、積分等功能。

實(shí)現(xiàn)與示例

實(shí)現(xiàn)方式上,單機(jī)的實(shí)踐驅(qū)動(dòng)可以使用 Guava、Spring 等框架實(shí)現(xiàn)。分布式的則一般通過(guò)各種消息隊(duì)列方式實(shí)現(xiàn)。但是因?yàn)檫@里主要討論的是消除 if...else,所以主要是面向單機(jī)問(wèn)題域。因?yàn)樯婕熬唧w技術(shù),所以此模式代碼不做演示。


方法五:有限狀態(tài)機(jī)

介紹

有限狀態(tài)機(jī)通常被稱為狀態(tài)機(jī)(無(wú)限狀態(tài)機(jī)這個(gè)概念可以忽略)。先引用維基百科上的定義:
有限狀態(tài)機(jī)(英語(yǔ):finite-state machine,縮寫:FSM),簡(jiǎn)稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型。
其實(shí),狀態(tài)機(jī)也可以看做是表驅(qū)動(dòng)的一種,其實(shí)就是當(dāng)前狀態(tài)和事件兩者組合與處理函數(shù)的一種對(duì)應(yīng)關(guān)系。當(dāng)然,處理成功之后還會(huì)有一個(gè)狀態(tài)轉(zhuǎn)移處理。

適用場(chǎng)景

雖然現(xiàn)在互聯(lián)網(wǎng)后端服務(wù)都在強(qiáng)調(diào)無(wú)狀態(tài),但這并不意味著不能使用狀態(tài)機(jī)這種設(shè)計(jì)。其實(shí),在很多場(chǎng)景中,如協(xié)議棧、訂單處理等功能中,狀態(tài)機(jī)有這其天然的優(yōu)勢(shì)。因?yàn)檫@些場(chǎng)景中天然存在著狀態(tài)和狀態(tài)的流轉(zhuǎn)。

實(shí)現(xiàn)與示例

實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì)首先需要有相應(yīng)的框架,這個(gè)框架需要實(shí)現(xiàn)至少一種狀態(tài)機(jī)定義功能,以及對(duì)于的調(diào)用路由功能。狀態(tài)機(jī)定義可以使用 DSL 或者注解的方式。原理不復(fù)雜,掌握了注解、反射等功能的同學(xué)應(yīng)該可以很容易實(shí)現(xiàn)。

上述框架只是起到一個(gè)參考的作用,如果涉及到具體項(xiàng)目,需要根據(jù)業(yè)務(wù)特點(diǎn)自行實(shí)現(xiàn)狀態(tài)機(jī)的核心功能。

方法六:Optional

介紹


Java 代碼中的一部分 if...else 是由非空檢查導(dǎo)致的。因此,降低這部分帶來(lái)的 if...else 也就能降低整體的 if...else 的個(gè)數(shù)。

Java 從 8 開(kāi)始引入了 Optional 類,用于表示可能為空的對(duì)象。這個(gè)類提供了很多方法,用于相關(guān)的操作,可以用于消除 if...else。開(kāi)源框架 Guava 和 Scala 語(yǔ)言也提供了類似的功能。

使用場(chǎng)景

有較多用于非空判斷的 if...else。

實(shí)現(xiàn)與示例

傳統(tǒng)寫法:
   
String?str?=?"Hello?World!";
if?(str?!=?null)?{
????System.out.println(str);
}?else?{
????System.out.println("Null");
}

使用 Optional 之后:

   
1?Optional?strOptional?=?Optional.of("Hello?World!");
2?strOptional.ifPresentOrElse(System.out::println,?()?->?System.out.println("Null"));
?
Optional 還有很多方法,這里不一一介紹了。但請(qǐng)注意,不要使用 get()?和 isPresent()?方法,否則和傳統(tǒng)的 if...else 無(wú)異。

對(duì)于一個(gè)鏈?zhǔn)秸{(diào)用,在 Kotlin 語(yǔ)言中可以通過(guò) ?. 避免空指針異常。如果某一環(huán)為 null,那整個(gè)鏈?zhǔn)奖磉_(dá)式的值便為 null。

方法七:Assert 模式

介紹


上一個(gè)方法適用于解決非空檢查場(chǎng)景所導(dǎo)致的 if...else,類似的場(chǎng)景還有各種參數(shù)驗(yàn)證,比如還有字符串不為空等等。很多框架類庫(kù),例如 Spring、Apache Commons 都提供了工具里,用于實(shí)現(xiàn)這種通用的功能。這樣大家就不必自行編寫 if...else 了。

使用場(chǎng)景

通常用于各種參數(shù)校驗(yàn)

擴(kuò)展:Bean Validation


類似上一個(gè)方法,介紹 Assert 模式順便介紹一個(gè)有類似作用的技術(shù) —— Bean Validation。Bean Validation 是 Java EE 規(guī)范中的一個(gè)。Bean Validation 通過(guò)在 Java Bean 上用注解的方式定義驗(yàn)證標(biāo)準(zhǔn),然后通過(guò)框架統(tǒng)一進(jìn)行驗(yàn)證。也可以起到了減少 if...else 的作用。

方法八:多態(tài)

介紹

使用面向?qū)ο蟮亩鄳B(tài),也可以起到消除 if...else 的作用。


使用場(chǎng)景

鏈接中給出的示例比較簡(jiǎn)單,無(wú)法體現(xiàn)適合使用多態(tài)消除 if...else 的具體場(chǎng)景。一般來(lái)說(shuō),當(dāng)一個(gè)類中的多個(gè)方法都有類似于示例中的 if...else 判斷,且條件相同,那就可以考慮使用多態(tài)的方式消除 if...else。

同時(shí),使用多態(tài)也不是徹底消除 if...else。而是將 if...else 合并轉(zhuǎn)移到了對(duì)象的創(chuàng)建階段。在創(chuàng)建階段的 if..,我們可以使用前面介紹的方法處理。

小結(jié)

上面這節(jié)介紹了 if...else 過(guò)多所帶來(lái)的問(wèn)題,以及相應(yīng)的解決方法。除了本節(jié)介紹的方法,還有一些其它的方法。比如,在《重構(gòu)與模式》一書中就介紹了“用 Strategy 替換條件邏輯”、“用 State 替換狀態(tài)改變條件語(yǔ)句”和“用 Command 替換條件調(diào)度程序”這三個(gè)方法。其中的“Command 模式”,其思想同本文的“表驅(qū)動(dòng)”方法大體一致。另兩種方法,因?yàn)樵凇吨貥?gòu)與模式》一書中已做詳細(xì)講解,這里就不再重復(fù)。

何時(shí)使用何種方法,取決于面對(duì)的問(wèn)題的類型。上面介紹的一些適用場(chǎng)景,只是一些建議,更多的需要開(kāi)發(fā)人員自己的思考。

問(wèn)題二:if…else 嵌套過(guò)深

問(wèn)題表現(xiàn)


if...else 多通常并不是最嚴(yán)重的的問(wèn)題。有的代碼 if...else 不僅個(gè)數(shù)多,而且 if...else 之間嵌套的很深,也很復(fù)雜,導(dǎo)致代碼可讀性很差,自然也就難以維護(hù)。

   
if?(condition1)?{
????action1();
????if?(condition2)?{
????????action2();
????????if?(condition3)?{
????????????action3();
????????????if?(condition4)?{
????????????????action4();
????????????}
????????}
????}
}

if...else 嵌套過(guò)深會(huì)嚴(yán)重地影響代碼的可讀性。當(dāng)然,也會(huì)有上一節(jié)提到的兩個(gè)問(wèn)題。


如何解決


上一節(jié)介紹的方法也可用用來(lái)解決本節(jié)的問(wèn)題,所以對(duì)于上面的方法,此節(jié)不做重復(fù)介紹。這一節(jié)重點(diǎn)一些方法,這些方法并不會(huì)降低 if...else 的個(gè)數(shù),但是會(huì)提高代碼的可讀性:

  1. 抽取方法
  2. 衛(wèi)語(yǔ)句


方法一:抽取方法

介紹

抽取方法是代碼重構(gòu)的一種手段。定義很容易理解,就是將一段代碼抽取出來(lái),放入另一個(gè)單獨(dú)定義的方法。

適用場(chǎng)景

if...else 嵌套嚴(yán)重的代碼,通常可讀性很差。故在進(jìn)行大型重構(gòu)前,需先進(jìn)行小幅調(diào)整,提高其代碼可讀性。抽取方法便是最常用的一種調(diào)整手段。


實(shí)現(xiàn)與示例

重構(gòu)前:

   
public?void?add(Object?element)?{
??if?(!readOnly)?{
????int?newSize?=?size?+?1;
????if?(newSize?>?elements.length)?{
??????Object[]?newElements?=?new?Object[elements.length?+?10];
??????for?(int?i?=?0;?i?????????newElements[i]?=?elements[i];
??????}

??????elements?=?newElements
????}
????elements[size++]?=?element;
??}
}

重構(gòu)后:

   
public?void?add(Object?element)?{
??if?(readOnly)?{
????return;
??}

??if?(overCapacity())?{
????grow();
??}

??addElement(element);
}

方法二:衛(wèi)語(yǔ)句

介紹


在代碼重構(gòu)中,有一個(gè)方法被稱為“使用衛(wèi)語(yǔ)句替代嵌套條件語(yǔ)句”,直接看代碼:
   
double?getPayAmount()?{
????double?result;
????if?(_isDead)?result?=?deadAmount();
????else?{
????????if?(_isSeparated)?result?=?separatedAmount();
????????else?{
????????????if?(_isRetired)?result?=?retiredAmount();
????????????else?result?=?normalPayAmount();
????????};
????}
????return?result;
}

重構(gòu)之后

   
double?getPayAmount()?{
????if?(_isDead)?return?deadAmount();
????if?(_isSeparated)?return?separatedAmount();
????if?(_isRetired)?return?retiredAmount();
????return?normalPayAmount();
}

使用場(chǎng)景


當(dāng)看到一個(gè)方法中,某一層代碼塊都被一個(gè) if...else 完整控制時(shí),通常可以采用衛(wèi)語(yǔ)句。

問(wèn)題三:if…else 表達(dá)式過(guò)于復(fù)雜

問(wèn)題表現(xiàn)


if...else 所導(dǎo)致的第三個(gè)問(wèn)題來(lái)自過(guò)于復(fù)雜的條件表達(dá)式。下面給個(gè)簡(jiǎn)單的例子,當(dāng) condition 1、2、3、4 分別為 true、false,請(qǐng)大家排列組合一下下面表達(dá)式的結(jié)果。

   
1?if?((condition1?&&?condition2?)?||?((condition2?||?condition3)?&&?condition4))?{
2???
3?}
   

我想沒(méi)人愿意干上面的事情。關(guān)鍵是,這一大坨表達(dá)式的含義是什么?關(guān)鍵便在于,當(dāng)不知道表達(dá)式的含義時(shí),沒(méi)人愿意推斷它的結(jié)果。

所以,表達(dá)式復(fù)雜,并不一定是錯(cuò)。但是表達(dá)式難以讓人理解就不好了。


如何解決


對(duì)于 if...else 表達(dá)式復(fù)雜的問(wèn)題,主要用代碼重構(gòu)中的抽取方法、移動(dòng)方法等手段解決。因?yàn)檫@些方法在《代碼重構(gòu)》一書中都有介紹,所以這里不再重復(fù)。

總結(jié)

本文一個(gè)介紹了10種(算上擴(kuò)展有12種)用于消除、簡(jiǎn)化 if...else 的方法。還有一些方法,如通過(guò)策略模式、狀態(tài)模式等手段消除 if...else 在《重構(gòu)與模式》一書中也有介紹。

正如前言所說(shuō),if...else 是代碼中的重要組成部分,但是過(guò)度、不必要地使用 if...else,會(huì)對(duì)代碼的可讀性、可擴(kuò)展性造成負(fù)面影響,進(jìn)而影響到整個(gè)軟件系統(tǒng)。

“干掉”if...else 的能力高低反映的是程序員對(duì)軟件重構(gòu)、設(shè)計(jì)模式、面向?qū)ο笤O(shè)計(jì)、架構(gòu)模式、數(shù)據(jù)結(jié)構(gòu)等多方面技術(shù)的綜合運(yùn)用能力,反映的是程序員的內(nèi)功。要合理使用 if...else,不能沒(méi)有設(shè)計(jì),也不能過(guò)度設(shè)計(jì)。這些對(duì)技術(shù)的綜合、合理地運(yùn)用都需要程序員在工作中不斷的摸索總結(jié)。
精彩推薦:

很多芯片都是3.3V供電,有什么科學(xué)依據(jù)嗎?

怎樣從零學(xué)單片機(jī)?

根據(jù)時(shí)序編程,單片機(jī)驅(qū)動(dòng)74HC595實(shí)現(xiàn)數(shù)碼管顯示

做了兩年硬件后,能否轉(zhuǎn)行到互聯(lián)網(wǎng)做軟件?


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(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)閉