首頁>技術>

知乎上有一個問題:你見過最爛程式碼長什麼樣?

有幾個回答,我看完覺的很有意思,分享出來給大家。

知乎使用者@請叫我大叔可好,在給小姐姐修電腦時候,發現了路由器裡的秘密。

知乎使用者@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 塊錢開工紅包,無套路,拼手氣!目前參與的人還不多,趕緊來吧!新年給自己一個驚喜~

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 飛槳(PaddlePaddle)本地環境搭建