久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

【成都網站設計】擁抱變化—— 可擴展性雜談

2022-07-22    分類: 網站建設

成都網站設計】擁抱變化—— 可擴展性雜談

作為軟件開發人員最擔心的就是變化,因為一旦變化,意味著自己的開發任務加重, 輕則修改代碼,重則修改框架,如果不用做任何修改,則皆大歡喜,現實告訴我們,這是小概率事件,但比買彩票中大獎的概率還是大很多。于是各種討論開始,開發人員開始講述修改如何的大,進度如何緊張,架構師也在一旁不停的嘮叨這個修改點的重要性,以及對整個系統帶來的好處。

在業界曾經有一句很經典的話:“在軟件開發領域中,的不變就是變化” 。一旦變化,就有人遭殃,不是開發人員,就是設計師或架構師。無論誰遭殃,都不得不擁抱變化。

擁抱變化是極限編程(eXtreme Programming)里面一個非常重要的概念,代表了敏捷陣營對于變化的一種態度,那就是不拒絕,而且還主動求變。本文不想探討敏捷方面的知識,如何去擁抱變化,而是想要探討程序的可擴展性,如何在編碼過程中,以最小的代價來應對程序未來的變化。

關于可擴展性, 其本身就是一個多方面的概念集合。有人說程序的可擴展性必須建立在對未來需求的準確把握上,也有人說程序的可擴展性必須建立在能夠對需求變化快速響應上。不論熟是熟非,其最終目的都是要求,能在需求發生變化的時候以最小的代價去應付變化。

可以從兩個緯度對可擴展性進行討論,一是設計可擴展性,二是編碼可擴展性,前者從宏觀上考慮,后者從微觀上考慮,當然編碼也是一種設計活動。本文重點論述編碼的可擴展性,對于設計可擴展性,是一個系統性工程,由于作者還沒有達到那個高度和境界,所以不敢瞎寫,本文基本上不做介紹。

《UNIX 編程藝術》一書中有一條關于擴展原則的描述:設計要著眼于未來,未來總比預想快。 關于設計可擴展性, 對于系統架構師或者系統工程師不僅僅要考慮在實現用戶需求的基礎上如何構建系統,還要考慮計算資源的可擴展、應用規模的可擴展,以及對技術換代的可擴展和性能等。

近期發生的干旱和水災,每次都能找到人為的因素。本文開頭提到的場景,如果進行代碼回溯,也能找到一些人為的因素。如果當時的編碼者在寫代碼時充分考慮了代碼可擴展性,在一定條件下,可以達到用最小的代價去應對變化。如果當時只是為了完成任務,交差,后續的維護者可能面對的不是擁抱變化,而是擁抱痛苦!

場景一:在某嵌入式電信級設備整框分布式環境中,有NEMI板(管理板),SWF板(業務板),STU板(業務板)和LC板(業務板),每塊板上都有CPU,運行著各自的程序。目前的架構僅僅對NEMI/SWF/STU板支持了HA(High Available)功能,在SWF卡上運行的某個業務,需要關注SWF卡的主備倒換事件。 運行在SWF卡上的程序可以收到來自NEMI和SWF卡的主備倒換事件,于是進行了如下編碼:

