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

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

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

優(yōu)化重復(fù)冗余代碼的8種方式

jf_ro2CN3Fa ? 來源:撿田螺的小男孩 ? 2023-09-11 09:47 ? 次閱讀

來源:撿田螺的小男孩

前言

日常開發(fā)中,我們經(jīng)常會(huì)遇到一些重復(fù)冗余的代碼 。大家都知道重復(fù)代碼不好 ,它主要有這些缺點(diǎn):可維護(hù)性差、可讀性差、增加錯(cuò)誤風(fēng)險(xiǎn) 等等。最近呢,我優(yōu)化了一些系統(tǒng)中的重復(fù)代碼,用了好幾種的方式,感覺挺有用的。所以本文給大家講講優(yōu)化重復(fù)冗余代碼的幾種方式~

抽取公用方法

抽個(gè)工具類

反射

泛型

繼承和多態(tài)

設(shè)計(jì)模式

函數(shù)式Lambda

AOP切面

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

1. 抽取公用方法

抽取公用方法 ,是最常用的代碼去重方式 ~

比如這個(gè)例子,分別遍歷names列表,然后各自轉(zhuǎn)化為大寫和小寫打印出來:

publicclassTianLuoExample{

publicstaticvoidmain(String[]args){
Listnames=Arrays.asList("Alice","Bob","Charlie","David","TianLuo");

System.out.println("UppercaseNames:");
for(Stringname:names){
StringuppercaseName=name.toUpperCase();
System.out.println(uppercaseName);
}

System.out.println("LowercaseNames:");
for(Stringname:names){
StringlowercaseName=name.toLowerCase();
System.out.println(lowercaseName);
}
}
}

顯然,都是遍歷names過程,代碼是重復(fù)冗余的,只不過轉(zhuǎn)化大小寫不一樣而已 。我們可以抽個(gè)公用方法 processNames,優(yōu)化成這樣:

publicclassTianLuoExample{

publicstaticvoidprocessNames(Listnames,FunctionnameProcessor,StringprocessType){
System.out.println(processType+"Names:");
for(Stringname:names){
StringprocessedName=nameProcessor.apply(name);
System.out.println(processedName);
}
}

publicstaticvoidmain(String[]args){
Listnames=Arrays.asList("Alice","Bob","Charlie","David","TianLuo");

processNames(names,String::toUpperCase,"Uppercase");
processNames(names,String::toLowerCase,"Lowercase");
}
}

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

2. 抽工具類

我們優(yōu)化重復(fù)代碼,抽一個(gè)公用方法后,如果發(fā)現(xiàn)這個(gè)方法有更多共性,就可以把公用方法升級(jí)為一個(gè)工具類 。比如這樣的業(yè)務(wù)場(chǎng)景:注冊(cè),修改郵箱,重置密碼等,都需要校驗(yàn)郵箱

實(shí)現(xiàn)注冊(cè)功能時(shí),用戶會(huì)填郵箱,需要驗(yàn)證郵箱格式

publicclassRegisterServiceImplimplementsRegisterService{
privatestaticfinalStringEMAIL_REGEX=
"^[A-Za-z0-9+_.-]+@(.+)$";

publicbooleanregisterUser(UserInfoRequserInfo){
Stringemail=userInfo.getEmail();
Patternpattern=Pattern.compile(EMAIL_REGEX);
MatcheremailMatcher=pattern.matcher(email);
if(!emailMatcher.matches()){
System.out.println("Invalidemailaddress.");
returnfalse;
}

//進(jìn)行其他用戶注冊(cè)邏輯,比如保存用戶信息到數(shù)據(jù)庫(kù)等
//返回注冊(cè)結(jié)果
returntrue;
}
}

密碼重置 流程中,通常會(huì)向用戶提供一個(gè)鏈接或驗(yàn)證碼,并且需要發(fā)送到用戶的電子郵件地址。在這種情況下,也需要驗(yàn)證郵箱格式合法性

publicclassPasswordServiceImplimplementsPasswordService{

privatestaticfinalStringEMAIL_REGEX=
"^[A-Za-z0-9+_.-]+@(.+)$";

publicvoidresetPassword(PasswordInfopasswordInfo){
Patternpattern=Pattern.compile(EMAIL_REGEX);
MatcheremailMatcher=pattern.matcher(passwordInfo.getEmail());
if(!emailMatcher.matches()){
System.out.println("Invalidemailaddress.");
returnfalse;
}
//發(fā)送通知修改密碼
sendReSetPasswordNotify();
}
}

