編程要養成的好習慣

1.- DRY: Don’t repeat yourself.

10commandementsDRY?是一個最簡單的法則,也是最容易被理解的。但它也可能是最難被應用的(因為要做到這樣,我們需要在泛型設計上做相當的努力,這并不是一件容易的事)。它意味著,當我們在兩個或多個地方的時候發現一些相似的代碼的時候,我們需要把他們的共性抽象出來形一個唯一的新方法,并且改變現有的地方的代碼讓他們以一些合適的參數調用這個新的方法。

DRY這一法則可能是編程屆中最通用的法則了,目前為止,應該沒有哪個程序員對這一法則存有異議。但是,我們卻能發現,一些程序在編寫單元測試(unittesting)時忘記了這一法則:讓我們相像一下,當你改變一個類的若干接口,如果你沒有使用DRY,那么,那些通過調用一系例類的接口的unittest的程序,都需要被手動的更改。比如:如果你的unit test的諸多testcases中沒有使用一個標準共有的構造類的方法,而是每個testcase自己去構造類的實例,那么,當類的構造函數被改變時,你需要修改多少個test cases啊。這就是不使用DRY法則所帶來的惡果。

?

2.- 短小的方法.

至少,我們有下面三個不錯的理由要求程序員們寫下短小的方法。

  1. 代碼會變得更容易閱讀。
  2. 代碼會變得更容易重用(短方法可以減少代碼間的耦合程度)
  3. 代碼會變得更容易測試。

3.- 良好的命名規范

使用不錯的統一的命名規范可以讓你的程序變得更容易閱讀和維護,當一個類,一個函數,一個變量的名字達到了那種可以“望文生義”的境界話,我們就可以少一些文檔,少一些溝通。文章《編程中的命名設計那點事 》可以給你一些提示。

4.- 賦予每個類正確的職責

一個類,一個職責,這類規則可以參考一下類的SOLID 法則。但我們這里強調的不是一種單一的職責,而是一個正確的職責。如果你有一個類叫Customer,我們就不應該讓這個類有sales 的方法,我們只能讓這個類有和Customer有最直接關系的方法。

5.- 把代碼組織起來

把代碼組織起來有兩具層次。

  • 物理層組織:無論你使用什么樣的目錄,包(package)或名字空間(namespace)等的結構,你需要把你的類用一種標準的方法組織起來,這樣可以方便查找。這是一種物理性質的代碼組織。
  • 邏輯層組織: 所謂邏輯層,主要是說,我們如果把兩個不同功能的類或方法通過某種規范聯系和組織起來。這里主要關注的是程序模塊間的接口。這就是我們經常見到的程序模塊的架構。

6.- 創建大量的單元測試

單元測試是最接近BUG的地方,也是修改BUG成本最低的地方,同樣也是決定整個軟件質量好壞的成敗的地方。所以,只要有可能,你就應該寫更多的,更好的單元測試案例,這樣當你未來有相應代碼改變的時候,你可以很簡單知道你代碼的改變是否影響了其它單元。

7.- 經常重構你的代碼

軟件開發是一種持續的發現的過程,從而讓你的代碼可以跟上最新的實際需求的變化。所以,我們要經常重構自己的代碼來跟上這樣的變化。當然,重構是有風險的,并不是所有的重構都是成功的,也不是我們隨時都可以重構代碼。下面是兩個重構代碼的先要條件,以避免讓你引入更多的BUG,或是把本來就爛的代碼變得更爛。

  1. 有大量的單元測試來測試。正如前面所說,重構需要用大量的單元測試來做保障和測試。
  2. 每次重構都不要大,用點點滴滴的小的重構來代替那種大型的重構。有太多的時候,當我們一開始計劃重構2000行代碼,而在3個小時后,我們就放棄這個計劃并把代碼恢復到原始的版本。所以,我們推薦的是,重構最好是從點點滴滴積累起來的。

8.- 程序注釋是邪惡的

這一條一定是充滿爭議的,大多數程序員都認為程序注釋是非常好的,是的,沒錯,程序注釋在理論上是非常不錯的。但是,在實際過程序當中,程序員們寫出來的注釋卻是很糟糕的(程序員的表達能力很有問題),從而導致了程序注釋成為了一切邪惡的化身,也導致了我們在閱讀程序的時,大多數時候,我們都不讀注釋而直接讀代碼。所以,在這里,我們并不是鼓勵不寫注釋,而是——如果你的注釋寫得不夠好的話,那么,你還不如把更重要的時間花在重構一下你的代碼,讓你的代碼更加易讀,更加清楚,這比會比注釋更好。

