色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

有限狀態(tài)機(jī)轉(zhuǎn)與實(shí)現(xiàn)狀態(tài)機(jī)之間的轉(zhuǎn)換狀態(tài)是什么?

lhl545545 ? 來源:算法與數(shù)據(jù)結(jié)構(gòu) ? 作者:算法與數(shù)據(jù)結(jié)構(gòu) ? 2020-06-09 14:37 ? 次閱讀

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

問題一:if…else 過多

問題表現(xiàn)

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

if (condition1) {

} else if (condition2) {

} else if (condition3) {

} else if (condition4) {

} else {

}

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

如何解決

接下來我們來看如何解決 if.。.else 過多的問題。下面我列出了一些解決方法。

表驅(qū)動(dòng)

職責(zé)鏈模式

注解驅(qū)動(dòng)

事件驅(qū)動(dòng)

有限狀態(tài)機(jī)

Optional

Assert

多態(tài)

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

介紹

對(duì)于邏輯表達(dá)模式固定的 if.。.else 代碼,可以通過某種映射關(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《?, Function《?》 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è)。也可以通過配置文件的方式表達(dá)??傊?,形式有很多。

還有一些問題,其中的條件表達(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ì)算公式提取出來,將每一檔的標(biāo)準(zhǔn)提取到一個(gè)表格,在加上一個(gè)循環(huán)即可。具體重構(gòu)之后的代碼不給出,大家自己思考。

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

介紹

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

適用場(chǎng)景

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

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

職責(zé)鏈的模式在開源框架的 Filter、Interceptor 功能的實(shí)現(xià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)?,F(xiàn)實(shí)中,更多的是平鋪式的代碼實(shí)現(xiàn)。

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

職責(zé)鏈模式在具體實(shí)現(xiàn)過程中,會(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)起來會(huì)稍微復(fù)雜。具體可以參考 Spring Web Interceptor 機(jī)制的實(shí)現(xiàn)方法。

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

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

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

介紹

通過 Java 注解(或其它語言的類似機(jī)制)定義執(zhí)行某個(gè)方法的條件。在程序執(zhí)行時(shí),通過對(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)與示例

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

這個(gè)模式的重點(diǎn)在于實(shí)現(xiàn)。現(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ān)聯(lián)不同的事件類型和對(duì)應(yīng)的處理機(jī)制,來實(shí)現(xiàn)復(fù)雜的邏輯,同時(shí)達(dá)到解耦的目的。

適用場(chǎng)景

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

表驅(qū)動(dòng)通常是一對(duì)一的關(guān)系;事件驅(qū)動(dòng)通常是一對(duì)多;

表驅(qū)動(dòng)中,觸發(fā)和執(zhí)行通常是強(qiáng)依賴;事件驅(qū)動(dòng)中,觸發(fā)和執(zhí)行是弱依賴

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

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

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

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

介紹

有限狀態(tài)機(jī)通常被稱為狀態(tài)機(jī)(無限狀態(tài)機(jī)這個(gè)概念可以忽略)。先引用維基百科上的定義:

有限狀態(tài)機(jī)(英語: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)無狀態(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)。

參考技術(shù):

Apache Mina State Machine

Apache Mina 框架,雖然在 IO 框架領(lǐng)域不及 Netty,但它卻提供了一個(gè)狀態(tài)機(jī)的功能。https://mina.apache.org/mina-project/userguide/ch14-state-machine/ch14-state-machine.html。有自己實(shí)現(xiàn)狀態(tài)機(jī)功能的同學(xué)可以參考其源碼。

Spring State Machine

Spring 子項(xiàng)目眾多,其中有個(gè)不顯山不露水的狀態(tài)機(jī)框架 —— Spring State Machine https://projects.spring.io/spring-statemachine/。可以通過 DSL 和注解兩種方式定義。

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

方法六:Optional

介紹

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

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