view plaincopy to clipboardprint?01.void processSwitchEvent(GenMsg *pMsg)  02.{  03.   一些合法性判斷語句  04.   if(NEMI_SWITCH_EVENT == pMsg->getSwitchEventGrp())  05.   {  06.       MSG_INFO(“Received NEMI Switch Event……”);  07.       return ;  08.   }  09.   //process SWF Switch Event  10.   業務處理代碼  11.} void processSwitchEvent(GenMsg *pMsg)
{
一些合法性判斷語句
if(NEMI_SWITCH_EVENT == pMsg->getSwitchEventGrp())
{
MSG_INFO(“Received NEMI Switch Event……”);
return ;
}
//process SWF Switch Event
業務處理代碼
}

可能開發人員在進行if條件語句編碼時,可能還考慮了另外一種寫法:

view plaincopy to clipboardprint?
01.void processSwitchEvent(GenMsg *pMsg)
02.{
03.   一些合法性判斷語句
04.   if(SWF_SWITCH_EVENT == pMsg->getSwitchEventGrp())
05.   {
06.       MSG_INFO(“Received SWF Switch Event……”);
07.       業務處理代碼
08.   }
09.}
void processSwitchEvent(GenMsg *pMsg)
{
一些合法性判斷語句
if(SWF_SWITCH_EVENT == pMsg->getSwitchEventGrp())
{
MSG_INFO(“Received SWF Switch Event……”);
業務處理代碼
}
}

在最初的需求中,上下兩種寫法都是合適的,但是不是都合理呢?如果一旦需求發生變更,SWF卡上的另外一個業務需要關注STU板的倒換事件,那么STU板的倒換事件也會被廣播到SWF卡上,最糟糕的是,這兩個業務都訂閱了倒換事件(通過消息里面的內容來判斷是哪塊板發生了倒換),那么上下兩種寫法的區別就體現出來了,一個能正確運行,而另外一個會把STU的倒換事件當作SWF的倒換事件。不難看出,下面一種寫法更具有可擴展性,達到了以最小的代價去應對變化。正是這樣小的修改,往往會被忽略,隱藏一個很深的bug,導致花大量的時間去定位。

對于上述的場景,大家編碼時常會碰到,覺得這樣寫也合適,那樣寫也合適。雖然在一定條件下都很合適,但不一定都合理,那么此時就需要從其他方面加以考慮,如可擴展性,可維護性,可測試性等方面,從而確定哪種寫法更合理。

場景二:假定存在如下一個消息類,最初類中只有一個成員變量,消息類的定義和實現如下:

view plaincopy to clipboardprint?
01.class FsmFileTransferRequest : public GenMsgHdr
02.{
03.   public:
04.       FsmFileTransferRequest (void)
05.       {
06.           memset (&mFileTransferReq, 0, sizeof(mFileTransferReq));
07.           setMsgType (MTYPE_REQUEST);
08.           setMsgTypeQual (MQUAL_FSM_FILE_TRANSFER_REQUEST);
09.           setPayloadLen (sizeof(mFileTransferReq));
10.       }
11.
12.       // get/set operation
13.       ……
14.   private:
15.       SysPkg::FileTransferRequest   mFileTransferReq;
16.};
class FsmFileTransferRequest : public GenMsgHdr
{
public:
FsmFileTransferRequest (void)
{
memset (&mFileTransferReq, 0, sizeof(mFileTransferReq));
setMsgType (MTYPE_REQUEST);
setMsgTypeQual (MQUAL_FSM_FILE_TRANSFER_REQUEST);
setPayloadLen (sizeof(mFileTransferReq));
}

// get/set operation
……
private:
SysPkg::FileTransferRequest   mFileTransferReq;
};

對于該消息長度,基類提供了兩種接口,一個接口是 setPayloadLen (),另外一個接口是 setMsgLen (),該接口是更高一級的封裝,為所傳入參數減去基類消息的長度,最終結果還是消息的凈荷長度。也許有人會說,基類就不應該提供兩套函數,讓人迷惑,出錯在所難免。

由于場景變化或者需求變更,需要在該類中添加其他的成員變量,維護者可能是這個系統中的另外一個模塊的開發者(自己所負責的模塊中,構造函數里都是用消息總長度函數,默認其他開發者跟他一樣),添加了成員變量和實現后,忘記修改消息的凈荷長度,編譯并運行,結果與預想的大相徑庭,于是開始不停的打斷點調試,不斷的在懷疑消息是不是丟了,或者沒有用修改的代碼進行編譯,總之,一切該懷疑的都在腦海中閃現了一遍。

或者,意識到要修改消息凈荷長度,于是修改成:

view plaincopy to clipboardprint?
01.setPayloadLen (sizeof(mFileTransferReq)+sizeof(mSuccessfulFlag));
setPayloadLen (sizeof(mFileTransferReq)+sizeof(mSuccessfulFlag));

如果只是一兩個成員變量,還能忍受。需求一再變更,又增加了幾個成員變量,繼續修改,setPayloadLen()里面的代碼會越來越長,只是代碼寫的難看而已。

如果類的實現者,在編寫代碼時,考慮一下可擴展性,采用消息的總長度函數,那么不論怎么添加成員變量,都不用修改消息長度,一勞永逸。如果確認這個消息不會被擴展,采用 setPayloadLen()也是合理的。

通過以上兩個例子可以發現,如果在編碼時,充分考慮了編碼可擴展性,即使需求發生變更,有時也可以達到事半功倍的效果。關鍵問題是如何識別出這樣的場景,這個只能靠經驗了,沒有捷徑可走!

本文標題:【成都網站設計】擁抱變化—— 可擴展性雜談
網頁URL:http://www.js-pz168.com/news29/181479.html

成都網站建設公司_創新互聯,為您提供企業建站網站收錄搜索引擎優化移動網站建設做網站網站策劃

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
91精品国产综合久久香蕉麻豆| 国产精品免费久久| 日韩伦理免费电影| 蜜桃在线一区二区三区| 99视频在线精品| 五月天国产一区| 日韩免费看网站| 亚洲一区二区三区爽爽爽爽爽| 国产乱人伦精品一区二区在线观看| 成人在线观看av| 最新精品视频| 国产欧美一区二区三区网站| 日产国产高清一区二区三区| 91在线porny国产在线看| 亚洲三级一区| 99久久99久久精品免费看蜜桃| 亚洲福利av| 久久久久久久久久久黄色| 图片区小说区区亚洲影院| 99视频精品在线| 日本乱人伦aⅴ精品| 国产欧美日韩在线看| 美国十次综合导航| 精品无码久久久久久久动漫| 5月丁香婷婷综合| 亚洲综合一二三区| 99综合电影在线视频| 在线日韩av永久免费观看| 国产日韩精品一区| 国产一区中文字幕| 蜜桃91精品入口| 欧美成人a∨高清免费观看| 五月天婷婷综合| 国产激情一区二区三区在线观看| 欧美视频自拍偷拍| 亚洲精品欧美专区| 99国产精品久| 欧美性淫爽ww久久久久无| 亚洲视频电影在线| 成人av动漫网站| 日本精品视频一区二区三区| 国产精品久久精品日日| 国产成人精品综合在线观看| 一区二区不卡在线| 国产精品麻豆久久久| 国产91精品精华液一区二区三区| 亚洲制服中文| 综合色天天鬼久久鬼色| 成人涩涩免费视频| 欧美性猛片xxxx免费看久爱| 伊人性伊人情综合网| 99电影在线观看| 日韩一区二区三区高清免费看看| 日韩影视精彩在线| 欧美日韩精品免费看| 久久久国产一区二区三区四区小说| 精品综合免费视频观看| 色综合久久88色综合天天提莫| 欧美极品少妇xxxxⅹ高跟鞋 | eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 国产伦精品一区二区三区视频青涩 | 久草热8精品视频在线观看| 奇米精品在线| 国产精品美女视频| 99久久精品国产精品久久| 欧美日韩第一区日日骚| 天天av天天翘天天综合网色鬼国产| 国产精品一区在线播放| 久久综合九色欧美综合狠狠| 国产在线不卡一卡二卡三卡四卡| 色综合欧美在线视频区| 亚洲一区av在线| 亚洲福利一区二区| 国产日韩精品久久| 久久久不卡网国产精品一区| 春色校园综合激情亚洲| 欧美精品丝袜中出| 久久电影国产免费久久电影 | 制服丝袜激情欧洲亚洲| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日本一区二区三区四区在线观看| 国产精品区一区二区三区| 91小视频在线| 亚洲精品在线观| 成人av免费网站| 日韩久久精品一区| 丁香婷婷综合色啪| 日韩一区二区三区精品视频| 国产一区二区三区久久久| 欧美日韩一二区| 久久机这里只有精品| 欧美无乱码久久久免费午夜一区 | 亚洲日本丝袜连裤袜办公室| 国产一区二区精品免费| 欧美国产成人精品| 国产99在线免费| 欧美激情综合五月色丁香小说| 91视频观看视频| 久久精品一区二区三区av| 91久久久一线二线三线品牌| 久久久久国产精品人| 91免费版pro下载短视频| 久久久美女艺术照精彩视频福利播放| 波多野结衣中文字幕一区二区三区| 日韩精品中午字幕| www.日韩av| 国产亚洲制服色| 国产精品久久久久久久久久久久午夜片 | 日韩欧美精品在线不卡| 亚洲福利一二三区| 在线视频不卡一区二区| 免费成人在线视频观看| 欧美专区在线观看一区| 精品一区二区三区香蕉蜜桃| 欧美精品在线观看一区二区| 国产在线国偷精品免费看| 欧美一区二区视频观看视频| 成人app网站| 久久久www成人免费无遮挡大片| av一区二区三区四区电影| 国产精品日产欧美久久久久| 精品九九九九| 亚洲一区二区中文在线| 亚洲一区二区三区免费看| 蜜桃久久av一区| 4438x成人网最大色成网站| 成人在线视频一区二区| 国产日韩欧美a| 免费99视频| 日韩激情一区二区| 欧美军同video69gay| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美日韩成人在线| 成人高清av在线| 国产精品久久久久久久久免费樱桃| 欧美日韩一区综合| 日韩一区精品视频| 777午夜精品免费视频| 不卡视频一二三四| 国产精品久久久久精k8| 性欧美videosex高清少妇| 久久er99热精品一区二区| 日韩欧美在线影院| 国产欧美欧洲| 天天做天天摸天天爽国产一区 | 国产亚洲成av人在线观看导航| 国产精品免费看一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 一道精品一区二区三区| 久久99国产精品免费| www激情久久| 欧美日产一区二区三区在线观看| 日本伊人色综合网| 精品免费国产二区三区| 久久精品日产第一区二区三区| 天天av天天翘天天综合网色鬼国产| 这里只有精品免费| 国产欧美日韩综合精品二区| 亚洲成a人片综合在线| 6080日韩午夜伦伦午夜伦| 国产成人精品福利一区二区三区| 亚洲一区二区在线视频| 3d动漫精品啪啪一区二区竹菊| 国产精品国产一区二区| 天天操天天综合网| 欧美不卡一区二区三区| 欧美不卡在线一区二区三区| 久久精品国产秦先生| 国产日韩av一区| 中文有码久久| av不卡一区二区三区| 亚洲一区二区3| 91精品国产乱| 美日韩免费视频| 国产一区二区三区av电影| 国产精品久久久久三级| 欧美性欧美巨大黑白大战| 成人av中文| 免费人成精品欧美精品| 国产日产欧美一区二区三区| 一本一本大道香蕉久在线精品| kk眼镜猥琐国模调教系列一区二区| 一区二区三区成人| 欧美一区二区三区不卡| 欧美性大战久久久久| 国产成人亚洲综合a∨猫咪| 亚洲免费av高清| 日韩一区二区三| 日韩尤物视频| 91丨九色丨蝌蚪丨老版| 日韩黄色小视频| 欧美韩国日本一区| 在线观看免费亚洲| 国产无套精品一区二区| 国内偷窥港台综合视频在线播放| 最新中文字幕一区二区三区| 91精品婷婷国产综合久久 | 不卡的av网站| 日韩 欧美一区二区三区| 欧美极品少妇xxxxⅹ高跟鞋|