昨天寫了一篇博文《30行,金額轉人民幣大寫的代碼》,今天突發奇想,看看不用從后向前的思路,而用從前向后遍歷的思路,會不會代碼也一樣精煉呢?
於是經過了大約40分鍾的奮戰,才有了下面的這段代碼。中間測試出來的奇怪東西特別的多,
比如叄億萬零捌佰,壹拾零萬元,消除這些奇怪的錯誤着實花費不少時間。
1 public class ChineseCurrencyConverter { 2 private static final String [] UNITS = {"","拾","佰","仟","萬","拾","佰","仟","億",}; 3 private static final String[] CHINESE_NUMBER = {"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"}; 4 5 public static String convert(int amount) { 6 if (amount >= 1e9 || amount < 0) { 7 return "超出系統處理范圍了。"; 8 } 9 10 String text = ""; 11 for (int i = 8; i >= 0;i--) { 12 int number = amount / e(i); 13 if (number == 0 && text.isEmpty()) { 14 continue; 15 } else if (number == 0 && text.endsWith("零")){ 16 if (i == 4) { 17 text = text.substring(0, text.length() -1); 18 if (!text.endsWith("億")){ 19 text += "萬"; 20 } 21 } 22 continue; 23 } else { 24 text += CHINESE_NUMBER[number]; 25 if (i != 4 && number != 0) { 26 text += UNITS[i]; 27 } 28 else if (i == 4) { 29 if( text.endsWith("零")){ 30 text = text.substring(0, text.length() -1); 31 } 32 text += "萬"; 33 } 34 } 35 amount -= number * e(i); 36 } 37 if (text.endsWith("零")) { 38 text = text.substring(0, text.length() -1); 39 } 40 text += "元整"; 41 return text ; 42 } 43 44 private static int e(int len) { 45 int result = 1; 46 for (int i = 0; i < len; i++) { 47 result *= 10; 48 } 49 return result; 50 } 51 }
由此向引發的一個思考就是:面向過程和面向對象究竟有什么差別。
以前告訴別人:寫代碼要用面向對象的思維。結果遭到駁斥:面向對象的代碼太過抽象,不符合一般人思維模式,很多人看不懂,最好用面向過程的方式寫代碼。
上面這段代碼是典型的面向過程式的,而且中間那些if-else並不是一開始就寫上去的,而是在發現一個錯誤之后找到對應的條件增補的。
和很多人寫面向過程代碼時的情況類似,都是這樣修修補補才寫出來的代碼。
其結果就是:
1.難以閱讀
2.條件之間不夠匹配,
3.嵌套過深
4.代碼過長
5.質量沒信心
6.需求變更難對應
....
盡管昨天的那段代碼並不是面向對象書寫的。但是它具備這些特點:
1.結構清晰
2.處理簡單
3.增加角分處理的時候只要在開頭對小數點進行分割即可,並不影響原有代碼。
那么,面向對象的書寫方式給我們帶來的好處是什么?
除了擴展方便,修改時影響受控之外,最重要的當屬:結構清晰,容易閱讀?
覺得面向對象技術寫的代碼不容易懂的人們,請看一下本文開頭的那段代碼,它真的很好懂嗎,符合普通人的思維邏輯嗎?
如果畫成流程圖,它會是什么樣子呢?邏輯上講的通嗎?
也許你會說,我們的邏輯比這個簡單......我不想反駁什么,只想反問一句:真的嗎?
面向過程,真心不符合我的思維方式,特發此文。
