1. 程式人生 > >什麼是好程式碼?

什麼是好程式碼?

點選上方“程式設計師小灰”,選擇“置頂公眾號”

有趣有內涵的文章第一時間送達!

本文轉載自公眾號  碼農翻身

“什麼狗屁程式碼,老子看了幾個小時也沒明白!”

“這麼爛的程式碼,到底是誰寫的!”

Bob大叔說:“衡量程式碼質量的唯一標準是閱讀該程式碼時說髒話的次數”, 真是很有趣的說法。

640?wx_fmt=jpeg

什麼是好的程式碼? 這個問題可能是仁者見仁,智者見智。我先說說我的看法,歡迎大家留言討論。

我個人覺得好程式碼分為兩個層面, 一個是道,一個術。

1好程式碼之“道”

“道”這裡指的設計,是對問題本質的洞察,是良好的抽象。

對一個好的系統設計來說,我覺得有這麼一個重要的特點: 系統由幾個基本的概念組成,這幾個概念體現了系統的本質,形成了系統的骨架,他們非常地穩定,生命週期很長。

系統的其他程式碼圍繞著這幾個基本概念生長,變化,擴充套件,不斷地演進。

舉個例子, Linus 把Git的資料結構設計得非常精良,據說在之後十年的開發中,feature 擴充套件了無數,基礎資料結構卻很少變動。

我相信Linus在開發第一版Git的時候,肯定對它要解決的問題--分散式原始碼配置管理--有著深刻的洞察,實際上Linux核心的開發就是一個典型的、分散式的架構和流程, Linus要做的就是建立一個匹配這個流程的工具,基於對問題的深刻理解,他設計出了Git的系統骨架。

正所謂“簡約而不簡單”。

但是“道”這個東西太虛無縹緲了,有沒有一些可以真正指導我們做設計的準則?

在面向物件程式設計的領域,這個道就是面向物件的設計原則,Robert Mafrtin在《敏捷軟體開發 原則、模式與實踐》中總結了SOLID原則。

Single responsibility principle : 單一職責原則

Open/closed principle :開閉原則

Liskov substitution principle :Liskov替換原則

Interface segregation principle :介面隔離原則

Dependency inversion principle : 依賴反轉原則

如果我們設計出的類能滿足這些原則,就不會有僵化、脆弱、重複、晦澀等種種可以導致程式碼腐化的問題。程式碼就容易擴充套件,生命力就會長久。 

但是這些核心的、優美的設計很有可能在進度的壓力下出問題:做個簡單粗暴的修改,就能省好幾天功夫,不用晚上加班了, 很少人能經受這樣的巨大誘惑。 所以要堅決守住這些核心的設計,防止腐化。

如果你做的是基礎元件的開發,為別人提供服務和API,那必須在設計層面狠下功夫才行,因為API的每次變化都會極大地影響上層應用。

很多人使用Spring做業務軟體開發,使用的無非就是Controller, Service, DAO這樣已經劃分好的結構,增刪改查就搞定了,似乎感受不到設計帶來的力量。 但我相信,系統中或多或少隱藏著幾個核心的資料結構,你只是沒有注意到而已。

如果業務很複雜,不要讓他們分散在系統的各個地方,要對他們做抽象,形成一套可以獨立的,不依賴框架的,生命力長久的業務模型。

2術:寫程式碼的十八般武器

術就是編寫程式碼時的具體技巧和最佳實踐。 

這些技巧和實踐在很多書中都有描述,比如《Effective Java》中提到的很多:

使可變性最小化

介面優於抽象類

優先考慮泛型

通過介面引用物件

遵守普遍接受的命名慣例

......

再比如《編寫可讀程式碼的藝術》和《程式碼簡潔之道中》總結的技巧:

避免if巢狀的層次過深,形成“金字塔”程式碼

區域性變數申明儘可能靠近使用的地方

如有可能,儘可能用常量

減少控制流變數

拆分超長表示式

函式應該短小,只做一件事情

把過多的引數封裝成類

......

把這些“術”應用到程式設計當中,會讓程式碼更加的專業。