9.- 注重接口,而不是實現

這是一個最經典的規則了。接口注重的是——“What”是抽象,實現注重的是——“How”是細節。接口相當于一種合同契約,而實際的細節相當于對這種合同契約的一種運作和實現。運作是可以很靈活的,而合同契約則需要是相對需要穩定和不變的。如果,一個接口沒有設計好而需要經常性的變化的話,那我們可以試想一下,這代來的后果,這絕對會是一件成本很大的事情。所以,在軟件開發和調設中,接口是重中之重,而不是實現。然而我們的程序員總是注重于實現細節,所以他們局部的代碼寫的非常不錯,但軟件整體卻設計得相對較差。這點需要我們多多注意。

10.- 代碼審查機制

所有人都會出錯,一個人出錯的概率是很大的,兩個人出錯的概率就會小一些,人多一些,出錯的概率就會越來越小。因為,人多了,就能夠從不同的角度看待一個事情,雖然這樣可能導致無效率的爭論,但比起軟件產品release后出現問題的維護成本,這點成本算是相當值得的。所以,這就是我們需要讓不同的人來reivew代碼,代碼審查機制不但是一種發現問題的最有效的機制,同時也是一種可以知識共享的機制。當然,對于Code?Review來說,下面有幾個基本原則:

  • 審查者的能力一定要大于或等于代碼作者的能力,不然,代碼審查就成了一種對新手的training。
  • 而且,為了讓審查者真正負責起來,而不是在敷衍審查工作,我們需要讓審查者對審查過的代碼負主要責任,而不是代碼的作者。?
  • 另外,好的代碼審查應該不是當代碼完成的時候,而是在代碼編寫的過程中,不斷地迭代代碼審查。好的實踐的,無論代碼是否完成,代碼審核需要幾天一次地不斷地進行。

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

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

相關文章

flink整合java,Flink使用SideOutPut替換Split實現分流

基于apache flink的流處理實時模型44元包郵(需用券)去購買 >以前的數據分析項目(版本1.4.2),對從Kafka讀取的原始數據流,調用split接口實現分流.新項目決定使用Flink 1.7.2,使用split接口進行分流的時候,發現接口被標記為depra…

虛機中訪問外網;NAT中的POSTROUTING是怎么搞的?

看下docker中是怎么配置的網絡 在虛機中訪問外網:設定了qemu,在主機上添加路由:sudo iptables -t nat -I POSTROUTING -s 192.168.1.110 -j SNAT --to-source 192.168.0.108 設置了這句話就可以訪問外網了。 設置了兩個虛擬機: ta…

Fragment結合ViewPager之懶加載

什么是懶加載?為什么要用懶加載?### 1、什么是懶加載 懶加載就是當ViewPager和Fragment結合在一起使用時,Fragment呈現在用戶面前時才加載數據,當其從未被呈現在用戶面前時,不會執行加載數據的代碼。這就是我所理解的懶…

WCF和webservice的區別

微軟論壇的斑竹回答如下: 腦內:果然是高大上啊 1.WebService:嚴格來說是行業標準,不是技術,使用XML擴展標記語言來表示數據(這個是夸語言和平臺的關鍵)。微 軟的Web服務實現稱為ASP.NET Web Ser…

職場不得不明白的十大定律

帕金森定律 美國著名歷史學家諾斯古德?帕金森通過長期調查研究,寫了一本名叫《帕金森定律》的書,他在書中闡述了機構人員膨脹的原因及后果:一個不稱職的官員,可能有三條出路。第一是申請退職,把位子讓給能干的人&am…

php控制器教程,laravel基礎教程 -- 控制器

HTTP 控制器簡介控制器允許你將相應的路由業務邏輯封裝在控制器類中進行有效的管理,這樣你不必將所有的路由邏輯集中到routes.php文件中,導致代碼的臃腫與難以維護。所有的控制器類都被存儲在app/Http/Controllers目錄中.基本控制器一個基本的控制器應該…

