[熱門文章] 程式設計、重構、與其它任何東西的終極問答
"The Ultimate Question of Programming, Refactoring, and Everything"
網頁版: http://goo.gl/6jIcIp
PDF 版: https://yadi.sk/i/pBZqebxsr5Wyg
#Craftmanships #SoftwareEngineering #CPP #Refactoring #ProgrammingSkills
好的!遲交比不交好,今天的推薦文來了(笑)~
今天介紹這篇,是過去一個禮拜在國外鄉民聚集地 Reddit 程式設計版瘋傳的文章。標題很臭屁「The Ultimate Question of Programming, Refactoring, and Everything」(沒錯!我就在意它最後一個字 "Everything"。咬我啊! XD)。因為轉載的人實在太多,讓我不禁努力地把它看完了。
其實這篇文章講的是 C/C++ 程式寫作者應該注意、或建議遵守的 42 個小訣竅。既不「Ultimate(終極)」,也不是涵蓋「Everthing」。不過裡面還是有不少中肯的建議,所以我還是將它介紹給大家。
為了讓英文苦手的朋友也能稍微感受一下這篇文章在講什麼,所以我不負責任地快速翻譯了每個標題一下。如果對哪個主題有興趣的,就麻煩大家直接對照標題號碼去看原文解說。原文有些標題用「戲謔」或「隱晦」寫法,我若直接翻譯,大家可能不知道原作者想表達什麼。所以我會將某些標題,用比較易懂的中文重新表達。一切以「標題編號(1~42)」為準。
接下來就請享用我這個不負責任的翻譯了。有會錯原文意思的,還請各位留言在下方、然後鞭小力一點 XD。我會馬上修正的:
1. 不要去做編譯器會做的事情
如:用迴圈能存取 a[0] ~ a[9],就不要用「拷貝貼上」a[0], a[1], a[2]..., a[9] 來存取裡面的內容值。
2. 大於 0 不代表它等於 1
若文件告訴你某函數執行成功會傳回「大於0」的值、但目前這個大於0的值是「1」。請你寫程式的時候不要自作聰明地偵測「傳回值 == 1」當成成功,請乖乖遵照規格書用「傳回值 > 0」等於成功。因為將來的版本有可能還會傳回 2, 3...等其他值。
3. 當你拷貝貼上一段程式碼,記得檢查它的副本兩遍
有時候你拷貝貼上一段程式碼,會忘了去修改裡面一些不同的小數字,導致花了大把時間去檢查錯誤到底出現在哪裡。
4. 小心使用「? :」運算子。並記得多加括號
「? :」是 C/C++ 內常用的運算子。若您寫了一段這樣的原始碼「a - b?0:1」,您可能以為它是這樣運作的「a - (b?0:1)」,事實上,它是這樣運作的「(a-b)?0:1」。結論是,多加括號保平安。
5. 多用市面上有的工具來分析您的原始碼
市面上有些工具,如:原始碼靜態分析工具、原始碼排列工具...可以幫您在把原始碼送入編譯器前,就抓到錯誤。不過作者也提到,別以為倚賴這些工具,錯誤就不會發生。真正要減少錯誤還是得靠多讀規格書,增加程式寫作經驗才辦得到。
6. 確認您所有的指標,都已經轉型成整數型態
作者擔心,某些使用 64 bits 當成指標變數寬度的系統,到 32 bits 的機器內重新編譯時,會產生高位元組被截斷的慘劇。某些編譯器提供「uintptr_t」這個專門給指標變數使用的型態,會隨著編譯器所在的環境,自動調整指標寬度。
7. 別在迴圈內呼叫「alloca()」這個函數
萬一迴圈失控,alloca() 函數會霸佔大量記憶體無法釋放。建議事先在迴圈外霸佔一大塊足夠的記憶體,然後在迴圈內慢慢蠶食之。
8. 在「解構函數(Destructor)」內使用「例外處理(Exception)」是很危險的!
作者認為,在負責釋放記憶體、收尾等工作的解構函數,還去霸佔新記憶體作事情是不好的。若真的發生例外(Exception),直接「吃掉(Supress)」不要讓它出現在使用者面前可能還比較好。
9. 若你要比對字串結尾,請用 '\0' 代表
有些程式設計師因為 '\0' 其實就是數字 0,而在比對字串結尾時,直接使用 0 來比對字串結尾。作者認為這個習慣不好。
10. 請勿濫用 # ifdef
# ifdef 很好用,但很容易讓原始碼雜亂難讀。作者不會建議大家不要用,但他反對連可以用 if ~ else 解決的場合,都濫用 # ifdef。
11. 別把一堆運算子全都擠在同一列
多分成幾列,Debugger 可以比較容易指出發生錯誤的是在哪個環節。
12. 當你「拷貝貼上」程式碼時,特別注意「最後一列效應」
作者還是不太建議濫用拷貝貼上,他認為需要重複使用一段程式碼,不如好好考慮寫成稍有彈性的函數,然後重複叫用。此外,他建議大家去看「最後一列效應」這篇文章(連結在本文),並了解最後一列效應在拷貝貼上程式碼內,所扮演的角色。
13. 程式碼若很長,盡量多折幾列,然後排成像表格般一樣整齊(Table-style)
14. 好編譯器 + 好的寫碼習慣是不夠的
內文舉了個後括號「)」括錯位置,但編譯器抓不出來的例子。
15. 若有一堆意義相關的常數,請用 enum 括住它們
16. 「看我能把程式碼寫得這麼屌!」的炫耀寫碼心態不可取
寫程式碼要以「穩」「易讀」為主,不是把一些剛學不久,覺得很酷,但三個月後會忘個精光的技術用進程式碼內。
17. 想用程式碼把一塊資料清乾淨,最好把清除程式碼獨立拉出來成一個專屬函數
18. 你在一個語言行得通的方法,在另一個語言不一定行得通
19. 盡量用技巧避免在同一個類別內,建構函數彼此呼叫的情況
20. 讀檔時,只檢查有沒有讀到檔尾(EOF)似乎是不夠的
21. 正確檢查 EOF 的方法
22. 有比使用 # pragma warning(...) 來印錯誤訊息更好的方法,勿濫用
23. 如果你想取得字串長度,用函數自動幫你算,別用手算然後硬填數字上去
24. 請多使用 "override" 與 "final",它們會是你的好朋友
25. 別再把 "this" 指標跟 "nullptr"(空指標)拿來作比較
26. 小心使用 VARIANT_BOOL 這個陰險狡猾的東西
27. BSTR(Binary STRing)這個用於微軟 COM/Automation 技術中的資料型態,請小心使用
28. 能用函數把一段程式碼包起來重複用,就別用巨集包它(使用巨集函數的缺點多於優點)
29. 在迴圈或迭代程式碼間,使用 ++i,來取代 i++(i++ 編譯後的執行效能稍微差那麼一點)
30. wprintf() 函數的使用陷阱:Win32 印寬字元字串要用 %S(大寫),Win64 要用 %s(小寫)。
31. 陣列在 C/C++ 傳給函數時,並非是「傳值呼叫」(Call by Value)
32. 要把檔案內的文字直接印在螢幕上時,請不要直接使用 printf() (怕檔案內夾雜 % 開頭的字,這些字對 printf 是有特殊意義的)
33. 想對一個指標取值(亦即:*p),記得檢查它是否為 NULL。否則你對 NULL 取值會導致系統出錯的
34. 別以為 int 的上限 21億+ 很多,在 64 bits 系統中,這個數字很容易爆掉
35. 若您把 enum 常數與 switch~case 連用,增加新元素進 enum 時也別忘了加新 case 進 switch
36. 如果有怎麼抓都抓不出來的 bugs,記得往「記憶體」的方向去思考(32bits vs. 64bits 之類的問題)
37. 在 do~while() 內用 continue 指令要小心,有可能會跳過你放在底部的「更新條件」,導致無窮迴圈
38. 對於指標,請用 nullptr 代替 NULL,這是新的 C++ 規格書希望您遵循的
39. 試著別把一列式子搞得太複雜,這樣比較不會有「咦?為何這段寫錯的程式碼居然可以運作」的問題出現
40. 開始使用「原始碼靜態分析工具」吧!
41. 別為了要使用某函式庫的一個函式,而引進整個函式庫。如果只用了一個函式,建議自己寫比較容易維護。
42. 別再用 empty 這個曖昧的字眼當函數名稱了。用 erase(), clear() 都比 empty() 好。
如果您覺得小弟翻譯了這麼多,沒有功勞也有苦勞,那就麻煩按個讚犒賞小弟一下吧!當然歡迎轉發給您 Facebook 的朋友共同討論。最後提醒一句,上述 42 點別把它們全都當聖旨,親身體會驗證才是最重要的喔!
祝福大家假期愉快!
同時也有121部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,JAVA實用級解題分享之1(JAVA開發環境ECLIPSE設定與術科題目開啟) 這是在佛光大學資訊應用學系所講 JAVA入門證照的解題, 可以當成是學習JAVA的入門, 需要的是環境的設置與試題的理解, 學會這些題目,考不考證照就看自己了, 畢竟學會做出作品才是真的, 可以延伸到其他的設計需求, ...
「do while迴圈c++」的推薦目錄:
- 關於do while迴圈c++ 在 紀老師程式教學網 Facebook 的最佳解答
- 關於do while迴圈c++ 在 吳老師教學部落格 Youtube 的精選貼文
- 關於do while迴圈c++ 在 吳老師教學部落格 Youtube 的最讚貼文
- 關於do while迴圈c++ 在 吳老師教學部落格 Youtube 的最讚貼文
- 關於do while迴圈c++ 在 【C 語言入門】8.6 - 至少做一次的重複執行(do-while 述句) 的評價
- 關於do while迴圈c++ 在 在C 中使用Do While 迴圈迭代陣列 - 他山教程 的評價
- 關於do while迴圈c++ 在 條件判斷與迴圈- FJCU CPC 訓練網 的評價
- 關於do while迴圈c++ 在 #新手#請益C語言基礎do-while迴圈問題 - 軟體工程師板 | Dcard 的評價
do while迴圈c++ 在 吳老師教學部落格 Youtube 的精選貼文
JAVA實用級解題分享之1(JAVA開發環境ECLIPSE設定與術科題目開啟)
這是在佛光大學資訊應用學系所講 JAVA入門證照的解題,
可以當成是學習JAVA的入門,
需要的是環境的設置與試題的理解,
學會這些題目,考不考證照就看自己了,
畢竟學會做出作品才是真的,
可以延伸到其他的設計需求,
如:
Android APP開發、JSP動態網頁、Servlet伺服器端的開發、
JavaScript、Jquery、Jquery Mobile、
其他C#的語法也和JAVA很類似。
完整教學:
https://www.youtube.com/playlist?list=PLgzs-Q3byiYMVnYJCPsbyaITTdYtPf8DG
部落格:
http://terry55wu.blogspot.tw/2014/01/javaandroid.html
01_JAVA開發環境與術科題目說明
02_開啟ECLIPSE與101題試題說明
03_101題解答01(產生7個號碼與輸出)
04_101題解答02(產生不重覆與除錯模式)
05_102題解答01(用Date類別產生日期時間)
JAVA證照考題解答分享(Android證照的跳板)
課程大綱:
1.認識 AWT類別
2.認識並學習如何建立視窗物件
3.學習如何管理與配置版面
4.事件處理:1.認識 Java的委派事件模式。2.認識並學習使用各種事件處理類別。3.學習各種物件的事件處理 。
之後:
1.分享最新的JAVA DOCS資訊與中文化版本,
並設定ECLIPSE直接讀取JAVA說明檔的設定方法。
2.利用實例綜合練習變數宣告、資料型別、運算子、
流程控制的IF...ELSE與各種迴圈方法的應用。
3.說明陣列與多維陣列的使用與實例。
漸漸更深入JAVA語法的核心,有些同學似乎已經吃不消,
但有些同學可能以前學過,所以一下子就解出來了,
也很大方的分享出他的解法,
不過這樣有時反而讓一些沒學過JAVA的同學備感壓力。
因為老師以為大家都會了,所以就加速往前,害一些同學在後面趕的很辛苦,
腦筋已經被迴圈給轉的頭昏,還沒弄懂題目,又要接下一題,
所以真有點兩難,好在助教的提醒,有稍放慢一點進度,
若有程度較好的同學,請些自行預息後面的課程,
或是先準備TQC JAVA的學術科考題好了,再不然好心一點,
充當一下老師的分身,幫忙同學一下,感謝!
101模擬樂透彩
102系統日期、時間顯示
103亂數排序器
104河洛之數
105陣列行列轉換
106數值過濾器
107求平均值
108九九乘法表
109面積與體積計算
110單字測驗
202利息計算
204期末考分數計算
206四則運算
208三角形邊長判斷
210字元搜尋器
302字體設定選擇器
304簡易繪圖板
306滑鼠感應視窗
308藝人音樂評等
310年齡計算
TQC JAVA實用級20題已經上完,準備開始講進階級的第三類10題,
但上進階級10題若是沒有 AWT類別的概念,恐怕很難接上第三類的 AWT視窗設計,
所以就在上進階級前,先給湜憶學員一些概念,可以不只在電腦證照考試受用,
在日後撰寫程式也可以更得心應手,JAVA工程師職缺很大,主要是人才培養不易,
要有好的培訓計畫,才能學的好又能有系統,才不致學的有挫折感,
這那上課方式,我也會將之有系統的轉換成雲端教學方式,在線上就可以學習,
並可以與老師隨時互動,得知學習進度與成效,
而這樣的方式已經很成功在各校電腦課程進行中,
從學員們的滿分成效就可以一窺端倪,要有效率又學的好真的不太容易,
很需要學習方法,上課無章法只會浪費時間與金錢,有效率有成果的學習才是王道,
快上完JAVA的進階級,期待每個學員都能順利取得 JAVA證照。
java下載,jdk,eclipse,java教學網站,java教學影片,java eclipse教學,eclipse 教學,java證照解答,AWT類別, 電腦證照
do while迴圈c++ 在 吳老師教學部落格 Youtube 的最讚貼文
JAVA程式設計第4次上課
這次上課主要是開始學習流程控制的迴圈部分:
有FOR、WHILE、DO...WHILE迴圈
這也是學習JAVA基本與法中比較重要且難學的部份,
因為人腦沒有迴圈的功能,反而厭惡迴圈,
所以常常有同學學到這部份就因此陣亡,
因為實在是太不人性化,但對電腦來說,
他最大的優點就是可以不斷的執行迴圈,幾萬次都無所謂,
除了次數可以無上限外,速度也快到不行,
所以自動化控制一定少不了迴圈,只是要怎麼把迴圈學好呢?
這是非常重要的一環。
除了要反覆聽講外,反覆練習範例檔也是個方法,
或是嘗試修改範例成別的迴圈方式也是方法,
例如九九乘法表除了可以用FOR迴圈解,也可以試試WHILE迴圈和DO...WHILE迴圈,
結果都可以做的出來。
此外,也加入TQC的JAVA術科題目都範例,TQC地JAVA題目不算太簡單,
很有挑戰性,且目前有這張證照算是少數,
我覺得可以當成考SCJP國際證照之前的暖身,或可說互補也行。
吳老師 101/8/25
01_TQC認證試題練習說明
02_SwitchCase範例說明
03_JAVA版本比較說明
04_用JOptionPane顯示訊息
05_FOR迴圈範例並改為JOptionPane
06_猜拳遊戲解說
07_猜拳遊戲修改成JOptionOane
08_如何找到Class類別檔位置與反組譯
09_如何找到TQC_JAVA的程式碼
10_說明檔的使用說明
11_Array1D一維陣列說明
12_Array1D一維陣列說明(JOptionPane版)
13_Array1D一維陣列說明(DecimalFormat版)
14_Array2D二維陣列說明
相關JAVA教學:
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,湜憶電腦,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
do while迴圈c++ 在 吳老師教學部落格 Youtube 的最讚貼文
JAVA程式設計第4次上課
這次上課主要是開始學習流程控制的迴圈部分:
有FOR、WHILE、DO...WHILE迴圈
這也是學習JAVA基本與法中比較重要且難學的部份,
因為人腦沒有迴圈的功能,反而厭惡迴圈,
所以常常有同學學到這部份就因此陣亡,
因為實在是太不人性化,但對電腦來說,
他最大的優點就是可以不斷的執行迴圈,幾萬次都無所謂,
除了次數可以無上限外,速度也快到不行,
所以自動化控制一定少不了迴圈,只是要怎麼把迴圈學好呢?
這是非常重要的一環。
除了要反覆聽講外,反覆練習範例檔也是個方法,
或是嘗試修改範例成別的迴圈方式也是方法,
例如九九乘法表除了可以用FOR迴圈解,也可以試試WHILE迴圈和DO...WHILE迴圈,
結果都可以做的出來。
此外,也加入TQC的JAVA術科題目都範例,TQC地JAVA題目不算太簡單,
很有挑戰性,且目前有這張證照算是少數,
我覺得可以當成考SCJP國際證照之前的暖身,或可說互補也行。
吳老師 101/8/25
01_TQC認證試題練習說明
02_SwitchCase範例說明
03_JAVA版本比較說明
04_用JOptionPane顯示訊息
05_FOR迴圈範例並改為JOptionPane
06_猜拳遊戲解說
07_猜拳遊戲修改成JOptionOane
08_如何找到Class類別檔位置與反組譯
09_如何找到TQC_JAVA的程式碼
10_說明檔的使用說明
11_Array1D一維陣列說明
12_Array1D一維陣列說明(JOptionPane版)
13_Array1D一維陣列說明(DecimalFormat版)
14_Array2D二維陣列說明
相關JAVA教學:
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,湜憶電腦,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
do while迴圈c++ 在 在C 中使用Do While 迴圈迭代陣列 - 他山教程 的推薦與評價
在C 中使用Do While 迴圈迭代陣列. Created: November-22, 2018. placeholderCopy int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int i = 0; do { printf("%d\n", ... ... <看更多>
do while迴圈c++ 在 條件判斷與迴圈- FJCU CPC 訓練網 的推薦與評價
為了應付不同條件下能做出不同指令, C/C++ 提供了 if 條件句判斷。 ... 有個和 while 迴圈相似的迴圈叫做 do-while 迴圈,差別在於 do-while 會先 ... ... <看更多>
do while迴圈c++ 在 【C 語言入門】8.6 - 至少做一次的重複執行(do-while 述句) 的推薦與評價
【 C 語言入門】8.6 - 至少做一次的重複執行( do - while 述句) ... Python 流程控制: 迴圈 基礎,while 迴圈 、for 迴圈 By 彭彭. 彭彭的課程. 彭彭的課程. ... <看更多>