面向過程的代碼符合大眾的思維方式嗎?

已邀請:

憐卿甘為身下奴

贊同來自:


昨天寫瞭一篇博文《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.增加角分處理的時候隻要在開頭對小數點進行分割即可,並不影響原有代碼。


那麼,面向對象的書寫方式給我們帶來的好處是什麼?


除瞭擴展方便,修改時影響受控之外,最重要的當屬:結構清晰,容易閱讀?


覺得面向對象技術寫的代碼不容易懂的人們,請看一下本文開頭的那段代碼,它真的很好懂嗎,符合普通人的思維邏輯嗎?


如果畫成流程圖,它會是什麼樣子呢?邏輯上講的通嗎?


也許你會說,我們的邏輯比這個簡單......我不想反駁什麼,隻想反問一句:真的嗎?


面向過程,真心不符合我的思維方式,特發此文。

要回復問題請先登錄註冊