使用場(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《String》 strOptional = Optional.of(“Hello World!”);

2 strOptional.ifPresentOrElse(System.out::println, () -》 System.out.println(“Null”));

Optional 還有很多方法,這里不一一介紹了。但請(qǐng)注意,不要使用 get() 和 isPresent() 方法,否則和傳統(tǒng)的 if.。.else 無異。

擴(kuò)展:Kotlin Null Safety

Kotlin 帶有一個(gè)被稱為 Null Safety 的特性:

bob?.department?.head?.name

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

方法七:Assert 模式

介紹

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

Apache Commons Lang 中的 Validate 類:https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/Validate.html

Spring 的 Assert 類:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/Assert.html

使用場(chǎng)景

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

擴(kuò)展:Bean Validation

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

方法八:多態(tài)

介紹

使用面向?qū)ο蟮亩鄳B(tài),也可以起到消除 if.。.else 的作用。在代碼重構(gòu)這本書中,對(duì)此也有介紹:

https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html

使用場(chǎng)景

鏈接中給出的示例比較簡(jiǎn)單,無法體現(xiàn)適合使用多態(tài)消除 if.。.else 的具體場(chǎng)景。一般來說,當(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 過多所帶來的問題,以及相應(yīng)的解決方法。除了本節(jié)介紹的方法,還有一些其它的方法。比如,在《重構(gòu)與模式》一書中就介紹了“用 Strategy 替換條件邏輯”、“用 State 替換狀態(tài)改變條件語句”和“用 Command 替換條件調(diào)度程序”這三個(gè)方法。其中的“Command 模式”,其思想同本文的“表驅(qū)動(dòng)”方法大體一致。另兩種方法,因?yàn)樵凇吨貥?gòu)與模式》一書中已做詳細(xì)講解,這里就不再重復(fù)。

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

問題二:if…else 嵌套過深

問題表現(xiàn)

if.。.else 多通常并不是最嚴(yá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 嵌套過深會(huì)嚴(yán)重地影響代碼的可讀性。當(dāng)然,也會(huì)有上一節(jié)提到的兩個(gè)問題。

如何解決

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

抽取方法

衛(wèi)語句

方法一:抽取方法

介紹

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

用 https://refactoring.com/catalog/extractMethod.html 中的定義:

適用場(chǎng)景

if.。.else 嵌套嚴(yán)重的代碼,通??勺x性很差。故在進(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 《 size; 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)語句

介紹

在代碼重構(gòu)中,有一個(gè)方法被稱為“使用衛(wèi)語句替代嵌套條件語句”https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html。直接看代碼:

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í),通??梢圆捎眯l(wèi)語句。

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

問題表現(xiàn)

if.。.else 所導(dǎo)致的第三個(gè)問題來自過于復(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 }

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

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

如何解決

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

總結(jié)

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