我們可以抽取個(gè)校驗(yàn)郵箱的方法 出來,又因?yàn)樾r?yàn)郵箱的功能在不同的類中,因此,我們可以抽個(gè)校驗(yàn)郵箱的工具類

publicclassEmailValidatorUtil{
privatestaticfinalStringEMAIL_REGEX=
"^[A-Za-z0-9+_.-]+@(.+)$";

privatestaticfinalPatternpattern=Pattern.compile(EMAIL_REGEX);

publicstaticbooleanisValid(Stringemail){
Matchermatcher=pattern.matcher(email);
returnmatcher.matches();
}
}

//注冊(cè)的代碼可以簡(jiǎn)化為這樣啦
publicclassRegisterServiceImplimplementsRegisterService{

publicbooleanregisterUser(UserInfoRequserInfo){
if(!EmailValidatorUtil.isValid(userInfo.getEmail())){
System.out.println("Invalidemailaddress.");
returnfalse;
}

//進(jìn)行其他用戶注冊(cè)邏輯,比如保存用戶信息到數(shù)據(jù)庫(kù)等
//返回注冊(cè)結(jié)果
returntrue;
}
}

3. 反射

我們?nèi)粘i_發(fā)中,經(jīng)常需要進(jìn)行PO、DTO和VO的轉(zhuǎn)化。所以大家經(jīng)??吹筋愃频拇a:

//DTO轉(zhuǎn)VO
publicUserInfoVOconvert(UserInfoDTOuserInfoDTO){
UserInfoVOuserInfoVO=newUserInfoVO();
userInfoVO.setUserName(userInfoDTO.getUserName());
userInfoVO.setAge(userInfoDTO.getAge());
returnuserInfoVO;
}
//PO轉(zhuǎn)DTO
publicUserInfoDTOconvert(UserInfoPOuserInfoPO){
UserInfoDTOuserInfoDTO=newUserInfoDTO();
userInfoDTO.setUserName(userInfoPO.getUserName());
userInfoDTO.setAge(userInfoPO.getAge());
returnuserInfoDTO;
}

我們可以使用BeanUtils.copyProperties() 去除重復(fù)代碼 ,BeanUtils.copyProperties()底層就是使用了反射

publicUserInfoVOconvert(UserInfoDTOuserInfoDTO){
UserInfoVOuserInfoVO=newUserInfoVO();
BeanUtils.copyProperties(userInfoDTO,userInfoVO);
returnuserInfoVO;
}

publicUserInfoDTOconvert(UserInfoPOuserInfoPO){
UserInfoDTOuserInfoDTO=newUserInfoDTO();
BeanUtils.copyProperties(userInfoPO,userInfoDTO);
returnuserInfoDTO;
}

4.泛型

泛型是如何去除重復(fù)代碼的呢?給大家看個(gè)例子,我有個(gè)轉(zhuǎn)賬明細(xì)和轉(zhuǎn)賬余額 對(duì)比的業(yè)務(wù)需求,有兩個(gè)類似這樣的方法:

privatevoidgetAndUpdateBalanceResultMap(Stringkey,Map>compareResultListMap,
ListbalanceDTOs){
ListtempList=compareResultListMap.getOrDefault(key,newArrayList<>());
tempList.addAll(balanceDTOs);
compareResultListMap.put(key,tempList);
}

privatevoidgetAndUpdateDetailResultMap(Stringkey,Map>compareResultListMap,
ListdetailDTOS){
ListtempList=compareResultListMap.getOrDefault(key,newArrayList<>());
tempList.addAll(detailDTOS);
compareResultListMap.put(key,tempList);
}

這兩塊代碼,流程功能看著很像,但是就是不能直接合并抽取一個(gè)公用方法,因?yàn)轭愋筒灰恢?/strong> 。單純類型不一樣的話,我們可以結(jié)合泛型 處理,因?yàn)榉盒偷谋举|(zhì)就是參數(shù)化類型.優(yōu)化為這樣:

privatevoidgetAndUpdateResultMap(Stringkey,Map>compareResultListMap,ListaccountingDTOS){
ListtempList=compareResultListMap.getOrDefault(key,newArrayList<>());
tempList.addAll(accountingDTOS);
compareResultListMap.put(key,tempList);
}

5. 繼承與多態(tài)

