知乎上有一個問題:你見過最爛程式碼長什麼樣?
有幾個回答,我看完覺的很有意思,分享出來給大家。
知乎使用者@請叫我大叔可好,在給小姐姐修電腦時候,發現了路由器裡的秘密。
知乎使用者@jack60506 入職第二天就離職了,因為看到下面的程式碼。
還有,判斷奇偶數的程式碼,有網友是這樣寫的,我看完直呼行家。
魯迅說:
好程式碼的樣子千篇一律,它們是遵循程式碼規範的工業級產品。
壞程式碼的樣子各不相同,體現了程式設計師個性鮮明的編碼癖好。
我沒說過這話,不過確實在理!~魯迅_在理_魯迅_這話_確實_不過表情
有些人表示不服,要給壞程式碼正名,他們強調:壞程式碼也該有屬於自己的編碼規範!
這不,還真編寫起了規範,並且在 github 上開源出來了,專案地址:https://github.com/trekhleb/state-of-the-art-shitcode
這個專案的作者,以 JavaScript 為例,手把手教你寫出壞程式碼,可謂非常用心,其他語言請自行觸類旁通。
下面摘錄部分規範原文我在 github 上看到作者列出了一些寫出壞程式碼的準則。
以一種程式碼已經被混淆的方式命名變數如果我們鍵入的東西越少,那麼就有越多的時間去思考程式碼邏輯等問題。
Good
let a = 42;
Bad
let age = 42;
變數/函式混合命名風格
為不同慶祝一下。
Good
let wWidth = 640;let w_height = 480;
Bad
let windowWidth = 640;let windowHeight = 480;
不要寫註釋反正沒人會讀你的程式碼。
Good
const cdr = 700;
Bad
// 700ms的數量是根據UX A/B測試結果進行經驗計算的。// @檢視: <詳細解釋700的一個連結>const callbackDebounceRate = 700;
使用母語寫註釋
如果您違反了“無註釋”原則,那麼至少嘗試用一種不同於您用來編寫程式碼的語言來編寫註釋。如果你的母語是英語,你可能會違反這個原則。
Good
// Закриваємо модальне віконечко при виникненні помилки.toggleModal(false);
Bad
// 隱藏錯誤彈窗toggleModal(false);
儘可能混合不同的格式
為不同慶祝一下。
Good
let i = ['tomato', 'onion', 'mushrooms'];let d = [ "ketchup", "mayonnaise" ];```_Bad _```javascriptlet ingredients = ['tomato', 'onion', 'mushrooms'];let dressings = ['ketchup', 'mayonnaise'];
儘可能把程式碼寫成一行Good
document.location.search.replace(/(^\?)/,'').split('&').reduce(function(o,n){n=n.split('=');o[n[0]]=n[1];return o},{})
Bad
document.location.search .replace(/(^\?)/, '') .split('&') .reduce((searchParams, keyValuePair) => { keyValuePair = keyValuePair.split('='); searchParams[keyValuePair[0]] = keyValuePair[1]; return searchParams; }, {})
不要處理錯誤
無論何時發現錯誤,都沒有必要讓任何人知道它。沒有日誌,沒有錯誤彈框。
Good
try { // 意料之外的情況。} catch (error) { // tss... }
Bad
try { // 意料之外的情況。} catch (error) { setErrorMessage(error.message); // and/or logError(error);}
廣泛使用全域性變數
全球化的原則。
Good
let x = 5;function square() { x = x ** 2;}square(); // 現在x是25
Bad
let x = 5;function square(num) { return num ** 2;}x = square(x); // 現在x是25
建立你不會使用的變數以防萬一。
Good
function sum(a, b, c) { const timeout = 1300; const result = a + b; return a + b;}
Bad
function sum(a, b) { return a + b;}
如果語言允許,不要指定型別和/或不執行型別檢查。
Good
function sum(a, b) { return a + b;}// 在這裡享受沒有註釋的快樂const guessWhat = sum([], {}); // -> "[object Object]"const guessWhatAgain = sum({}, []); // -> 0
Bad
function sum(a: number, b: number): ?number { // 當我們在JS中不做置換和/或流型別檢查時,覆蓋這種情況。 if (typeof a !== 'number' && typeof b !== 'number') { return undefined; } return a + b;}// 這個應該在轉換/編譯期間失敗。const guessWhat = sum([], {}); // -> undefined
你應該有不能到達的程式碼
這是你的 "Plan B".
Good
function square(num) { if (typeof num === 'undefined') { return undefined; } else { return num ** 2; } return null; // 這就是我的"Plan B".}
Bad
function square(num) { if (typeof num === 'undefined') { return undefined; } return num ** 2;}
三角法則
就像鳥巢,鳥巢,鳥巢。
Good
function someFunction() { if (condition1) { if (condition2) { asyncFunction(params, (result) => { if (result) { for (;;) { if (condition3) { } } } }) } }}
Bad
async function someFunction() { if (!condition1 || !condition2) { return; } const result = await asyncFunction(params); if (!result) { return; } for (;;) { if (condition3) { } }}
混合縮排
避免縮排,因為它們會使複雜的程式碼在編輯器中佔用更多的空間。如果你不喜歡迴避他們,那就和他們搗亂。
Good
const fruits = ['apple', 'orange', 'grape', 'pineapple']; const toppings = ['syrup', 'cream', 'jam', 'chocolate'];const desserts = [];fruits.forEach(fruit => {toppings.forEach(topping => { desserts.push([fruit,topping]); });})
Bad
const fruits = ['apple', 'orange', 'grape', 'pineapple'];const toppings = ['syrup', 'cream', 'jam', 'chocolate'];const desserts = [];fruits.forEach(fruit => { toppings.forEach(topping => { desserts.push([fruit, topping]); });})
不要鎖住你的依賴項
以非受控方式更新每個新安裝的依賴項。為什麼堅持使用過去的版本,讓我們使用最先進的庫版本。
Good
$ ls -lapackage.json
Bad
$ ls -lapackage.jsonpackage-lock.json
函式長的比短的好不要把程式邏輯分成可讀的部分。如果IDE的搜尋停止,而您無法找到所需的檔案或函式,該怎麼辦?
一個檔案中10000行程式碼是OK的。一個函式體有1000行程式碼是OK的。在一個' service.js ' 中處理許多服務(第三方庫和內部庫、一些工具、手寫的資料庫ORM和jQuery滑塊)? 這是OK的。不要測試你的程式碼這是重複且不需要的工作。
避免程式碼風格統一編寫您想要的程式碼,特別是在一個團隊中有多個開發人員的情況下。這是“自由”原則。
構建新專案不需要 README 文件一開始我們就應該保持。
以上規範,各位程式設計師務必遵守,並在團隊內廣為宣傳(別說我教的),假以時日,必能收穫最爛程式碼!
說點正事如今的大型商業軟體系統程式碼量巨大,早已不是憑藉一人之力可以完成,當然程式設計師江湖中那些天才選手除外,比如:
當然了,這些故事聽聽就好,這是大部分我等普通碼農難以企及的高度。
工作擰螺絲是大部分程式設計師的工作常態,只是軟體開發流水線中的一枚螺絲釘,如何協調螺絲釘造好大飛機?
答案是:程式碼規範
當然這裡所說,是正經的好程式碼規範,團隊遵循程式碼規範,更容易寫出可讀性高、易維護的程式碼,極大提高生產效率。
谷歌開源的程式碼規範,就是不錯的選擇,規範目前包含: C++\Object-C\Python\Shell\Javascript 這 5 種程式語言,風格指南,感興趣的讀者,可以在我下面這篇文章檢視:
發了年終獎,給大家發 3000 塊錢開工紅包,無套路,拼手氣!目前參與的人還不多,趕緊來吧!新年給自己一個驚喜~