正如前言所說,if.。.else 是代碼中的重要組成部分,但是過度、不必要地使用 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,不能沒有設(shè)計(jì),也不能過度設(shè)計(jì)。這些對(duì)技術(shù)的綜合、合理地運(yùn)用都需要程序員在工作中不斷的摸索總結(jié)。
責(zé)任編輯:pj

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3785

    瀏覽量

    81005
  • 高級(jí)編程
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    8026
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Simulink中的狀態(tài)機(jī)建模方法 Simulink數(shù)據(jù)可視化與分析功能

    1. Simulink中的狀態(tài)機(jī)建模方法 1.1 理解狀態(tài)機(jī)的基本概念 在開始建模之前,了解狀態(tài)機(jī)的基本概念是必要的。狀態(tài)機(jī)由以下幾個(gè)部分組成:
    的頭像 發(fā)表于 12-12 09:27 ?280次閱讀

    觸發(fā)器和狀態(tài)機(jī)的關(guān)系是什么

    觸發(fā)器和狀態(tài)機(jī)在數(shù)字電路設(shè)計(jì)中有著緊密的關(guān)系,它們共同構(gòu)成了時(shí)序邏輯電路的基礎(chǔ),用于實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)、處理和傳輸。
    的頭像 發(fā)表于 08-12 11:24 ?424次閱讀

    如何在FPGA中實(shí)現(xiàn)狀態(tài)機(jī)

    在FPGA(現(xiàn)場(chǎng)可編程門陣列)中實(shí)現(xiàn)狀態(tài)機(jī)是一種常見的做法,用于控制復(fù)雜的數(shù)字系統(tǒng)行為。狀態(tài)機(jī)能夠根據(jù)當(dāng)前的輸入和系統(tǒng)狀態(tài),決定下一步的動(dòng)作和新的狀態(tài)。這里,我們將詳細(xì)探討如何在FPG
    的頭像 發(fā)表于 07-18 15:57 ?568次閱讀

    玩轉(zhuǎn)Spring狀態(tài)機(jī)

    說起Spring狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒錯(cuò),Spring狀態(tài)機(jī)就是狀態(tài)模式的一種
    的頭像 發(fā)表于 06-25 14:21 ?934次閱讀
    玩轉(zhuǎn)Spring<b class='flag-5'>狀態(tài)機(jī)</b>

    關(guān)于SMU狀態(tài)機(jī)的問題求解

    我有一些關(guān)于 SMU 狀態(tài)機(jī)的問題。 假設(shè)由于某種原因,SMU 已進(jìn)入故障狀態(tài)。 手冊(cè)指出,要返回運(yùn)行狀態(tài)并將 FSP 恢復(fù)到無故障狀態(tài),應(yīng)調(diào)用IfxSmu_releaseFSP()。
    發(fā)表于 05-29 08:18

    請(qǐng)問STM32F051用了操作系統(tǒng)RTX后還需要寫狀態(tài)機(jī)不?

    現(xiàn)在學(xué)會(huì)了rtx操作系統(tǒng)后,原來用狀態(tài)機(jī)的學(xué)的程序,可不可以不切割,直接單線程來執(zhí)行列?各位前前輩指點(diǎn)一下。多謝!
    發(fā)表于 05-08 06:11

    在Verilog中實(shí)現(xiàn)Moore型和Mealy型狀態(tài)機(jī)的方法簡(jiǎn)析

    編寫能夠被綜合工具識(shí)別的狀態(tài)機(jī),首先需要理解狀態(tài)機(jī)的基本概念和分類。狀態(tài)機(jī)(FSM)是表示有限個(gè)狀態(tài)以及在這些
    的頭像 發(fā)表于 05-01 11:38 ?1580次閱讀

    嵌入式編程,如何用 C 語言實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì)?

    狀態(tài)機(jī)模式是一種行為模式,通過多態(tài)實(shí)現(xiàn)不同狀態(tài)的調(diào)轉(zhuǎn)行為的確是一種很好的方法,只可惜在嵌入式環(huán)境下,有時(shí)只能寫純C代碼,并且還需要考慮代碼的重入和多任務(wù)請(qǐng)求跳轉(zhuǎn)等情形,因此實(shí)現(xiàn)起來著實(shí)
    發(fā)表于 04-23 11:00

    求助LabVIEW,狀態(tài)機(jī)里面反饋節(jié)點(diǎn)如何初始化問題

    求助labview,狀態(tài)機(jī)里面反饋節(jié)點(diǎn)如何初始化,下次執(zhí)行這個(gè)狀態(tài)的時(shí)候初始化一次!謝謝謝謝!
    發(fā)表于 03-25 18:17

    如何采用“狀態(tài)機(jī)”解析UART數(shù)據(jù)幀

    如果一個(gè)系統(tǒng)接收上述“不定長度”的協(xié)議幀,將會(huì)有一個(gè)挑戰(zhàn)--如何高效接收與解析。 為簡(jiǎn)化系統(tǒng)設(shè)計(jì),我們強(qiáng)烈建議您采用“狀態(tài)機(jī)”來解析UART數(shù)據(jù)幀。
    的頭像 發(fā)表于 03-25 14:29 ?681次閱讀
    如何采用“<b class='flag-5'>狀態(tài)機(jī)</b>”解析UART數(shù)據(jù)幀

    請(qǐng)問GPIF狀態(tài)機(jī)的內(nèi)部信號(hào)需要延遲才能斷言嗎?

    dma_wm_thn 這樣的過渡觸發(fā)器需要一些周期的延遲才能斷言嗎? 在我的實(shí)踐中,DMA_WM_THN 觸發(fā)器似乎有 1 個(gè)時(shí)鐘周期延遲: ? 圖像是我的狀態(tài)機(jī)的一部分,數(shù)據(jù)總線是 32 位
    發(fā)表于 02-23 07:43

    什么是有限狀態(tài)機(jī)?如何解決傳統(tǒng)有限狀態(tài)機(jī)狀態(tài)爆炸」問題?

    有限狀態(tài)機(jī)(Finite State Machine,簡(jiǎn)稱FSM)是一種用來進(jìn)行對(duì)象行為建模的工具,其作用主要是描述對(duì)象在它的生命周期內(nèi)所經(jīng)歷的狀態(tài)序列以及如何響應(yīng)來自外界的各種事件。
    的頭像 發(fā)表于 02-17 16:09 ?6220次閱讀
    什么是<b class='flag-5'>有限狀態(tài)機(jī)</b>?如何解決傳統(tǒng)<b class='flag-5'>有限狀態(tài)機(jī)</b>「<b class='flag-5'>狀態(tài)</b>爆炸」問題?

    Verilog狀態(tài)機(jī)+設(shè)計(jì)實(shí)例

    的是有限狀態(tài)機(jī)(Finite-State Machine,F(xiàn)SM),簡(jiǎn)稱為狀態(tài)機(jī),表示在有限個(gè)狀態(tài)以及這些狀態(tài)
    的頭像 發(fā)表于 02-12 19:07 ?4059次閱讀
    Verilog<b class='flag-5'>狀態(tài)機(jī)</b>+設(shè)計(jì)實(shí)例

    狀態(tài)機(jī)該怎么監(jiān)控

    狀態(tài)機(jī)卡住的場(chǎng)景——通過狀態(tài)跳轉(zhuǎn)條件的DFX信號(hào)去判斷卡住的原因
    的頭像 發(fā)表于 01-15 10:03 ?416次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>該怎么監(jiān)控

    Spring狀態(tài)機(jī)實(shí)現(xiàn)原理和使用方法

    說起 Spring 狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒錯(cuò),Spring 狀態(tài)機(jī)就是狀態(tài)模式的一種
    的頭像 發(fā)表于 12-26 09:39 ?1977次閱讀
    Spring<b class='flag-5'>狀態(tài)機(jī)</b>的<b class='flag-5'>實(shí)現(xiàn)</b>原理和使用方法
    主站蜘蛛池模板: 最新亚洲一区二区三区四区| 手机在线亚洲日韩国产| 国产午夜精品不卡视频| 511麻豆视传媒精品AV| 午夜福利体验免费体验区| 快播免费电影| 国精产品砖一区二区三区糖心| adc我们的永久网址| 伊人久久久久久久久香港| 十分钟免费观看大全视频| 伦理片在线3348| 国产色偷偷男人的天堂| 把极品白丝班长啪到腿软| 永久免费精品精品永久-夜色| 午夜国产精品视频在线| 欧美精品v欧洲高清| 久久这里只精品热在线18| 国产在线视精品在亚洲| 国产AV亚洲精品久久久久软件| 97在线视频网站| 伊人草久久| 亚洲精品喷白浆在线观看| 偷拍亚洲色自拍| 日本亚洲精品无码区国产电影| 柠檬福利精品视频导航| 久草国产在线播放| 果冻传媒在线观看网站| 国产欧洲野花A级| 国产精品婷婷五月久久久久| 动漫美女禁区| 国产AV精品一区二区三区漫画| jealousvue成熟40岁| 99热久久这里只有精品| 98久久人妻无码精品系列蜜桃| 伊人久久精品AV无码一区| 伊人网综合在线观看| 在线播放日韩欧美亚洲日本| 一本大道香蕉中文在线视频观看| 亚洲成av人影院| 亚洲精品国偷拍电影自产在线| 亚洲 欧美 国产 综合不卡|