10 步讓你成為更優秀的程序員

這篇文章要介紹的,是我作為專業程序員這些年來學到的能真正提高我的代碼質量和整體工作效率的10件事情。

1. 永遠不要復制代碼

不惜任何代價避免重復的代碼。如果一個常用的代碼片段出現在了程序中的幾個不同地方,重構它,把它放到一個自己的函數里。重復的代碼會導致你的同事在讀你的代碼時產生困惑。而重復的代碼如果在一個地方修改,在另外一個地方忘記修改,就會產生到處是bug,它還會使你的代碼體積變得臃腫。現代的編程語言提供了很好的方法來解決這些問題,例如,下面這個問題在以前很難解決,而如今使用lambdas卻很好實現:

[java] view plaincopyprint?
  1. ///?<summary>??
  2. ///?一些函數含有部分重復代碼??
  3. ///?</summary>??
  4. void?OriginalA()??
  5. {??
  6. ????DoThingsA();??
  7. ??
  8. ????//?unique?code??
  9. ??
  10. ????DoThingsB();??
  11. }??
  12. ??
  13. ///?<summary>??
  14. ///?另外一個含有部分重復代碼的函數??
  15. ///?</summary>??
  16. void?OriginalB()??
  17. {??
  18. ????DoThingsA();??
  19. ??
  20. ????//?沒有重復的代碼??
  21. ??
  22. ????DoThingsB();??
  23. }??

現在我們重構含有部分相同代碼的函數,用delegate模式重寫它們:

[java] view plaincopyprint?
  1. ///?<summary>??
  2. ///?Encapsulate?shared?functionality??
  3. ///?</summary>??
  4. ///?<param?name="action">User?defined?action</param>??
  5. void?UniqueWrapper(Action?action)??
  6. {??
  7. ????DoThingsA();??
  8. ??
  9. ????action();??
  10. ??
  11. ????DoThingsB();??
  12. }??
  13. ??
  14. ///?<summary>??
  15. ///?New?implmentation?of?A??
  16. ///?</summary>??
  17. void?NewA()??
  18. {??
  19. ????UniqueWrapper(()?=>??
  20. ????{??
  21. ????????//?unique?code??
  22. ????});??
  23. }??
  24. ??
  25. ///?<summary>??
  26. ///?New?implementation?of?B??
  27. ///?</summary>??
  28. void?NewB()??
  29. {??
  30. ????UniqueWrapper(()?=>??
  31. ????{??
  32. ????????//?unique?code??
  33. ????});??
  34. }??

2. 留意你開始分心的時候

當你發現自己在瀏覽facebook或微博、而不是在解決問題,這通常是一種你需要短暫休息的信號。離開辦公桌,去喝一杯咖啡,或去跟同事聊5分鐘。盡管這樣做看起來有點反直覺,但長久去看,它會提高你的工作效率。

3. 不要匆忙趕任務而放棄原則

當帶著壓力去解決一個問題或修改一個bug,你很容易失去自制,發現自己匆匆忙忙,甚至完全忘了一直堅持的重要的測試過程。這通常會導致更多的問題,會讓你在老板或同事眼里顯得很不專業。

4. 測試你完成的代碼

你知道你的代碼能做什么,而且試了一下,它確實好用,但你實際上需要充分的驗證它。分析所有可能的邊界情況,測試在所有可能的條件下它都能如期的工作。如果有參數,傳遞一些預期范圍外的值。傳遞一個null值。如果可能,讓同事看看你的代碼,問他們能否弄壞它。單元測試是到達這種目的的常規方法。

5. 代碼審查

提交你的代碼之前,找個同事一起坐下來,向他解釋你做了哪些修改。通常,這樣做的過程中你就能發現代碼中的錯誤,而不需要同事說一句話。這比自己審查自己的代碼要有效的多得多。

6. 讓代碼更少

如果你發現寫了大量的代碼來解決一個簡單的問題,你很可能做錯了。下面的boolean用法是一個很好的例子:

[java] view plaincopyprint?
  1. if?(numMines?>?0)??
  2. {??
  3. ???enabled=true;??
  4. }??
  5. else??
  6. {??
  7. ???enabled=false;??
  8. }??

這時你應該寫成這樣:

[java] view plaincopyprint?
  1. enabled?=?numMines?>?0;??

代碼越少越好。這會使bug更少,重構可能性更小,出錯的幾率更小。要適度。可讀性同等重要,你可不能這樣做而使代碼喪失可讀性。

7. 為優雅的代碼而努力

優雅的代碼非常的易讀,只用手邊很少的代碼、讓機器做很少的運算就能解決問題。在各種環境中都做到代碼優雅是很難的,但經過一段時間的編程,你會對優雅的代碼是個什么樣子有個初步的感覺。優雅的代碼不會通過重構來獲得。當你看到優雅的代碼是會很高興。你會為它自豪。例如,下面就是一個我認為是優雅的方式來計算多邊形面積的方法:

