編寫代碼一個重要的認識是「程序大多時候是給人看的」,編程標準使代碼更容易閱讀和理解,甚至能夠保證其中的錯誤更少。編程標準包含:具備說明性的名字、清晰的表達式、直截了當的控制流、可讀的代碼和註釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。 編碼標準中的版式就是一個很好的例子,版式雖然不會影響程序的功能,但會影響可讀性。程序的版式追求清晰、美觀,是程序風格的重要因素。html
--婁老師《敏捷開發與XP實踐》java
咱們常見的是這樣的代碼:git
public class CodeStandard { public static void main(String [] args){ StringBuffer buffer = new StringBuffer(); buffer.append('S'); buffer.append("tringBuffer"); System.out.println(buffer.charAt(1)); System.out.println(buffer.capacity()); System.out.println(buffer.indexOf("tring")); System.out.println("buffer = " + buffer.toString()); if(buffer.capacity()<20) buffer.append("1234567"); for(int i=0; i<buffer.length();i++) System.out.println(buffer.charAt(i)); } }
程序沒有最基本的縮進,讓人讀起來很費勁,可是在IDEA中利用插件能夠輕鬆解決:程序員
Settings
->Plugins
-> Browse repositories...
alibaba
便可看到Alibaba Java Code Guidelines
插件,點擊Install
進行安裝,而後重啓IDE生效:代碼標準中很重要的一項是如何給包、類、變量、方法等標識符命名,能很好的命名可讓本身的代碼立立刻升一個檔次。Java中的通常的命名規則有:算法
io
,awt
HelloWorldApp
userName
setName
Code
選項,選擇Reformate Code
功能,便可格式化代碼Code
菜單,現將基本功能總結以下:
Override Methods(Ctrl+O)
:重載基本類的方法;Implement Methods(Ctrl+I)
:完成當前類接口或者抽象基本類的接口的方法;Generate(Alt+Insert)
:建立類裏面任何字段的 getter 與 setter 方法;Surround With(Ctrl+Alt+T)
:使用if-else
、try-catch
、do-while
等包裝代碼段;Insert Live Template(Ctrl+J)
:執行一些記不起來的 Live Template
縮寫;Comment with Line Comment(Ctrl+斜槓)
:註釋(或反註釋)當前行或者選擇地代碼塊;Comment with Block Comment(Ctrl+Shift+斜槓)
:用塊註釋標記(「 /* */」)把所選塊包圍起來Reformat Code(Ctrl+Alt+L)
:將代碼按標準格式縮進;Move Statement Up/Down
:向上/向下移動代碼語句;Move Line Up/Down
:向上/向下移動光標所在行結對編程是XP中的重要實踐。在結對編程模式下,一對程序員肩並肩、平等地、互補地進行開發工做。他們並排坐在一臺電腦前,面對同一個顯示器,使用同一個鍵盤、同一個鼠標一塊兒工做。他們一塊兒分析,一塊兒設計,一塊兒寫測試用例,一塊兒編碼,一塊兒作單元測試,一塊兒作集成測試,一塊兒寫文檔等。 結對編程中有兩個角色:編程
- 駕駛員(Driver)是控制鍵盤輸入的人。
- 領航員(Navigator)起到領航、提醒的做用。
如何結對編程,爲什麼要結對編程,你們參考一下結對編程和兩人合做 ,重點是:安全
- 駕駛員:寫設計文檔,進行編碼和單元測試等XP開發流程;
- 領航員:審閱駕駛員的文檔、駕駛員對編碼等開發流程的執行;考慮單元測試的覆蓋率;思考是否須要和如何重構;幫助駕駛員解決具體的技術問題;
- 駕駛員和領航員不斷輪換角色,不要連續工做超過一小時,每工做一小時休息15分鐘。領航員要控制時間;
- 主動參與。任何一個任務都首先是兩我的的責任,也是全部人的責任。沒有「個人代碼」、「你的代碼」或「他/她的代碼」,只有「咱們的代碼」;
- 只有水平上的差距,沒有級別上的差別。兩人結對,儘管可能你們的級別資歷不一樣,但無論在分析、設計或編碼上,雙方都擁有平等的決策權利。
--婁老師《敏捷開發與XP實踐》網絡
管理
,進入後選擇項目成員管理
,將搭檔加入本身的項目Complex
代碼以下:Git
選項選擇鏈接搭檔的代碼,下載後對照Complex
代碼寫出很多於三個Junit測試類getRealPart()
、getImagePart()
、Add()
、Sub()
、Multi()
、Div()
,將測試代碼上傳到搭檔碼雲上重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。app
--婁老師《敏捷開發與XP實踐》框架
重構中一個很是關鍵的前提就是「不改變軟件外部行爲」,它保證了咱們在重構原有系統的同時,不會爲原系統帶來新的BUG,以確保重構的安全。
咱們要修改軟件,萬變不離其宗,無非就是四種動機:
須要重構的代碼有哪些呢?
IDEA提供的重構功能在Refactor
選項中:
一個完整的重構流程包括:
Check out code
bad smell
Refactoring
Unit Tests
Check in code
Rational
代碼Java安全體系結構總共分爲4個部分:
Java密碼學算法:
和搭檔對各類算法進行學習研究後,咱們選擇了MD5
算法:
使用Java計算指定字符串的消息摘要,java.security
包中的MessageDigest
類提供了計算消息摘要的方法
首先生成對象,執行其update()
方法能夠將原始數據傳遞給該對象,而後執行其digest( )
方法便可獲得消息摘要。具體步驟以下:
MessageDigest
對象:MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes("UTF8" ));
byte s[ ]=m.digest( );
String result=""; for (int i=0; i<s.length; i++){ result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6); }
編寫代碼以下:
產品代碼:
import java.io.UnsupportedEncodingException; import java.security.*; public class MD5Encrypt { public static void main(String args[]) throws Exception { String originalStr = args[0]; MessageDigest m = null; try { m = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } try { m.update(originalStr.getBytes("UTF8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } byte byteStr[] = m.digest(); GetResult getResult = new GetResult(); for (int i = 0; i < byteStr.length; i++) { getResult.result += Integer.toHexString((0x000000ff & byteStr[i]) | 0xffffff00).substring(6); } } public static class GetResult { String result = ""; } }
/*測試輸入輸出*/ String str = new String(originalStr); System.out.println("明文:" + str); System.out.println("密文:" + getResult.result);
解決過程: 通過詢問同窗,知道了應該在本身項目的管理中邀請搭檔成爲該項目成員的開發者:
解決過程: 通過對重構的仔細學習和對搭檔代碼的認真檢查,仍是找到了幾處須要重構的地方:
我經過本次實驗學會了如何規範、格式化代碼,如何將搭檔加入本身的碼雲項目並進行合做編寫代碼,如何重構以及Java密碼學相關知識。
在本身上手實踐操做過程當中,加深了對平時不清楚的知識點的理解,也掌握了重構等新知識點。此次實驗是第一次真正意義上的「結對編程」,讓我深入體會到了「衆人拾柴火焰高」這句真理,實時觀測搭檔的代碼使得編程效率大大提升。
步驟 | 耗時 | 百分比 |
---|---|---|
步驟 | 耗時 | 百分比 |
需求分析 | 30min | 19% |
設計 | 30min | 19% |
代碼實現 | 60min | 38% |
測試 | 10min | 6% |
分析總結 | 30min | 18% |