很明顯,這些技巧和實踐比較容易學習,程式設計師學會了一門語言以後,應該去掌握它們,讓自己的程式碼變得簡潔可讀。

相對於“術”,“悟道”就難得多,洞察問題本質,做出良好抽象,遵循設計原則,這都是內功,都需要不斷修煉。 

但是這些“道”直接決定了系統的未來方向,設計得不好,再多的“術”也於事無補。

—————END—————

喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容

640?wx_fmt=jpeg

相關推薦

怎樣才能寫程式碼

先上幾張圖片,欣賞欣賞 雖然書本都快爛掉,但物主還是很愛護她,收藏他。 雖然只有一頁,還是保留下來。 這張照片是我去圓明園玩,拍下的,雖然字很多,但是沒有一個錯別字。 可能有些小夥伴有點疑惑,今天談論的是如何寫好程式碼,但是怎麼給我們看這些東西,其實不然。 毛筆

程式設計師每天寫出程式碼的5大方法

來源:https://www.ysslc.com/shangye/keji/1263684.html 有不少的程式設計師天天寫程式碼,但是還是被自己的程式碼醜哭了。 有些好的程式碼具有易理解、可擴充套件、易維護的特點,簡直是人見人愛。 就像運動員每天鍛鍊一樣,每

程式設計師,除了寫程式碼,你更應該學會這些!

程式設計師必備軟技能是現今比較熱議的話題,除了寫好程式碼之外,你知道如何在身體上、精神上和心靈上更強大、更健康?一個程式設計師的成長,又離不開哪些軟技能呢? 首先,我們來了解一下,什麼是軟技能: 軟技能就是啟用人資的能力,即是調動別人的資源和知識的能力以及調動自己知識

程式碼是管出來的——使用Jenkins搭建CI伺服器

  Jenkins是一個開源的跨平臺的CI工具,它可以部署在Windows、Linux等平臺上,並且Jenkins提供了非常豐富的外掛來幫助完成編譯、測試、部署等工作。  本文將介紹在Windows平臺上使用Jenkins完成.Net Core應用的持續整合環境搭建,其主要內容有: Jenkins下載與

風流三月1-風流不羈的寫一手程式碼

幾個思考? SpringBoot什麼時候誕生?從哪兒來?用來做什麼? 為什麼我們要採用SpringBoot?-why 怎麼去使用?代價是什麼? 誕生背景 2012 年 10 月,Mike Youn

如何寫程式碼?你必須知道的幾個原則

簡介 編輯技術裡,靈魂之上的東西某過於設計模式。設計模式之上的東西其實就是純粹的準則。基於準則之上的程式碼才有靈魂可言,經得起推敲,也經得起考驗。 單一職責原則 定義 就一個類而言,應當僅有一個引起它變化的原因。 說明 所謂單一職責就是一個類設計之初它所在職責就

mybatis-generator程式碼快速自動生成(已經寫程式碼給你了)

mybatis-generator程式碼快速自動生成: 沒有實習之前寫的MyBatis的Mapping.XML都是手寫的,實習老大教了如何快速利用mybatis-generator程式碼自動生成工具來快速書寫xml,現在分享給大家。 1.首先,我先建立一個stu

什麼樣的程式碼才是程式碼

一篇好的程式碼,就如同一篇好的文章,結構合理,重點清晰,通俗易懂。積累了足夠多的編碼經驗,在完成功能之餘,自然會追求自己的程式碼更“好看”一些,接下來就談談我對於“好程式碼”的理解。 遵循規範 沒有規矩,不成方圓,遵循編碼規範,是最基本的素養。在公司,一般都會有公司規定的若干規範,在編碼時,時刻提醒要遵循這些

【吹滅讀書燈,一身都是月】背的一手 程式碼

專欄達人 授予成功建立個人部落格專欄

編寫程式碼:如何減少程式碼的認知負荷

Bug 少,效能好,容易修改。好的程式碼影響深遠,而且它可能是產生 10 倍工作效率的開發者的主要原因。儘管好程式碼十分重要,但開發新手卻不得要領。關於這一主題的技巧多而冗雜,讓新手們如何記得住?“《程式碼大全》)” 是這個主題的經典,但內容多達 960 頁! 我認