[java] view plaincopyprint?
  1. static?public?double?GetConvexPolygonArea(Vector2[]?vertices)??
  2. {??
  3. ????double?area?=?0;??
  4. ????for?(int?i?=?0;?i?<?vertices.Length;?i++)??
  5. ????{??
  6. ????????Vector2?P0?=?vertices[i];??
  7. ????????Vector2?P1?=?vertices[(i?+?1)?%?vertices.Length];??
  8. ??
  9. ????????area?+=?P0.Wedge(P1);??
  10. ????}??
  11. ??
  12. ????return?area?/?2;??
  13. }??

8. 編寫不言自明的代碼

勿庸置疑,注釋是編程中很重要的一部分,但能夠不言自明的代碼跟勝一籌,因為它能讓你在看代碼時就能理解它。函數名變量名要慎重選擇,好的變量/方法名字放到語言語義環境中時,不懂編程的人都能看懂。例如:

[java] view plaincopyprint?
  1. void?DamagePlayer(Player?player,?int?damageAmount)??
  2. {??
  3. ????if?(!player.m_IsInvincible?&&?!player.m_IsDead)??
  4. ????{??
  5. ????????player.InflictDamage(?damageAmount?);??
  6. ????}??
  7. }??

能自我說明的代碼不能代替注釋。注釋是用來解釋“為什么”的,而自我說明的代碼是來描述“是什么”的。

9. 不要使用純數字

直接把數字嵌入代碼中是一種惡習,因為無法說明它們是代表什么的。當有重復時更糟糕——相同的數字在代碼的多個地方出現。如果只修改了一個,而忘記了其它的。這就導致bug。一定要用一個命名常量來代表你要表達的數字,即使它在代碼里只出現一次。

10. 不要做手工勞動

當做一系列動作時,人類總是喜歡犯錯誤。如果你在做部署工作,并且不是一步能完成的,那你就是在做錯事。盡量的讓工作能自動化的完成,減少人為錯誤。當做工作量很大的任務時,這尤其重要。

11. 避免過早優化

當你要去優化一個已經好用的功能代碼時,你很有可能會改壞它。優化只能發生在有性能分析報告指示需要優化的時候,通常是在一個項目開發的最后階段。性能分析之前的優化活動純屬浪費時間,并且會導致bug出現。

好吧,我說是10個,但你卻得到了額外贈送的一個!

這些就是我要說的,我希望它們能幫助你改進編程開發過程。

下次再見!祝快樂!

Cheers, Paul.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449889.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《流浪地球》 電影全集

《流浪地球》 電影全集 《流浪地球》是由郭帆導演&#xff0c;吳京特別出演&#xff0c;屈楚蕭、李光潔、吳孟達等人主演的科幻片《流浪地球》宣布定檔2019大年初一。同時&#xff0c;影片發布了一款定檔預告片&#xff0c;預告片開頭傳來一段廣播聲音&#xff1a;“太陽急速老…

kotlin之plus、copyOf、reverse、forEach、filter、map、reduce、fold等函數解釋和使用

kotlin之::函數調用、plus&#xff08;增加元素&#xff09;、copyOf&#xff08;復制數組&#xff09;、reverse&#xff08;翻轉數組&#xff09;、forEach&#xff08;遍歷數組&#xff09;、filter&#xff08;過濾數組&#xff09;、map函數操作及擴展、reduce函數、fold函…

linux 常用命令 雜記

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.cat cat 命令用于連接文件并打印到標準輸出設備上。 使用權限 所有使用者 2.Linux chgrp命令用于變更文件或目錄的所屬群組。 3.Linux…

C程序員要學C++嗎?

最近網友問到這一問題&#xff0c;但我更希望被問的是“C程序員需要學面向對象編程嗎&#xff1f;”&#xff0c;那就讓我先從回答這一問題開始&#xff0c;并做適當的擴展。 就我的成長經歷來看&#xff0c;C程序員必須學習面向對象編程&#xff01;面向對象編程語言有其天然的…

追女生心理研究(本人母胎單身,就是想做準備,并無其他意思)

聊天話題&#xff1a; 1。興趣愛好&#xff1a;美食&#xff0c;旅游&#xff0c;寵物等 2。現在和曾經的自己&#xff0c;分享自己的經歷 3。我變成我們&#xff0c;未來規劃 4。分析隱私&#xff0c;比如一些小秘密 5。價值觀&#xff0c;對未來的規劃等 聊天話題技巧 …

dlopen 和 dlsym 動態調用函數

Linux/unix 提供了使用 dlopen 和 dlsym 方法動態加載庫和調用函數&#xff0c;這套方法在 macOS 和 iOS 上也支持。dlopen 打開一個庫&#xff0c;獲取句柄。dlsym 在打開的庫中查找符號的值。dlclose 關閉句柄。dlerror 返回一個描述最后一次調用dlopen、dlsym&#xff0c;或…

通過騰訊地圖服務獲取行政區劃信息

接口說明地址&#xff1a; https://lbs.qq.com/webservice_v1/guide-region.html 以下是源代碼及表創建腳本。 源碼及相關文件下載轉載于:https://www.cnblogs.com/challengesoflife/p/10405366.html

