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


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

 

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

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

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

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

 

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM