Board logo

標題: [轉載] 寫出編排漂亮程式碼的七種方法 [打印本頁]

作者: wmh    時間: 2008-12-23 09:50     標題: [轉載] 寫出編排漂亮程式碼的七種方法

來源:http://news.csdn.net/n/20081217/121810.html 首先我想說明我本文闡述的是純粹從美學的角度來寫出程式碼,而非技術、邏輯等。以下為寫出漂亮程式碼的七種方法: 1、儘快結束 if 語句 例如下面這個JavaScript語句,看起來就很恐怖:
[JSCODE_RN]function findShape(flags, point, attribute, list) {[JSCODE_RN]  if(!findShapePoints(flags, point, attribute)) {[JSCODE_RN]    if(!doFindShapePoints(flags, point, attribute)) {[JSCODE_RN]      if(!findInShape(flags, point, attribute)) {[JSCODE_RN]        if(!findFromGuide(flags,point) {[JSCODE_RN]          if(list.count() > 0 && flags == 1) {[JSCODE_RN]            doSomething();[JSCODE_RN]          }[JSCODE_RN]        }[JSCODE_RN]      }[JSCODE_RN]    }[JSCODE_RN]  }   [JSCODE_RN]}
但如果這麼寫就好看得多:
[JSCODE_RN]function findShape(flags, point, attribute, list) {[JSCODE_RN]  if(findShapePoints(flags, point, attribute)) {[JSCODE_RN]    return;[JSCODE_RN]  }[JSCODE_RN]  [JSCODE_RN]  if(doFindShapePoints(flags, point, attribute)) {[JSCODE_RN]    return;[JSCODE_RN]  }[JSCODE_RN]  [JSCODE_RN]  if(findInShape(flags, point, attribute)) { [JSCODE_RN]    return;[JSCODE_RN]  }[JSCODE_RN]  [JSCODE_RN]  if(findFromGuide(flags,point) {[JSCODE_RN]    return;[JSCODE_RN]  }[JSCODE_RN]  [JSCODE_RN]  if (!(list.count() > 0 && flags == 1)) {[JSCODE_RN]    return;[JSCODE_RN]  }[JSCODE_RN]  [JSCODE_RN]  doSomething();[JSCODE_RN]}
你可能會很不喜歡第二種的表述方式,但反映出了迅速返回 if 值的思想,也可以理解為:避免不必要的 else 陳述。 2、如果只是簡單的布林運算(邏輯運算),不要使用 if 語句 例如:
[JSCODE_RN]function isStringEmpty(str){[JSCODE_RN]  if(str === \"\") { [JSCODE_RN]    return true;[JSCODE_RN]  }[JSCODE_RN]  else {[JSCODE_RN]    return false;[JSCODE_RN]  }[JSCODE_RN]}
可以寫為:
function isStringEmpty(str){[JSCODE_RN]  return (str === \"\");[JSCODE_RN]}
3、使用空白行 (這是免費的) 例如:
function getSomeAngle() {[JSCODE_RN]  // Some code here then[JSCODE_RN]  radAngle1 = Math.atan(slope(center, point1));[JSCODE_RN]  radAngle2 = Math.atan(slope(center, point2));[JSCODE_RN]  firstAngle = getStartAngle(radAngle1, point1, center);[JSCODE_RN]  secondAngle = getStartAngle(radAngle2, point2, center);[JSCODE_RN]  radAngle1 = degreesToRadians(firstAngle);[JSCODE_RN]  radAngle2 = degreesToRadians(secondAngle);[JSCODE_RN]  baseRadius = distance(point, center);[JSCODE_RN]  radius = baseRadius + (lines * y);[JSCODE_RN]  p1[\"x\"] = roundValue(radius * Math.cos(radAngle1) + center[\"x\"]);[JSCODE_RN]  p1[\"y\"] = roundValue(radius * Math.sin(radAngle1) + center[\"y\"]);[JSCODE_RN]  pt2[\"x\"] = roundValue(radius * Math.cos(radAngle2) + center[\"y\"]);[JSCODE_RN]  pt2[\"y\"] = roundValue(radius * Math.sin(radAngle2) + center[\"y\");[JSCODE_RN]  // Now some more code[JSCODE_RN]}
很多開發者不願意使用空白行,就好像這要收費一樣。我在此並非刻意地添加空白行,粗魯地打斷程式碼的連貫性。在實際編寫程式碼的過程中,會很容易地發現在什麼地方加入空白行,這不但美觀而且讓讀者易懂,如下:
function getSomeAngle() {[JSCODE_RN]  // Some code here then[JSCODE_RN]  radAngle1 = Math.atan(slope(center, point1));[JSCODE_RN]  radAngle2 = Math.atan(slope(center, point2));[JSCODE_RN]  [JSCODE_RN]  firstAngle = getStartAngle(radAngle1, point1, center);[JSCODE_RN]  secondAngle = getStartAngle(radAngle2, point2, center);[JSCODE_RN]  [JSCODE_RN]  radAngle1 = degreesToRadians(firstAngle);[JSCODE_RN]  radAngle2 = degreesToRadians(secondAngle);[JSCODE_RN]  [JSCODE_RN]  baseRadius = distance(point, center);[JSCODE_RN]  radius = baseRadius + (lines * y);[JSCODE_RN]  [JSCODE_RN]  p1[\"x\"] = roundValue(radius * Math.cos(radAngle1) + center[\"x\"]);[JSCODE_RN]  p1[\"y\"] = roundValue(radius * Math.sin(radAngle1) + center[\"y\"]);[JSCODE_RN]  [JSCODE_RN]  pt2[\"x\"] = roundValue(radius * Math.cos(radAngle2) + center[\"y\"]);[JSCODE_RN]  pt2[\"y\"] = roundValue(radius * Math.sin(radAngle2) + center[\"y\");[JSCODE_RN]  // Now some more code[JSCODE_RN]}
4、不要使用無謂的注釋 無謂的注釋讓人費神,這實在很討厭。不要標出很明顯的注釋。在以下的例子中,每個人都知道程式碼表達的是“students id”,因而沒必要標出。
function existsStudent(id, list) {[JSCODE_RN]  for(i = 0; i < list.length; i++) {[JSCODE_RN]    student = list;[JSCODE_RN]    [JSCODE_RN]    // Get the student's id[JSCODE_RN]    thisId = student.getId();[JSCODE_RN]    [JSCODE_RN]    if(thisId === id) {[JSCODE_RN]      return true;[JSCODE_RN]    }[JSCODE_RN]  }[JSCODE_RN]  return false;   [JSCODE_RN]}
5、不要在原始碼留下已經刪除的程式,包含那些註解起來的 如果你使用了版本控制,那麼你就可以輕鬆地找回前一個版本的程式碼。如果別人大費周折地讀了你的程式碼,卻發現是要刪除的程式碼,這實在太恨人了。
//function thisReallyHandyFunction() {[JSCODE_RN]//  someMagic();[JSCODE_RN]//  someMoreMagic();[JSCODE_RN]//  magicNumber = evenMoreMagic();[JSCODE_RN]//  return magicNumber;[JSCODE_RN]//}
6、不要有太長的程式碼 看太長的程式碼實在太費勁,尤其是程式碼本身的功能又很小。如下:
public static EnumMap getGroupCategoryDistribution(EnumMap sizes, int groups) {[JSCODE_RN]  EnumMap categoryGroupCounts = new EnumMap(Category.class);[JSCODE_RN]  [JSCODE_RN]  for(Category cat : Category.values()) {[JSCODE_RN]     categoryGroupCounts.put(cat, getCategoryDistribution(sizes.get(cat), groups));[JSCODE_RN]  }[JSCODE_RN]}
我並不是說非要堅持 70 個字元以內,但是一個比較理想的長度是控制在 120 個字元內。如果你把程式碼發佈在網路上,用戶讀起來就很困難。 7、不要在一個功能(或者函數內)有太多行程式碼 我的一個老同事曾經說 Visual C++ 很臭,因為它不允許你在一個函數內擁有超過 10000 行程式碼。我記不清程式碼行數的上限,不知道他說的是否正確,但我很不贊成他的觀點。如果一個函數超過了 50 行,看起來有多費勁你知道麼,還有沒完沒了的 if 迴圈,而且你還的滾動滑鼠前後對照這段程式碼。對我而言,超過 35 行的程式碼理解起來就很困難了。我的建議是超過這個數位就把一個函數程式碼分割成兩個。
作者: linlong3388    時間: 2010-3-21 08:16

謝謝分享~
很正確且受用的文章




歡迎光臨 jsGears.com 技術論壇 - AJAX, JavaScript, jQuery, 網站開發, 前端效能優化 (http://jsgears.com/)