程式碼的印象派:寫點程式碼

最近有一位獵頭顧問打電話詢問是否有換工作的意向,對推薦的公司和職位的描述為:"我們這裡有一家非常關注軟體質量的公司,在尋找一位不僅能完成有挑戰的軟體開發任務,並且還對程式碼質量有非常高追求的軟體工程師。"。 很難得獵頭顧問會以這樣的切入點來推薦職位,而不是諸如 "我們是網際網路公司","我們是著名網際網路公

「傻瓜」才能寫出程式碼

作者 | Esteban Gabriel譯者 | 彎月責編 | 仲培藝出品 | CSDN(ID:CSDNnews) 我覺得自己沒有想象中那麼聰明,而且還是一個健忘的人。正因如此,我寫的程式碼才能一天比一天好,想知道為什麼嗎? 在過去的九個月裡,我暗暗下定決心要成

為什麼程式設計師寫不出程式碼

每個開發者在編碼時,都希望程式碼像水管的水一樣源源不斷的流出,思緒不被打斷。但在現實開發中,經常會由於一些事情突然中止或停下。本文就總結了現實工作中,影響編碼進度的15個“攔路虎”。 1.開會 停止手頭的編碼工作,去參加會議。程式設計師或許不會相信,他們可能已經在會議室花費了數週或數年

什麼是程式碼

點選上方“程式設計師小灰”,選擇“置頂公眾號”有趣有內涵的文章第一時間送達!本文轉載自公眾號 

如何寫程式碼

前言 最近在接手別人的專案,看人家的程式碼是痛苦的,尤其是寫的不怎麼樣的程式碼。想到之前看了一本《程式碼整潔之道》,對我影響深遠,便想作此文舒緩一下心情。 如果你是大牛請忽略本文。 什麼是好程式碼 書中說:好的程式碼就是它恰好為解決某一問題

程式碼的標準

什麼是好的程式碼呢?我一直在考慮這個問題。 好的程式碼,應當具有一些特點: 邏輯簡單:最直觀,最容易理解,最合邏輯的方案,一般是最好的方案。 易擴充套件:封裝住可能的變化。 模組化:對模組外是黑盒。 單一功能:不做分外的事。高內聚。 易除錯:容易定位問題,修復程式。有詳細

開源程式碼 音視訊

VirtualDub 一、簡介 圖1VirtualDub主介面 VirtualDub是一款開源的音視訊捕獲、處理軟體。VirtualDub也可稱為一款多媒體編輯軟體,因為它包含了多媒體輸入、編輯、處理、輸出等各個環節,但是作者並未將它定位為一款多媒體編輯軟體(參

程式設計師,除了寫程式碼,你更應該看5月的這十篇熱門文章!

1.華為、阿里、網易員工下班時間大曝光,靠加班,你是贏不了他們的你見過凌晨 4 點的洛杉磯嗎?沒有,但我見過凌晨兩點還在燈火通明的寫字樓。2.華為資深工程師:碼農很多,但程式設計師並不多IT 時代的膨脹已經讓編碼工作如同文藝復興時的印刷匠一樣,門檻越來越低。3.為什麼一定要給

FAS ------ 一顆好奇心,一頁程式碼

快速排序面試題記錄–從小到大排序 快速排序每次遞迴確定一個樞紐元素下表,樞紐元素就是位置確定下來已經排好序的元素,樞紐元素左邊的元素都大於等於樞紐元素,右邊的元素都小於等於樞紐元素。 下面是c++的

架構漫談(八):從架構的角度看如何寫程式碼

架構漫談是由資深架構師王概凱Kevin執筆的系列專欄,專欄將會以Kevin的架構經驗為基礎,逐步討論什麼是架構、怎樣做好架構、軟體架構如何落地、如何寫好程式等問題。 本文是漫談架構專欄的第八篇,作者Kevin舉例介紹瞭如何寫好程式碼。當我們有了好的架構,那就需要考慮如何