org.apache.jasper.JasperException: Unable to compile class for JSP:

報錯信息: org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class filesSt…

i++和++i

關于自增自減運算,很多書籍沒有把問題講清楚,在C語言里是這樣的: 1.后置運算:k表示先運算,后自加。 意思是遇到k了,我先把當前的k的值拿來參加運算,后面再去管它的自加。 那么,“后面”后到什么…

什么樣的項目經歷會讓面試官眼前一亮

很多同學都問過我類似的問題: 咱們《C語言也能干大事》中講的自己動手寫windows優化大師、自己動手寫計算器等東西只是寫著玩的小玩具而已,這些能用來以后找工作時寫到簡歷中的作品嗎?看別人的簡歷寫的“圖書管理系統”、“教務選課系統”多有…

matlab采樣頻譜,Matlab對采樣數據進行頻譜分析

使用Matlab對采樣數據進行頻譜分析1、采樣數據導入Matlab采樣數據的導入至少有三種方法。第一就是手動將數據整理成Matlab支持的格式,這種方法僅適用于數據量比較小的采樣。第二種方法是使用Matlab的可視化交互操作,具體操作步驟為:File --&g…

鏈表和順序表的一些區別

順序表與鏈表是非常基本的數據結構,它們可以被統稱為線性表。 線性表(Linear List)是由 n(n≥0)個數據元素(結點)a[0],a[1],a[2]…,a[n-1] 組成的有限序列。…

ANCS推送簡介

總體原理 ANCS通過藍牙BLE 4.0實現,僅支持iPhone 4S及以上且系統版本在IOS 7以上的手機,同時在外設端需要支持藍牙4.0協議。 1、外設端進行廣播,手機打開藍牙,搜索外設,連接外設,之后進行綁定(這…

好記性不如爛筆頭,記錄幾個常用的Linux操作

作者:老王Shell公共函數庫Linux系統里有一些公共的Shell函數庫可供使用,最重要的是/etc/rc.d/init.d/functions,在/etc/init.d目錄下有很多腳本都用到了這個函數庫,里面提供了很多有用的方法,比如:killproc…

用matlab簡單電路模型,基于MATLAB的電路模型仿真應用

基于MATLAB的電路模型仿真應用實驗指導書一、實驗目的1、掌握采用M文件及SIMULINK對電路進行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模塊集的調用、設置方法。3.進一步熟悉M腳本文件編寫的方法和技巧。二、實驗原理1、通過M文件實現電路仿真的一般仿真步驟為&…

春節期間小游戲同時在線人數最高達2800萬人/小時

微信官方發布2018年春節期間微信數據報告:除夕至初五,總共有2,297億條微信消息,28億條微信朋友圈成功發出,音視頻通話總時長175億乙分鐘。其中,90后用廣的消息發送量占總量的42.5%,80后用戶25.9%&#xff0…

C語言中* 和

&x是對x變量取地址,也就是返回的是x的地址。 int *i;這里面的*說明變量i是一個指針,存的是一個地址。 而 *i整體代表的是一個數值,例如可以int *i 5 這里整體的*i代表的是5,而i代表的是這個值存儲的地址

餐館的故事-淺析職責鏈模式

我們在餐館吃飯的時候,一般都是在拿到菜單后,選擇喜歡的菜,然后通知服務員。服務員會將我們的定單交給大廚,大廚可能會親自去做這道菜,也可能安排給小廚來做,總之,我們不用擔心他們沒有人做菜&a…

JDBC數據對象存儲

一:將查詢的結果生成對象,儲存在數組中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

個人工作13年的一些人生真實領悟

此文不定期的更新,想起來就寫一些,我都忘了我曾經會過什么了。你可能會在許多的文章里看到類似的,但這些是我個人的真實體會。 1 技術服從于業務 此問題以前的一個文章提過,不再多說。 適用于大多數對技術的盲目崇拜者。在絕大…

matlab非齊次方程組的通解,用matlab求非齊次線性方程組的通解?

先向大家介紹一下非齊次線性方程組。所謂非齊次線性方程組就是方程組等號右邊的常數項不全為零的線性方程組。全部等于零時,就稱為齊次線性方程組。下面我們就講解一下如何利用matlab快速求非齊次線性方程組的通解。工具/材料matlab電腦操作方法01線性方程組Axb的求…