so.java

          so.java

          國際:寫出漂亮代碼的七種方法(zt)

          轉自CSDN http://news.csdn.net/n/20081217/121810.html

          首先我想說明我本文闡述的是純粹從美學的角度來寫出代碼,而非技術、邏輯等。以下為寫出漂亮代碼的七種方法:

          1, 盡快結束 if語句

          例如下面這個JavaScript語句,看起來就很恐怖:

          1 function findShape(flags, point, attribute, list) {
          2    if(!findShapePoints(flags, point, attribute)) {
          3        if(!doFindShapePoints(flags, point, attribute)) {
          4            if(!findInShape(flags, point, attribute)) {
          5                if(!findFromGuide(flags,point) {
          6                    if(list.count() > 0 && flags == 1) {
          7                          doSomething();
          8                    }
          9                }
          10            }
          11       }
          12    }  
          13  }

          但如果這么寫就好看得多:

          1 function findShape(flags, point, attribute, list) {
          2    if(findShapePoints(flags, point, attribute)) {
          3        return;
          4    }
          5
          6    if(doFindShapePoints(flags, point, attribute)) {
          7        return;
          8    }
          9
          10    if(findInShape(flags, point, attribute)) {
          11        return;
          12    }
          13
          14    if(findFromGuide(flags,point) {
          15        return;
          16    }
          17
          18    if (!(list.count() > 0 && flags == 1)) {
          19        return;
          20    }
          21
          22    doSomething();
          23
          24 }

          你可能會很不喜歡第二種的表述方式,但反映出了迅速返回if值的思想,也可以理解為:避免不必要的else陳述。

          2, 如果只是簡單的布爾運算(邏輯運算),不要使用if語句

          例如:
          1 function isStringEmpty(str){
          2    if(str === "") {
          3        return true;
          4    }
          5    else {
          6        return false;
          7    }
          8 }

          可以寫為:
          1 function isStringEmpty(str){
          2    return (str === "");
          3 }

          3, 使用空白,這是免費
          例如:
          1 function getSomeAngle() {
          2    // Some code here then
          3    radAngle1 = Math.atan(slope(center, point1));
          4    radAngle2 = Math.atan(slope(center, point2));
          5    firstAngle = getStartAngle(radAngle1, point1, center);
          6    secondAngle = getStartAngle(radAngle2, point2, center);
          7    radAngle1 = degreesToRadians(firstAngle);
          8    radAngle2 = degreesToRadians(secondAngle);
          9    baseRadius = distance(point, center);
          10    radius = baseRadius + (lines * y);
          11    p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);
          12    p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);
          13    pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);
          14    pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");
          15    // Now some more code
          16 }

          很多開發者不愿意使用空白,就好像這要收費一樣。我在此并非刻意地添加空白,粗魯地打斷代碼的連貫性。在實際編寫代碼的過程中,會很容易地發現在什么地方加入空白,這不但美觀而且讓讀者易懂,如下:
          1 function getSomeAngle() {
          2    // Some code here then
          3    radAngle1 = Math.atan(slope(center, point1));
          4    radAngle2 = Math.atan(slope(center, point2));
          5
          6    firstAngle = getStartAngle(radAngle1, point1, center);
          7    secondAngle = getStartAngle(radAngle2, point2, center);
          8
          9    radAngle1 = degreesToRadians(firstAngle);
          10    radAngle2 = degreesToRadians(secondAngle);
          11
          12    baseRadius = distance(point, center);
          13    radius = baseRadius + (lines * y);
          14
          15    p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);
          16    p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);
          17
          18    pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);
          19    pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");
          20    // Now some more code
          21 }

          4, 不要使用無謂的注釋
          無謂的注釋讓人費神,這實在很討厭。不要標出很明顯的注釋。在以下的例子中,每個人都知道代碼表達的是“students id”,因而沒必要標出。
          1 function existsStudent(id, list) {
          2    for(i = 0; i < list.length; i++) {
          3       student = list[i];
          4
          5       // Get the student's id
          6       thisId = student.getId();
          7
          8       if(thisId === id) {
          9           return true;
          10       }
          11    }
          12    return false;  
          13 }

          5, 不要在源文件中留下已經刪除的代碼,哪怕你標注了
          如果你使用了版本控制,那么你就可以輕松地找回前一個版本的代碼。如果別人大費周折地讀了你的代碼,卻發現是要刪除的代碼,這實在太恨人了。

          //function thisReallyHandyFunction() {
          //      someMagic();
          //      someMoreMagic();
          //      magicNumber = evenMoreMagic();
          //      return magicNumber;
          //}

          6,不要有太長的代碼

          看太長的代碼實在太費勁,尤其是代碼本身的功能又很小。如下:

          1 public static EnumMap<Category, IntPair> getGroupCategoryDistribution(EnumMap<Category, Integer> sizes, int groups) {
          2        EnumMap<Category, IntPair> categoryGroupCounts = new EnumMap<Category,IntPair>(Category.class);
          3
          4        for(Category cat : Category.values()) {
          5            categoryGroupCounts.put(cat, getCategoryDistribution(sizes.get(cat), groups));
          6        }

          #

          我并不是說非要堅持70個字符以內,但是一個比較理想的長度是控制在120個字符內。如果你把代碼發布在互聯網上,用戶讀起來就很困難。
          7,不要在一個功能(或者函數內)有太多代碼行
          我的一個老同事曾經說Visual C++很臭,因為它不允許你在一個函數內擁有超過10,000行代碼。我記不清代碼行數的上限,不知道他說的是否正確,但我很不贊成他的觀點。如果一個函數超過了50行,看起來有多費勁你知道么,還有沒完沒了的if循環,而且你還的滾動鼠標前后對照這段代碼。對我而言,超過35行的代碼理解起來就很困難了。我的建議是超過這個數字就把一個函數代碼分割成兩個。

          posted on 2008-12-18 09:23 so.java 閱讀(997) 評論(0)  編輯  收藏 所屬分類: 隨想隨記


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          java study

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 同德县| 柘荣县| 福鼎市| 扬州市| 忻州市| 民权县| 临沧市| 岱山县| 郧西县| 绵竹市| 贵德县| 新闻| 屏东县| 霍邱县| 孝义市| 镇宁| 灵寿县| 同德县| 成武县| 承德市| 探索| 万宁市| 汝城县| 阿城市| 长白| 渭源县| 新丰县| 锡林浩特市| 城步| 安徽省| 株洲市| 甘孜| 南陵县| 建始县| 铜川市| 达尔| 喀喇沁旗| 朝阳县| 大宁县| 万全县| 屏边|