假設(shè)你正在開發(fā)一個(gè)電子商務(wù)平臺(tái),需要處理不同類型的訂單 ,例如普通訂單和折扣訂單。每種訂單都有一些共同的屬性 (如訂單號(hào)、購(gòu)買商品列表)和方法(如計(jì)算總價(jià)、生成訂單報(bào)告),但折扣訂單還有特定的屬性和方法 。

在沒有使用繼承和多態(tài)的話,會(huì)寫出類似這樣的代碼:

//普通訂單
publicclassOrder{
privateStringorderNumber;
privateListproducts;

publicOrder(StringorderNumber,Listproducts){
this.orderNumber=orderNumber;
this.products=products;
}

publicdoublecalculateTotalPrice(){
doubletotal=0;
for(Productproduct:products){
total+=product.getPrice();
}
returntotal;
}

publicStringgenerateOrderReport(){
return"OrderReportfor"+orderNumber+":TotalPrice=$"+calculateTotalPrice();
}
}

//折扣訂單
publicclassDiscountOrder{
privateStringorderNumber;
privateListproducts;
privatedoublediscountPercentage;

publicDiscountOrder(StringorderNumber,Listproducts,doublediscountPercentage){
this.orderNumber=orderNumber;
this.products=products;
this.discountPercentage=discountPercentage;
}

publicdoublecalculateTotalPrice(){
doubletotal=0;
for(Productproduct:products){
total+=product.getPrice();
}
returntotal-(total*discountPercentage/100);
}
publicStringgenerateOrderReport(){
return"OrderReportfor"+orderNumber+":TotalPrice=$"+calculateTotalPrice();
}
}

顯然,看到在Order和DiscountOrder類中,generateOrderReport() 方法的代碼是完全相同的。calculateTotalPrice()則是有一點(diǎn)點(diǎn)區(qū)別,但也大相徑庭。

我們可以使用繼承和多態(tài)去除重復(fù)代碼,讓DiscountOrder去繼承Order,代碼如下:

publicclassOrder{
privateStringorderNumber;
privateListproducts;

publicOrder(StringorderNumber,Listproducts){
this.orderNumber=orderNumber;
this.products=products;
}

publicdoublecalculateTotalPrice(){
doubletotal=0;
for(Productproduct:products){
total+=product.getPrice();
}
returntotal;
}

publicStringgenerateOrderReport(){
return"OrderReportfor"+orderNumber+":TotalPrice=$"+calculateTotalPrice();
}
}

publicclassDiscountOrderextendsOrder{
privatedoublediscountPercentage;

publicDiscountOrder(StringorderNumber,Listproducts,doublediscountPercentage){
super(orderNumber,products);
this.discountPercentage=discountPercentage;
}

@Override
publicdoublecalculateTotalPrice(){
doubletotal=super.calculateTotalPrice();
returntotal-(total*discountPercentage/100);
}
}

6.使用設(shè)計(jì)模式

很多設(shè)計(jì)模式可以減少重復(fù)代碼、提高代碼的可讀性、可擴(kuò)展性 .比如:

工廠模式 : 通過工廠模式,你可以將對(duì)象的創(chuàng)建和使用分開,從而減少重復(fù)的創(chuàng)建代碼 。

策略模式 : 策略模式定義了一族算法,將它們封裝成獨(dú)立的類,并使它們可以互相替換。通過使用策略模式,你可以減少在代碼中重復(fù)使用相同的邏輯 。

模板方法模式 :模板方法模式定義了一個(gè)算法的骨架,將一些步驟延遲到子類中實(shí)現(xiàn)。這有助于避免在不同類中重復(fù)編寫相似的代碼 。

我給大家舉個(gè)例子,模板方法是如何去除重復(fù)代碼的吧 ,業(yè)務(wù)場(chǎng)景:

假設(shè)你正在開發(fā)一個(gè)咖啡和茶 的制作流程,制作過程中的熱水和添加物質(zhì)的步驟是相同的 ,但是具體的飲品制作步驟是不同的 。

如果沒有使用模板方法模式,實(shí)現(xiàn)是醬紫的:

publicclassCoffee{
publicvoidprepareCoffee(){
boilWater();
brewCoffeeGrinds();
pourInCup();
addCondiments();
}

privatevoidboilWater(){
System.out.println("Boilingwater");
}

privatevoidbrewCoffeeGrinds(){
System.out.println("Brewingcoffeegrinds");
}

privatevoidpourInCup(){
System.out.println("Pouringintocup");
}

privatevoidaddCondiments(){
System.out.println("Addingsugarandmilk");
}
}

