防禦式編程
㈠ 小白准備轉行學習前端,有大神可以提一些建議嗎
學習是以興趣為前提的,你要對你所要學的內容產生興趣,這樣你才會花心思去學習。這和是不是小白沒關系的,對於小白而言,在學習過程中就需要更努力,多花時間和心思沒有什麼是學不會的。
自學方法:
1、作為一個初學者,你必須明確系統的學習方案,我建議一定有一個指導的人,全靠自己學,放棄的幾率非常大,在你對於web前端還沒有任何概念的時候,需要一個人領進門,之後就都靠自己鑽研,第一步就是確定web前端都需要哪些內容,並且在多少時間內學完,建議時間6個月保底。
2、視頻為主,書為輔。很多初學者在學習前端的時候非常喜歡去買書,但是最後的結果是什麼?看來看去什麼都不會寫,所以在這里給大家提醒,書可以看,但是是在建立於你已經對於某個知識點有了具體操作的執行後,在用書去鞏固概念,這樣更加利於你對於知識的理解。
3、對於學習技術來講,掌握一個學習方法是非常重要的,其實對於學習web前端來講,學習方法確實很多都是相通的,一旦學習方法不對,可能就會造成「方法不對,努力白費」。其實關於這方面還是很多的,我就簡單說個例子,有的人邊聽課邊跟著敲代碼,這樣就不對,聽課的時候就專心聽,做題的時候就專心做題,這都是過來人的經驗,一定要聽。根據每個人的不同,可能學習方法也會有所出路,找到適合你自己的學習法方法是學習的前提。
4、不建議自己一個人瞎學,在我了解學習編程的這些人來看,從零基礎開始學並且最後成功做這份工作的其實並沒有幾個,我覺得大部分原因就是因為他們都不了解web前端是干什麼的,學什麼的,就盲目的買書看,到處找視頻看,最後看著看著就放棄了,所以我建議初學者在沒有具體概念之前,還是找有經驗的人請教一下,聊過之後你就會知道web前端具體是干什麼的,該怎麼學,這是我個人的小建議,可以不採納。
自學路線:
第1階段:前端頁面重構(4周)
內容包含了:(PC端網站布局項目、HTML5+CSS3基礎項目、WebApp頁面布局項目)
第2階段:JavaScript高級程序設計(5周)
內容包含:(原生JavaScript交互功能開發項目、面向對象進階與ES5/ES6應用項目、JavaScript工具庫自主研發項目)
第3階段:PC端全棧項目開發(3周)
內容包含:(jQuery經典交互特效開發、HTTP協議、Ajax進階與PHP/JAVA開發項目、前端工程化與模塊化應用項目、PC端網站開發項目、PC端管理信息系統前端開發項目)
第4階段:移動端項目開發(6周)
內容包含:(Touch端項目、微信場景項目、應用Angular+Ionic開發WebApp項目、應用Vue.js開發WebApp項目、應用React.js開發WebApp項目)
第5階段:混合(Hybrid,ReactNative)開發(1周)
內容包含:(微信小程序開發、ReactNative、各類混合應用開發)
第6階段:NodeJS全棧開發(1周)
內容包括:(WebApp後端系統開發、一、NodeJS基礎與NodeJS核心模塊二、Express三、noSQL資料庫)
視頻教程:
網頁鏈接
網頁鏈接
如果你對於學習前端有任何不懂的可以隨時來問我,如果沒有比較好的教程,也可以問我要。
㈡ 防禦性編程C語言代碼
#include<assert.h>char* strcpy(char* strDest, char* strSource)
{
int size1,size2;
size1=strlen(strDest);//也可用while判斷到'\0',size1++;
size2=strlen(strSource);//同上
assert((strDest != NULL) && (strSource != NULL)&& (size1>=size2)); // 防禦主要在於使用斷言,必須都是非空指針,而且Dest長度大於等於Source的長度才能繼續執行函數
byte *pbTo = (byte *) strDest; // 防止改變strDest 的地址
byte *pbFrom = (byte *) strSource; // 防止改變strSource 的地址
while(size1-- > 0 )
*pbTo ++ = *pbFrom ++ ;
*pbTo='\0';
return strDest;
}
㈢ assert.h 是什麼的頭文件
assert.h常用於防禦式編程。斷言(Assertions),一個斷言通常是一個常式(routines)或者一個宏(marcos)。每個斷言通常含有兩個參數:一個布爾表示式(a boolean expression)和一個消息(a message)。
assert.hassert.h常用於防禦式編程。
[1]斷言(Assertions)
一個斷言通常是一個常式(routines)或者一個宏(marcos)。每個斷言通常含有兩個參數:一個布爾表示式(a boolean expression)和一個消息(a message)。一個布爾表達式的反面表示了一個錯誤。C 標准庫提供了一個 assert 宏,它只帶有一個參數,用法如下:
assert(1 == 0); // 注意 boolean expression 不要加引號
使用 assert 宏,需要包含頭文件 cassert 或者 assert.h,執行上面語句的結果是程序終止運行,輸出與下面消息類似的消息:
Assertion failed: 1 == 0, file d:\我的文檔\visual studio projects\learning\assert\assert.cpp, line 9
通常來說,我們會定義自己的 assert 宏,其目的有兩個:
(1)新增參數,例如新增一個消息參數,使得 assert 宏輸出更為豐富的信息。
(2)改變 assert 的行為內容。C 標准庫中的 assert 宏將中斷程序,實際上,我們可以讓程序繼續運行而不中斷或者進入調試狀態等,另外還可以控制消息輸出的目標,即控制消息是輸出到控制台還是文本文件,甚至是通過網路發出。
下面是一個 C++ 實現的斷言:
#ifdef _DEBUG
#define Assert(exp, message) \
{ \
if (!(exp)) \
{ \
std::cout << "Assertion failed: " << #exp << "\n" \
<< "Message: " << message << "\n" \
<< "line: " << __LINE__ << "\n" \
<< "file: " << __FILE__ << "\n"; \
exit(EXIT_FAILURE); \
} \
}
#else
#define Assert(exp, message)
#endif
執行 Assert(1 == 0, "Error"); 結果為:
Assertion failed: 1 == 0
Message: Error
line: 24
file: d:\我的文檔\visual studio projects\learning\assert\assert.cpp
使用帆鋒神斷言應該注意一下的幾個問題:
1)對非預期錯誤使用斷言
斷言中的布爾表達式的反面一定要描述一個非預期錯誤,下面所述的在一定情況下為非預期錯誤的一些例子:
(1)空指針。
(2)輸入或者輸出參數的值不在預期范圍內。
(3)數組的越界。
非預期錯誤對應的就是預期錯誤,我們通常使用錯誤處理代碼來處理預期錯誤,而使用斷言處理非預期錯誤。在代碼執行過程中,有些錯誤永遠不應該發生,這樣的錯誤是非預期錯誤。斷言可以被看成是一種可態虧執行的注釋,你不能依賴它來讓代碼正常工作。例如:在
int nRes = f(); // nRes 由 f 函數控制, f 函數保證返回值一定在 -100 ~ 100
Assert(-100 <= nRes && nRes <= 100); // 斷言,一個可執行的注釋
由於 f 函數保證了返回值處於 -100 ~ 100,那麼如果出現了 nRes 不在這個范圍的值時,就表明一個非預期錯誤的出現。後面會講到「隔欄」,那時會對斷言有更加深刻的理解。
2)不要把需要執行的代碼放入斷言中
斷言用於軟體的開發和維護,而通常不在發行版本中包含斷言。
需要執行的代碼放入斷言中是不正確的,因為在發行版本中,這些代碼通常不會被執行,例如:
基凳Assert(f()); // f 函數通常在發行版本中不會被執行
而使用如下方法則比較安全:
res = f();
Assert(res); // 安全
3)對來源於內部系統的可靠的數據使用斷言,而不要對外部不可靠的數據使用斷言,對於外部不可靠數據,應該使用錯誤處理代碼。再次強調,把斷言看成可執行的注釋。
前條件(preconditions)和後條件(postconditions)
前條件是調用方代碼在調用常式(routines)或者實例化對象之前要確保為真的條件,後條件是常式執行後或者類實例化後應滿足的條件。下面是一個例子:
// 前條件,這里 nNum1 和 nNum2 的取值被前面代碼所約束並保證取值在 -50 ~ 50
Assert(-50 <= nNum1 && nNum1 <= 50, "Add_nNum1");
Assert(-50 <= nNum2 && nNum2 <= 50, "Add_nNum2");
int nRes = add(nNum1, nNum2);
// 後條件
Assert(-100 <= nRes && nRes <= 100, "Add_nRes");
注意,由於 nNum1 和 nNum2 取值范圍已經被約束,因此可以使用斷言,但是如果 nNum1 和 nNum2 的值來源於不可靠的外部系統,那麼應該使用錯誤處理代碼,而不是使用斷言。