情感學習聊天方法

1.非正常聊天法 出人意料的聊天技巧&#xff0c;展示幽默感&#xff0c;讓對方對自己產生興趣 比如對方說&#xff1a;你的朋友圈好多美女啊。回答還好了&#xff0c;沒有了。場面會一度尷尬 但可以這么說&#xff1a;你這樣是在間接夸自己是美女。或者&#xff1a;還好啦&a…

面向對象設計的優點

一旦明白了軟件設計的真諦&#xff08;參見《軟件設計的真諦》&#xff09;&#xff0c;我們就更能理解面向對象設計的優點。簡單說來&#xff0c;它更便于我們在軟件中構建更真實的虛擬世界。 首先&#xff0c;對象的引入方便了在軟件虛擬世界中模擬現實世界。現實世界是由很…

利用SVD-推薦未嘗過的菜肴2

推薦未嘗過的菜肴-基于SVD的評分估計 實際上數據集要比我們上一篇展示的myMat要稀疏的多。 from numpy import linalg as la from numpy import * def loadExData2():return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0,…

在圖像中截取小圖并保存

實現以橫向步長step_row、縱向步長step_col&#xff0c;在一幅大圖上剪裁寬度為width、高度為height的小圖像&#xff0c;圖像命名形式為“數字(遞增)_大圖名”格式&#xff0c;將小圖保存在argv[6]的文件夾中。 #include <opencv2/opencv.hpp> #include <string> …

Linux 文件與目錄管理、ls、cd、pwd、mkdir、rmdir、cp、 rm

見&#xff1a;http://www.runoob.com/linux/linux-file-content-manage.html我們知道Linux的目錄結構為樹狀結構&#xff0c;最頂級的目錄為根目錄 /。 其他目錄通過掛載可以將它們添加到樹中&#xff0c;通過解除掛載可以移除它們。 在開始本教程前我們需要先知道什么是絕對路…

軟件設計的真諦

假設我們身邊的一切都是用制造材料加以描述的&#xff1a;“空調”不是“空調”&#xff0c;而是“由金屬和塑料做成的物體”&#xff1b;“書”不是“書”&#xff0c;而是“由纖維和墨做成的物體”。溝通時我們也不用“空調”和“書”這樣的詞匯&#xff0c;而是“金屬和塑料…

脫單特質

1.上進心 所有人都想過好日子&#xff0c;物質不行&#xff0c;一定要有上進心&#xff0c;可以做出未來給予 2.外在形象 注重打理外在形象&#xff0c;所有人都是愛美的 3.無法控制自己&#xff0c;同時不去了解女生 控制住自己&#xff0c;才有更多的時間去了解和思考女…

云棲社區云棲號(團隊博客)攻略【2018版】

云棲社區云棲號是什么&#xff1f; 這是一個為技術團隊打造的專區&#xff08;小站&#xff09;&#xff0c;團隊成員的技術文章將在這里匯總&#xff0c;可以幫助團隊沉淀優質技術內容、打造技術品牌和影響力等。 云棲號申請條件 點擊https://yq.aliyun.com/teams頁面右側的【…

1030 完美數列 (25 分)二分

1030 完美數列 &#xff08;25 分&#xff09;給定一個正整數數列&#xff0c;和正整數 p&#xff0c;設這個數列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;則稱這個數列是完美數列。 現在給定參數 p 和一些正整數&#xff0c;請你從中選擇盡可能…

兩性位置

男生不被女生當回事&#xff0c;在自己身上&#xff0c;需要從自身找原因 1.過度看重對方&#xff0c;會讓對方看輕自己 2。氣場比較弱&#xff0c;本身實力弱&#xff0c;會讓對方俯視自己 3.太過善良&#xff0c;一昧遷就&#xff0c;會導致自己失去生活重心&#xff0c;讓…

高質高效軟件開發組織能力模型

背景至今&#xff0c;我在Motorola網絡部工作超過了5年&#xff0c;所在的產品線也是采用統一軟件開發過程和敏捷思想(但不是SCRUM)來組織軟件開發活動的&#xff0c;但這5年多的工作經歷從未引起我象微博上對于SCRUM話題的激烈討論這樣的思考。原因之一可能是&#xff0c;公司…

python并發編程之多線程

多線程 線程 1.什么是線程 進程是一個執行空間 , 線程就是其中真正工作的單位 , 每一個進程至少有一個線程(如果我們把操作系統比喻為一個工廠 , 進程就是車間 , 線程就是流水線) 進程包含了運行該程序所需要所有資源 , 進程是一個資源單位 , 線程是CPU的最小執行單位 每一個進…

JavaScript幾個難點

1. 立即執行函數 立即執行函數&#xff0c;即Immediately Invoked Function Expression (IIFE)&#xff0c;正如它的名字&#xff0c;就是創建函數的同時立即執行。它沒有綁定任何事件&#xff0c;也無需等待任何異步操作&#xff1a; (function() { // 代碼 // ...})(); f…