publicclassTea{
publicvoidprepareTea(){
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}

privatevoidboilWater(){
System.out.println("Boilingwater");
}

privatevoidsteepTeaBag(){
System.out.println("Steepingtheteabag");
}

privatevoidpourInCup(){
System.out.println("Pouringintocup");
}

privatevoidaddLemon(){
System.out.println("Addinglemon");
}
}

這個(gè)代碼例子,我們可以發(fā)現(xiàn),燒水和倒入杯子的步驟代碼 ,在Coffee和Tea類中是重復(fù)的。

使用模板方法模式,代碼可以優(yōu)化成這樣:

abstractclassBeverage{
publicfinalvoidprepareBeverage(){
boilWater();
brew();
pourInCup();
addCondiments();
}

privatevoidboilWater(){
System.out.println("Boilingwater");
}

abstractvoidbrew();

privatevoidpourInCup(){
System.out.println("Pouringintocup");
}

abstractvoidaddCondiments();
}

classCoffeeextendsBeverage{
@Override
voidbrew(){
System.out.println("Brewingcoffeegrinds");
}

@Override
voidaddCondiments(){
System.out.println("Addingsugarandmilk");
}
}

classTeaextendsBeverage{
@Override
voidbrew(){
System.out.println("Steepingtheteabag");
}

@Override
voidaddCondiments(){
System.out.println("Addinglemon");
}
}

在這個(gè)例子中,我們創(chuàng)建了一個(gè)抽象類Beverage,其中定義了制作飲品的模板方法 prepareBeverage()。這個(gè)方法包含了燒水、倒入杯子 等共同的步驟,而將制作過程中的特定步驟 brew() 和 addCondiments() 延遲到子類中實(shí)現(xiàn)。這樣,我們避免了在每個(gè)具體的飲品類中重復(fù)編寫相同的燒水和倒入杯子的代碼 ,提高了代碼的可維護(hù)性和重用性。

7.自定義注解(或者說AOP面向切面)

使用 AOP框架可以在不同地方插入通用的邏輯,從而減少代碼重復(fù)。

業(yè)務(wù)場(chǎng)景:

假設(shè)你正在開發(fā)一個(gè)Web應(yīng)用程序,需要對(duì)不同的Controller方法進(jìn)行權(quán)限檢查。每個(gè)Controller方法都需要進(jìn)行類似的權(quán)限驗(yàn)證,但是重復(fù)的代碼會(huì)導(dǎo)致代碼的冗余和維護(hù)困難 。

publicclassMyController{
publicvoidviewData(){
if(!User.hasPermission("read")){
thrownewSecurityException("Insufficientpermissiontoaccessthisresource.");
}
//Methodimplementation
}

publicvoidmodifyData(){
if(!User.hasPermission("write")){
thrownewSecurityException("Insufficientpermissiontoaccessthisresource.");
}
//Methodimplementation
}
}

你可以看到在每個(gè)需要權(quán)限校驗(yàn)的方法中都需要重復(fù)編寫相同的權(quán)限校驗(yàn)邏輯 ,即出現(xiàn)了重復(fù)代碼 .我們使用自定義注解的方式 能夠?qū)?quán)限校驗(yàn)邏輯集中管理,通過切面來處理,消除重復(fù)代碼 .如下:

@Aspect
@Component
publicclassPermissionAspect{

@Before("@annotation(requiresPermission)")
publicvoidcheckPermission(RequiresPermissionrequiresPermission){
Stringpermission=requiresPermission.value();

if(!User.hasPermission(permission)){
thrownewSecurityException("Insufficientpermissiontoaccessthisresource.");
}
}
}

publicclassMyController{
@RequiresPermission("read")
publicvoidviewData(){
//Methodimplementation
}

@RequiresPermission("write")
publicvoidmodifyData(){
//Methodimplementation
}
}

就這樣,不管多少個(gè)Controller方法需要進(jìn)行權(quán)限檢查,你只需在方法上添加相應(yīng)的注解即可 。權(quán)限檢查的邏輯在切面中集中管理,避免了在每個(gè)Controller方法中重復(fù)編寫相同的權(quán)限驗(yàn)證代碼。這大大提高了代碼的可讀性、可維護(hù)性,并避免了代碼冗余。

8.函數(shù)式接口和Lambda表達(dá)式

業(yè)務(wù)場(chǎng)景:

假設(shè)你正在開發(fā)一個(gè)應(yīng)用程序,需要根據(jù)不同的條件來過濾一組數(shù)據(jù) 。每次過濾的邏輯都可能會(huì)有些微的不同,但基本的流程是相似的。

沒有使用函數(shù)式接口和Lambda表達(dá)式的情況:

publicclassDataFilter{
publicListfilterPositiveNumbers(Listnumbers){
Listresult=newArrayList<>();
for(Integernumber:numbers){
if(number>0){
result.add(number);
}
}
returnresult;
}

publicListfilterEvenNumbers(Listnumbers){
Listresult=newArrayList<>();
for(Integernumber:numbers){
if(number%2==0){
result.add(number);
}
}
returnresult;
}
}

在這個(gè)例子中,我們有兩個(gè)不同的方法來過濾一組數(shù)據(jù),但是基本的循環(huán)和條件判斷邏輯是重復(fù)的,我們可以使用使用函數(shù)式接口和Lambda表達(dá)式,去除重復(fù)代碼,如下:

publicclassDataFilter{
publicListfilterNumbers(Listnumbers,Predicatepredicate){
Listresult=newArrayList<>();
for(Integernumber:numbers){
if(predicate.test(number)){
result.add(number);
}
}
returnresult;
}
}

我們將過濾的核心邏輯抽象出來。該方法接受一個(gè) Predicate函數(shù)式接口作為參數(shù),以便根據(jù)不同的條件來過濾數(shù)據(jù)。然后,我們可以使用Lambda表達(dá)式來傳遞具體的條件,這樣最終也達(dá)到去除重復(fù)代碼的效果啦.

審核編輯:湯梓紅

聲明:本文內(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)注

    1

    文章

    111

    瀏覽量

    20216
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62618
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68612
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14343

