1. 程式人生 > >如何寫好程式碼

如何寫好程式碼

前言

最近在接手別人的專案,看人家的程式碼是痛苦的,尤其是寫的不怎麼樣的程式碼。想到之前看了一本《程式碼整潔之道》,對我影響深遠,便想作此文舒緩一下心情。

如果你是大牛請忽略本文。

什麼是好程式碼

書中說:好的程式碼就是它恰好為解決某一問題而存在。
聽人說:好的程式碼就是給一個應屆畢業生也可以看懂。

我現在深深的秉承 單一職責原則,就這一條足以寫出我認為漂亮的程式碼。
作為一個無名小卒,為了夢想,就算為了後人能看懂,必須好好寫程式碼。

好程式碼是什麼樣子的

舉個抽象的例子,如果程式碼寫成這樣,把所有的邏輯按照順序都堆砌在這個方法中,那麼這段程式碼或許思路清晰,路徑考慮周全,效率非常高,但是這並不算好的程式碼。

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中想要用到自己的資料結構,那麼如何做呢?網上查的結合自