如何寫好程式碼
前言
最近在接手別人的專案,看人家的程式碼是痛苦的,尤其是寫的不怎麼樣的程式碼。想到之前看了一本《程式碼整潔之道》,對我影響深遠,便想作此文舒緩一下心情。
如果你是大牛請忽略本文。
什麼是好程式碼
書中說:好的程式碼就是它恰好為解決某一問題而存在。
聽人說:好的程式碼就是給一個應屆畢業生也可以看懂。
我現在深深的秉承 單一職責原則,就這一條足以寫出我認為漂亮的程式碼。
作為一個無名小卒,為了夢想,就算為了後人能看懂,必須好好寫程式碼。
好程式碼是什麼樣子的
舉個抽象的例子,如果程式碼寫成這樣,把所有的邏輯按照順序都堆砌在這個方法中,那麼這段程式碼或許思路清晰,路徑考慮周全,效率非常高,但是這並不算好的程式碼。
public class MechandiseManager{
private static final Integer TYPE_ONE = 1;
private static final String CODE_EXAMPLE_DELICIOUS = "delicious";
private static final String MAP_KEY_EXAMPLE = "key";
private static volatile boolean running = false;
@Autowired
private static SomeService someService;
public static GoodsParam setGoodParam(String code,Integer id, Float price, Integer type) throws Exception{
GoodsParam goodParam = new FoodParam();
goodParam.setCode(code);
goodParam.setXXId(id);
if(type.equals("1")){
if(){
//shit mass
}else {
//shit mass
}
for(int i=0;i<SOME;i++){
map.get("field1");
}
}else{
String val = someDataMap.get(obj.getSomeField());
if(val==SOME || ((CONDITION2)&&(CONDITION3))){
//shit mass
Data data = someService.selectSomeData();
for(){
}
}else{
//shit mass
if(){
}
}
}
if(){
//businsess
}
return goodParam ;
}
}
分析程式碼
程式碼中if條件語義不是非常人性化,分支混亂,本來是處理Goods的引數的,混雜太多條件,寫的人或許過一段時間再來,就看的雲裡霧裡,更別指望別人來給他改BUG。不過,該程式碼值得參考的地方在於設定了一些可讀性強的常量。
改進程式碼
public static GoodsParam setGoodParam(String code,Integer id, Float price, Integer type) throws Exception{
GoodsParam goodParam = new FoodParam();
goodParam.setCode(code);
goodParam.setXXId(id);
if(type.equals(TYPE_ONE)){
processSomething(goodParam);
}else{
String val = someDataMap.get(MAP_KEY_EXAMPLE);
processAnotherThing(goodsParam,val);
}
if(){
//businsess
}
return goodParam ;
}
再次改進
public static GoodsParam setGoodParam(String code,Integer id, Float price, Integer type) throws Exception{
GoodsParam goodParam = new FoodParam();
goodParam.setCode(code);
goodParam.setXXId(id);
if(isTypeONE(type)){
processSomething(goodParam);
}else{
processAnotherThing(goodsParam,val);
}
thenProcessSomeThing();
return goodParam ;
}
public static boolean isTypeONE(Integer type){
return type.equals(TYPE_ONE);
}
終極改進
public static GoodsParam setGoodParam(String code,Integer id, Float price, Integer type) throws Exception{
GoodsParam goodParam = new FoodParam();
goodParam.setCode(code);
goodParam.setXXId(id);
processType(goodParam );
thenProcessSomeThing();
return goodParam ;
}
多學習開源專案
以下節選自Spring框架的內部原始碼:
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
再看一個DispatcherServlet的原始碼:
protected void onRefresh(ApplicationContext context) throws BeansException {
initStrategies(context);
}
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize
* further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
}
有沒有覺得非常清晰,一步一步,非常震撼,當時見到的時候真的覺得自己寫的程式碼寫的就是Shit…
總結
個人總結:寫程式碼並不是一下子就能寫出那麼漂亮而簡潔的程式碼,在寫的過程中,要像寫文章一樣思考,而不是記流水賬一樣,想到哪裡就寫到哪裡,先把邏輯寫完,然後回顧程式碼,看看能不能把那些分支,迴圈儘可能簡化,例如把每一個判斷都儘可能讓人看懂,用一個函式表達他的含義,這樣函式呼叫函式,層次分明,看著就知道哪一步是做什麼,哪一步又需要處理什麼,一目瞭然。以後再檢視自己的程式碼或者別人維護你的程式碼時,自頂向下,由主幹要枝葉,條理清晰,神清氣爽。
在下無名小卒,但願能 make you impressive.
相關推薦
怎樣才能寫好程式碼
先上幾張圖片,欣賞欣賞 雖然書本都快爛掉,但物主還是很愛護她,收藏他。 雖然只有一頁,還是保留下來。 這張照片是我去圓明園玩,拍下的,雖然字很多,但是沒有一個錯別字。 可能有些小夥伴有點疑惑,今天談論的是如何寫好程式碼,但是怎麼給我們看這些東西,其實不然。 毛筆
程式設計師,除了寫好程式碼,你更應該學會這些!
程式設計師必備軟技能是現今比較熱議的話題,除了寫好程式碼之外,你知道如何在身體上、精神上和心靈上更強大、更健康?一個程式設計師的成長,又離不開哪些軟技能呢? 首先,我們來了解一下,什麼是軟技能: 軟技能就是啟用人資的能力,即是調動別人的資源和知識的能力以及調動自己知識
如何寫好程式碼?你必須知道的幾個原則
簡介 編輯技術裡,靈魂之上的東西某過於設計模式。設計模式之上的東西其實就是純粹的準則。基於準則之上的程式碼才有靈魂可言,經得起推敲,也經得起考驗。 單一職責原則 定義 就一個類而言,應當僅有一個引起它變化的原因。 說明 所謂單一職責就是一個類設計之初它所在職責就
mybatis-generator程式碼快速自動生成(已經寫好程式碼給你了)
mybatis-generator程式碼快速自動生成: 沒有實習之前寫的MyBatis的Mapping.XML都是手寫的,實習老大教了如何快速利用mybatis-generator程式碼自動生成工具來快速書寫xml,現在分享給大家。 1.首先,我先建立一個stu
如何寫好程式碼
前言 最近在接手別人的專案,看人家的程式碼是痛苦的,尤其是寫的不怎麼樣的程式碼。想到之前看了一本《程式碼整潔之道》,對我影響深遠,便想作此文舒緩一下心情。 如果你是大牛請忽略本文。 什麼是好程式碼 書中說:好的程式碼就是它恰好為解決某一問題
程式設計師,除了寫好程式碼,你更應該看5月的這十篇熱門文章!
1.華為、阿里、網易員工下班時間大曝光,靠加班,你是贏不了他們的你見過凌晨 4 點的洛杉磯嗎?沒有,但我見過凌晨兩點還在燈火通明的寫字樓。2.華為資深工程師:碼農很多,但程式設計師並不多IT 時代的膨脹已經讓編碼工作如同文藝復興時的印刷匠一樣,門檻越來越低。3.為什麼一定要給
架構漫談(八):從架構的角度看如何寫好程式碼
架構漫談是由資深架構師王概凱Kevin執筆的系列專欄,專欄將會以Kevin的架構經驗為基礎,逐步討論什麼是架構、怎樣做好架構、軟體架構如何落地、如何寫好程式等問題。 本文是漫談架構專欄的第八篇,作者Kevin舉例介紹瞭如何寫好程式碼。當我們有了好的架構,那就需要考慮如何
如何寫好程式碼?
想要的都擁有,失去的都釋懷,2020鼠於你 內容目錄 1,寫程式碼容易嗎2,設計模式3,軟體生命週期4,技術業務架構5,輪子6,開源7,真相 1,寫程式碼容易嗎 程式碼容易寫,也不容易寫。但做人不能一直太中立,那我選擇好程式碼不容易寫吧。比如會寫字,不一定能寫出詩歌詞賦。但你說寫字難嗎,對
開始java程式碼的 編寫(續02:前端 ,我們採用的是 非同步提交的 就是實現 了前後端的分離 前端就寫好HTML)
後端接到 前端的html 了就 使用jquery 完成了 拓展 前端業務的熟悉與運用 使用json ajax 的請求 來實現非同步的 效果 顧及了 使用者的體驗使用 開始編寫========================》視訊: 聽講: 筆記 啟動 tomcat 的 在 像 以前一樣的
程式設計師每天寫出好程式碼的5大方法
來源:https://www.ysslc.com/shangye/keji/1263684.html 有不少的程式設計師天天寫程式碼,但是還是被自己的程式碼醜哭了。 有些好的程式碼具有易理解、可擴充套件、易維護的特點,簡直是人見人愛。 就像運動員每天鍛鍊一樣,每
風流三月1-風流不羈的寫一手好程式碼
幾個思考? SpringBoot什麼時候誕生?從哪兒來?用來做什麼? 為什麼我們要採用SpringBoot?-why 怎麼去使用?代價是什麼? 誕生背景 2012 年 10 月,Mike Youn
程式碼的印象派:寫點好程式碼吧
最近有一位獵頭顧問打電話詢問是否有換工作的意向,對推薦的公司和職位的描述為:"我們這裡有一家非常關注軟體質量的公司,在尋找一位不僅能完成有挑戰的軟體開發任務,並且還對程式碼質量有非常高追求的軟體工程師。"。 很難得獵頭顧問會以這樣的切入點來推薦職位,而不是諸如 "我們是網際網路公司","我們是著名網際網路公
掌握好寫js程式碼相應的除錯工具之——火狐除錯工具-DevTools
咱們做寫js程式碼的時候,遇到的一個最大的問題就是除錯問題,很多開發者在寫js程式碼的時候,經常都非常痛苦。但是我們如果掌握好相應的除錯工具,那麼就可以比較遊刃有餘的解決js的除錯問題。工欲善其事,必先利其器。
「傻瓜」才能寫出好程式碼!
作者 | Esteban Gabriel譯者 | 彎月責編 | 仲培藝出品 | CSDN(ID:CSDNnews) 我覺得自己沒有想象中那麼聰明,而且還是一個健忘的人。正因如此,我寫的程式碼才能一天比一天好,想知道為什麼嗎? 在過去的九個月裡,我暗暗下定決心要成
為什麼程式設計師寫不出好程式碼?
每個開發者在編碼時,都希望程式碼像水管的水一樣源源不斷的流出,思緒不被打斷。但在現實開發中,經常會由於一些事情突然中止或停下。本文就總結了現實工作中,影響編碼進度的15個“攔路虎”。 1.開會 停止手頭的編碼工作,去參加會議。程式設計師或許不會相信,他們可能已經在會議室花費了數週或數年
說說寫好的PHP程式碼如何在wampserver上怎麼執行
首先你需要下一個wampserver,至於如何下,就看你們自己了··· 在這裡我只介紹如何在wampserver上執行你寫好的PHP程式碼。 首先你要保證你的wampserver配置成功,如果不會配置
把程式碼寫好是一件值得你一生追求的事
一年一度的高中畢業生填簡歷的日子即將就要到了,又有很多人問計算機專業的事情。其實我從心底裡覺得,高考後才來問這個,已經完了一大半了。當然另一小半十分有前途的人可以在大學四年趕上來,不過估計他們還是要讀個研究生,才能把自己訓練成能用的碼農。 程式設計是一件很難的事情。當然
async太好用了,用了兩個小時寫的程式碼
/* 從5442網站上把所有的熱門推薦下載下來 async+cheerio+request */ const util = require('util'); const request = require('request'); const http = require
{@link}與@see的簡單使用以及區別--如何寫好Java程式碼註釋。
寫程式碼的時候,有時候,你需要寫一些註釋,把內容相互關聯起來,方便自己或別人看的時候,可以直接找到你關聯的程式碼類或者啥的。 這個時候,{@link}與@see,這2個javadoc註解就派上用場了,
在IDEA中使用自己寫好的Java程式碼
之前在Idea中用Java寫了一個包,叫MyDataStructures,包含了一些自己寫的資料結構的實現方法,在之後的工程MyAlgorithms中想要用到自己的資料結構,那麼如何做呢?網上查的結合自