原文標(biāo)題:優(yōu)化重復(fù)冗余代碼的8種方式!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式代碼優(yōu)化技巧

    最近工作中,我通過層層優(yōu)化重復(fù)代碼 ,最后抽出個(gè)通用模板.因此跟大家分享一下優(yōu)化以及思考的過程。我會(huì)先造一個(gè)相似的例子,然后一步步帶大家如何優(yōu)化
    發(fā)表于 09-11 11:43 ?526次閱讀
    嵌入式<b class='flag-5'>代碼</b><b class='flag-5'>優(yōu)化</b>技巧

    203 代碼優(yōu)化:“利用JS變量減少代碼冗余

    冗余編程語言代碼
    小凡
    發(fā)布于 :2022年08月29日 12:43:10

    冗余熱備份電源的設(shè)計(jì)

    在設(shè)計(jì)某高可靠性計(jì)算機(jī)系統(tǒng)時(shí),要求其配套電源采取冗余設(shè)計(jì)。一般來說,可以采取的方案有容量冗余、冗余冷備份方式、并聯(lián)均流的N+1備份方式、
    發(fā)表于 03-10 17:24

    UPS系統(tǒng)并機(jī)冗余運(yùn)行方式的選擇

    全部負(fù)載。三機(jī)并聯(lián)也是常用的一方式,比如對(duì)于60KVA的負(fù)載,可以考慮三臺(tái)30KVA 并聯(lián),即使一臺(tái)UPS 出現(xiàn)故障,另兩臺(tái)UPS 仍然可以承擔(dān)全部負(fù)載,此為N+1并聯(lián)冗余。并聯(lián)冗余
    發(fā)表于 11-25 17:12

    分享兩MOS冗余驅(qū)動(dòng)方案

    在電源和電機(jī)驅(qū)動(dòng)應(yīng)用中,功率MOS可以在不同的調(diào)制方式下,實(shí)現(xiàn)相應(yīng)的能量轉(zhuǎn)換功能。單個(gè)MOS驅(qū)動(dòng)的結(jié)構(gòu)如圖1所示,通過MCU的 PWM模塊調(diào)整占空比,控制功率MOS的通斷,達(dá)到相應(yīng)的功能。另外,在
    發(fā)表于 11-04 06:51

    什么是冗余

    什么是冗余              冗余重復(fù)配置系統(tǒng)的一些部件,當(dāng)系統(tǒng)發(fā)生故障時(shí),冗余
    發(fā)表于 12-21 11:37 ?1758次閱讀

    電源系統(tǒng)冗余性研究

         冗余就是重復(fù)的意思,在計(jì)算機(jī)術(shù)語中,冗余是為減少計(jì)算機(jī)系統(tǒng)或通信系統(tǒng)的故障概率,而對(duì)電路或信息的有意重復(fù)或部分
    發(fā)表于 08-26 09:39 ?1071次閱讀

    語義規(guī)則為指導(dǎo)的增量優(yōu)化方法

    大數(shù)據(jù)蘊(yùn)含著巨大的價(jià)值.分析類查詢是獲取數(shù)據(jù)價(jià)值的一重要手段.為及時(shí)把握分析結(jié)果的變化。查詢需要周期性地重復(fù).為此,將不可避免地引入對(duì)舊數(shù)據(jù)的重復(fù)分析.目前,以重用歷史數(shù)據(jù)的中間結(jié)果、優(yōu)化
    發(fā)表于 12-27 11:24 ?0次下載
    一<b class='flag-5'>種</b>語義規(guī)則為指導(dǎo)的增量<b class='flag-5'>優(yōu)化</b>方法

    支持實(shí)時(shí)替換的混合冗余策略優(yōu)化

    在需要長(zhǎng)時(shí)間可靠運(yùn)行的軟件系統(tǒng)中,由于持續(xù)運(yùn)行時(shí)間和任務(wù)響應(yīng)速度的要求增加,工作組件在被探測(cè)到失效后將被冗余組件實(shí)時(shí)替換.但現(xiàn)有可靠性優(yōu)化研究通常假設(shè)冷備份冗余在所有積極冗余組件失效后
    發(fā)表于 01-02 15:55 ?0次下載
    支持實(shí)時(shí)替換的混合<b class='flag-5'>冗余</b>策略<b class='flag-5'>優(yōu)化</b>

    新版IAR調(diào)試查看寄存器問題 STM8代碼大小優(yōu)化問題

    新版IAR調(diào)試查看寄存器問題、STM8代碼大小優(yōu)化問題
    的頭像 發(fā)表于 03-07 16:13 ?4031次閱讀

    怎么優(yōu)化冗余基帶板調(diào)配?資料下載

    電子發(fā)燒友網(wǎng)為你提供怎么優(yōu)化冗余基帶板調(diào)配?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-26 08:53 ?25次下載
    怎么<b class='flag-5'>優(yōu)化</b><b class='flag-5'>冗余</b>基帶板調(diào)配?資料下載

    自學(xué)單片機(jī)編程(四)流水燈代碼優(yōu)化

    對(duì)于自學(xué)單片機(jī)編程(三)中的流水燈代碼,有很多不足之處,因?yàn)樵?b class='flag-5'>代碼中有大量重復(fù)代碼,這些代碼,不利于程序的修改,于是我們就用一個(gè)大循環(huán)將這
    發(fā)表于 11-20 11:21 ?10次下載
    自學(xué)單片機(jī)編程(四)流水燈<b class='flag-5'>代碼</b><b class='flag-5'>優(yōu)化</b>

    MOS冗余驅(qū)動(dòng)方案

    MOS冗余驅(qū)動(dòng)方案
    發(fā)表于 10-28 12:00 ?2次下載
    兩<b class='flag-5'>種</b>MOS<b class='flag-5'>冗余</b>驅(qū)動(dòng)方案

    交換機(jī)冗余的連接方式

    交換機(jī)冗余的連接方式? 交換機(jī)的冗余連接方式是網(wǎng)絡(luò)中常用的一設(shè)計(jì)方法,用于保證網(wǎng)絡(luò)的可靠性和高可用性。下面詳細(xì)介紹幾種常見的交換機(jī)
    的頭像 發(fā)表于 02-20 14:25 ?2430次閱讀

    PLC冗余系統(tǒng)的配置方式和工作原理

    在現(xiàn)代工業(yè)自動(dòng)化控制系統(tǒng)中,可編程邏輯控制器(PLC)的應(yīng)用已經(jīng)變得非常普遍。為了保障生產(chǎn)過程的連續(xù)性和系統(tǒng)的穩(wěn)定性,PLC冗余系統(tǒng)作為一重要的技術(shù)手段,得到了廣泛的關(guān)注和應(yīng)用。本文將對(duì)PLC冗余系統(tǒng)的配置
    的頭像 發(fā)表于 06-19 10:42 ?2711次閱讀