A. 如何編寫高質量的代碼
1. 打好基礎
寫出高質量代碼,並不是搭建空中樓閣,需要有一定的基礎,這里我重點強調與代碼質量密切相關的幾點:
掌握好開發語言,比如做Android就必須對java足夠熟悉,《Effective Java》一書就是教授大家如何更好得掌握Java, 寫出高質量Java代碼。
熟悉開發平台, 不同的開發平台,有不同的API, 有不同的工作原理,同樣是Java代碼,在PC上寫與Android上寫很多地方不一樣,要去熟悉Android編程的一些特性,iOS編程的一些特性,了解清楚這些,才能寫出更加地道的代碼,充分發揮各自平台的優勢。
基礎的數據結構與演算法,掌握好這些在解決一些特定問題時,可以以更加優雅有效的方式處理。
基礎的設計原則,無需完全掌握23種經典設計模式,只需要了解一些常用的設計原則即可,甚至你也可以只了解什麼是低耦合,並在你的代碼中堅持實踐,也能寫出很不錯的代碼。
2. 代碼標准
代碼標准在團隊合作中尤為重要,誰也不希望一個項目中代碼風格各異,看得讓人糟心,即便是個人開發者,現在也需要跟各種開源項目打交道。標准怎麼定是一個老生常談的話題,我個人職業生涯中經歷過很多次的代碼標准討論會議,C++, C#, Java等等,大家有時會堅持自己的習慣不肯退讓。可現如今時代不一樣了,Google等大廠已經為我們制定好了各種標准,不用爭了,就用這些業界標准吧。
3. 想好再寫
除非你很清楚你要怎麼做,否則我不建議邊做邊想。
你真的搞清楚你要解決的問題是什麼了嗎?你的方案是否能有效?有沒有更優雅簡單的方案?准備怎麼設計它,必要的情況下,需要有設計文檔,復雜一些的設計需要有同行評審,寫代碼其實是很簡單的事情,前提是你得先想清楚。
4. 代碼重構
重構對於代碼質量的重要性不言而喻,反正我是很難一次把代碼寫得讓自己滿意、無可挑剔,《重構》這本書作為業內經典也理應人人必讀,也有其他類似的教授重構技巧的書,有些也非常不錯,遺憾的是我發現很多工作多年的同學甚至都沒有了解過重構的概念。
5. 技術債務
知乎上最近有個熱門問題《為什麼有些大公司技術弱爆了?》,其實裡面提到的很多歸根結底都是技術債務問題,這在一些大公司尤為常見。技術債務話題太大,但就代碼質量而言,我只想提一下不要因為這些債是前人留下的你就不去管,現實是沒有多少機會讓你從一個清爽清新的項目開始做起,你不得不去面對這些,你也沒法完全不跟這些所謂的爛代碼打交道。
因此我建議各位:當你負責一個小模塊時,除了把它做好之外,也要順便將與之糾纏在一起的技術債務還掉,因為這些債務最終將是整個團隊來共同承擔,任何一個人都別想獨善其身,如果你還對高質量代碼有追求的話。
作為團隊的技術負責人,也要頂住壓力,鼓勵大家勇於做出嘗試,引導大家不斷改進代碼質量,不要總是畏手畏腳,停滯不前,真要背鍋也得上,要有擔當。
6. 代碼審查
我曾經聽過一些較高級別的技術分享,竟然還不時聽到一些呼籲大家要做代碼審查的主題,我以為在這個級別的技術會議上,不應再討論代碼審查有什麼好,為什麼要做代碼審查之類的問題。同時我接觸過相當多所謂國內一線互聯網公司,竟有許多是不做代碼審查的,這一度讓我頗為意外。
這里也不想多談如何做好代碼審查,只是就代碼質量這點,不客氣地說:沒有過代碼審查經歷的同學,往往很難寫出高質量的代碼,尤其是在各種追求速度的糙快猛創業公司。
7. 靜態檢查
很多代碼上的問題,都可以通過一些工具來找到,某些場景下,它比人要靠譜得多,至少不會出現某些細節上的遺漏,同時也能有效幫助大家減少代碼審查的工作量。
Android開發中有Lint, Find bugs, PMD等優秀靜態檢查工具可用,通過改進這些工具找出的問題,就能對語法的細節,規范,編程的技巧有更多直觀了解。
建議最好與持續集成(CI),代碼審查環境配套使用, 每次提交的代碼都能自動驗證是否通過了工具的代碼檢查,通過才允許提交。
8. 單元測試
Android單元測試,一直備受爭議,主要還是原生的測試框架不夠方便,每跑一次用例需要在模擬器或者真機上運行,效率太低,也不方便在CI環境下自動構建單元測試,好在有Robolectric,能幫我們解決部分問題。
單元測試的一個非常顯著的優點是,當你需要修改大量代碼時,盡管放心修改,只需要保證單元測試用例通過即可,無需瞻前顧後。
9. 充分自測
有一種說法:程序員最害怕的是他自己寫的代碼,尤其是准備在眾人面前show自己的工作成果時,因此在寫完代碼後,需要至少跑一遍基本的場景,一些簡單的異常流。在把你的工作成果提交給測試或用戶前,充分自測是基本的職業素養,不要總想著讓測試幫你找問題,隨便用幾下就Crash的東西,你好意思拿給別人嗎?
10. 善用開源
並非開源的東西,質量就高,但至少關注度較高,使用人數較多,口碑較好的開源項目,質量是有一定保證的,這其中的道理很簡單。即便存在一些問題,也可以通過提交反饋,不斷改進。最重要的是,你自己花時間造的輪子,需要很多精力維護,而充分利用開源項目,能幫助你節省很多時間,把精力專注在最需要你關心的問題上。
B. 《編寫高質量代碼改善java程序的151個建議》pdf下載在線閱讀全文,求百度網盤雲資源
《編寫高質量代碼改善java程序的151個建議》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1R0kkOueyS8SMhP7aU7dx_Q
C. 怎樣編寫高質量的Java代碼
如何編寫高質量代碼,從而提升系統性能。想必是很多程序員都非常注意的地方,最近總結了一些要點,特此記錄在案。 所謂代碼高可讀性和高可維護性,其實就是應該有著規范的Java程序設計風格,在開發程序過程中,從近期目標看是應該著眼於功能實現,但是只能解一時之渴,而不思長遠之計,確不可取,一個雜亂無序的代碼讓人看後有一種不解其意,心緒煩亂的感覺。所以,作為一名合格的程序員,一定要確定一個觀點就是你編寫出來的代碼不只是給你一個人看的,還是給別人看的,所以在開發過程中文件注釋頭,java源文件編排格式,方法體的具體業務含義的注釋都是必須的。 如程序注釋就分為塊注釋與行注釋 。例如塊注釋為
/**
* @param
@return
*/
行注釋
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一個業務方法,如果取最能體現體現該業務的名字,這樣讀者幾乎不需要看代碼便可以知道該方法具體用途。 高質量的代碼其實很多時候都在一些小細節中體現,對於每個程序員來說一個for循環都會寫,可是卻有很多人沒有能在代碼中體現出高效性來,在這里我用簡單的一個例子來說明:一個ArrayList需要遍歷。 一般人會寫成for(int i=0;i<list.size();i++) 這有問題嗎?沒有問題,能夠完成程序員的意圖的功能。
可是它高效嗎?你有注意到這點嗎?其實問題就出現在list.size()方法,這個方法是計算一個list的大小,本身它不會存在任何問題,可是將它放在了一個for()循環中的話,就很有問題了,因為如果一個N次的for循環,這個方法就需要被執行N次,這樣的代碼就造成計算機花很多的時間去做沒有意義的事情,而本來這個list.size()方法只需要計算一次的就可以了,所以我們把計算list大小的方法放在for循環外面去定義的話,效率就可以得到提高
如: int size = list.size();
for(int i=0;i<size;i++)
關於For循環還有一個要注意的地方,就是在for循環裡面去New一個新對象。如:
for(int i=0;i<10;i++){
A a = new A();
}
是不是怎麼看都不會有問題,是的在語法上。或者是執行業務處理邏輯的時候,它都是沒有任何問題的,可是這是從語言級別去看待問題,沒有深入到它的實現機制上去看待問題。
在介紹這個問題的之前我想先簡單說下關於java內存的機制:java是如何在內存中保存對象,我們回到A a=new A()在內存中是怎麼分配這個問題來,
首先在棧中開辟一段空間存放引用a,然後在堆中開辟一段空間存放新建的A對象,同時引用a指向堆中新建得A對象,a所指代的對象地址為A在堆中地址。根據javaGC機制,只有對象已經沒有引用指向它的時候,才有可能被GC給回收,所以基於這種機制的話,上述的一個For循環就會存在很大的效率問題了,如果循環有1000次,在內存中棧會有1000個引用,而堆中也會有1000個新生成的對象,同時1000個引用會相應指向1000個新生成的對象,即使這個for循環結束,也不會有任何改變。但是實際上1000個引用的生成完全是沒有必要的,如果有著編寫高性能代碼的想法的話:像這樣的for循環完全可以這樣寫:
A a = null;
for(int i=0;i<1000;i++){
a = new A();
...
}
這樣的代碼在內存中便只會在棧中生成一個指向,每當一個for循環結束後,這個指向會指向下一個新生成的對象,前面生成的對象就會失去指向,這樣GC就有可能更加快速的回收這些已經失去功能的對象。 在java中其實new 一個對象是非常耗費時間的,特別是重量級對象,所以每次在new 對象的時候一定需要考慮清楚是不是非的生成一個對象才能完成我的業務需求呢?總之能夠根據實際情況,然後舉一反三的話,我相信大家編寫出來的代碼就會更加高效了。
其次是針對同步的慎重考慮,因為我們一旦用了synchronized這個關鍵字後,就很可能喪失了並行的功效,所以在開發的過程中需要注意到線程是不是會對共有的資源進行處理,然後在慎重選擇Synchronized 關鍵字,其實大家可以考慮用ThreadLocal這個類,它的優點是既保證同步的情況下仍然能保證並行,缺點是會佔用更多的空間去換取換取時間。
最後,便是在j2ee開發過程中對資料庫操作的優化,在這里我只針對代碼級別的優化,關於資料庫級別的我不涉及。大家編寫SQL的時候會不會注意到一些原則,在這里我將羅列一些需要注意的要點。(總結肯定不會很全,我希望如果有大蝦能給予更多的經驗指導,在下將會感激萬分。)
(1)在搜索子句的列名邊要避免函數、算術操作符和其它的表達式,除非建立基於函數的索引
(2)使用復合索引的第一個列名
(3)SELECT子句中避免使用 『*』
(4)如果可能盡量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替換Union(如果可能的話)
(7)Oracel 採用自下而上的順序解析WHERE子句,可以過濾掉最大數量記錄的條件寫在WHERE子句的末尾
(8)between謂詞可以轉化為>=and<=子句,比如:price between 10 and 20
可以轉化為 price>= 10 and <=20
(9)like子句中匹配值的第一個字元是常量,也可以進行轉換, 例如:
like 「sm%」可以轉換成 >=「sm」 and <「sn」
(10)在子查詢,exists和in要比not exists和not in執行得快,因為對於exists和in,優化器只要找到一條記錄就可以返回TRUE,而對於not exists和not in則必須檢查所有的值。
以上10條總結如果在編寫sql的時候能注意到的話,將會在一定程度上提高java跟數據交互的性能。
那麼除了在SQL上下功夫來提高性能之外,編寫合適的事務處理也將帶來一些性能提高。我們都知道事務具有:原子性,隔離性,一致性,持久性,所以在使用事務的時候肯定是犧牲並發性能為代價的。特別是一個涉及update的事務處理的時候,資料庫會在表上加上排他鎖,而一個數據資源只要被一個事務放置了排他鎖,其他事務將不能放上排他鎖,一定要一直等到事務結束後才釋放。所以在這種情況下的,並發性就會被抹殺掉了。我們不能改變這種加鎖的機制,但是我們可以用另外一種方式來達到一定程度的性能提升,那就是根據實際情況將一個大事務分解成小事務來處理。簡而言之就是減低事務放置排他鎖和釋放排他鎖的時間間隔,這樣可以讓其他的事務能更快的訪問到數據資源。而關於大事務分解一定要小心使用,如果使用不恰當的話很可能會產生意想不到的數據不一致錯誤。
D. 《編寫高質量代碼改善Java程序的151個建議》epub下載在線閱讀全文,求百度網盤雲資源
《編寫高質量代碼》(秦小波)電子書網盤下載免費在線閱讀
鏈接: https://pan..com/s/1rnSEgyYlV7fS4dbh6udY2g
書名:編寫高質量代碼
作者:秦小波
豆瓣評分:6.5
出版社:機械工業出版社華章公司
出版年份:2011-12-28
頁數:303
內容簡介:
在通往「Java技術殿堂」的路上,本書將為你指點迷津!內容全部由Java編碼的最佳實踐組成,從語法、程序設計和架構、工具和框架、編碼風格和編程思想等五大方面對Java程序員遇到的各種棘手的疑難問題給出了經驗性的解決方案,為Java程序員如何編寫高質量的Java代碼提出了151條極為寶貴的建議。對於每一個問題,不僅以建議的方式從正反兩面給出了被實踐證明為十分優秀的解決方案和非常糟糕的解決方案,而且還分析了問題產生的根源,猶如醍醐灌頂,讓人豁然開朗。
全書一共12章,1~3章針對Java語法本身提出了51條建議,例如覆寫變長方法時應該注意哪些事項、final修飾的常量不要在運行期修改、匿名類的構造函數特殊在什麼地方等;4~9章重點針對JDK API的使用提出了80條建議,例如字元串的拼接方法該如何選擇、枚舉使用時有哪些注意事項、出現NullPointerException該如何處理、泛型的多重界限該如何使用、多線程編程如何預防死鎖,等等;10~12章針對程序性能、開源的工具和框架、編碼風格和編程思想等方面提出了20條建議。
本書針對每個問題所設計應用場景都非常典型,給出的建議也都與實踐緊密結合。書中的每一條建議都可能在你的下一行代碼、下一個應用或下一個項目中嶄露頭角,建議你將此書擱置在手邊,隨時查閱,一定能使你的學習和開發工作事半功倍。
作者簡介:
秦小波,資深軟體開發工程師、系統分析師和架構師(獲Sun架構師認證),從軟體開發工作10餘年,實踐經驗極其豐富。資深Java技術專家,Java語言、Spring、Struts 2、Hibernate、iBatis、jBPM等Java技術,在企業級Java應用領域積累了大量工程經驗,對ESB、BPEL等整合技術也有較深入的認識。精通設計模式,對設計模式有深刻的認識和獨到見解,而且創造性地提出了自己在大量實踐中總結出來的新的設計模式。他撰寫的《設計模式之禪》一書憑借優質的內容和良好的可讀性廣獲讀者好評,被譽為「設計模式領域的里程碑之作。此外,他還是一位優秀的DBA,具有IBM DB2 DBA資格認證,對海量數據處理有深入的研究。