1. 
          

          1. 新聞動(dòng)態(tài)

            程序員,四步教你寫(xiě)出簡(jiǎn)單易懂的代碼!

            網(wǎng)站建設 發(fā)布者:cya 2019-12-05 08:57 訪(fǎng)問(wèn)量:87

            作者 | Dan Goslen

            譯者 | 彎月,責編 | maozz
            出品 | CSDN(ID:CSDNnews)


            日常工作過(guò)程中,為了提升處理事情的效率,我們喜歡化繁為簡(jiǎn)。那如何培養出良好的思維模式快速“套出”代碼呢?今天,我們將用OOP模式作為作為范例,為大家提供借鑒的思維模板。

            以下為譯文:
            說(shuō)起編程,我的目標是編寫(xiě)簡(jiǎn)單易懂的代碼。也就是 Bob Martin所說(shuō)的干凈的代碼。也有人稱(chēng)之為可讀或可維護的代碼。其實(shí),這眾多說(shuō)法指的都是同一件事。


            但做到這一點(diǎn)絕非易事!
            編寫(xiě)簡(jiǎn)單易懂的代碼需要周全的考慮。需要通過(guò)不斷的重構,寫(xiě)出正確的代碼。通常還需要同事的審核或結對編程。
            但是,我通過(guò)多年的職業(yè)生涯總結出了一些模式,這些模式可以幫助我編寫(xiě)簡(jiǎn)單易懂的代碼。雖然這些模式不一定會(huì )加快寫(xiě)代碼的速度,也不一定會(huì )降低寫(xiě)代碼的難度,但是可以幫助我寫(xiě)出更簡(jiǎn)單的代碼。
            每當面臨新的問(wèn)題時(shí),我都會(huì )采用這些模式,將問(wèn)題化繁為簡(jiǎn)。

            關(guān)于模式

            簡(jiǎn)單地介紹一下,我所說(shuō)的模式指的是你可能有所耳聞的OOP模式。我知道從很多方面來(lái)說(shuō)OOP已經(jīng)過(guò)時(shí)了,但無(wú)論你喜歡哪種范式,這些模式仍然很實(shí)用。在這些模式中,簡(jiǎn)單的組合重于繼承——繼承恰恰是大多數人討厭OOP的原因。
            本文中提到的大多數模式都源自“四人幫”的著(zhù)作《設計模式》我將在本文中簡(jiǎn)要介紹每種模式,有關(guān)詳細內容我強烈推薦你閱讀這本書(shū)。

            “四人幫”Gang of Four,指Erich Gamma、Richard Helm、Ralph Johnson以及John Vlissides四人。


            抽象工廠(chǎng)

            工廠(chǎng)(Factory )本質(zhì)上是一個(gè)對象,其唯一的工作就是生成其他對象。工廠(chǎng)能夠以不同的方式呈現,但我認為抽象工廠(chǎng)模式非常強大。
            抽象工廠(chǎng)不僅允許你在運行時(shí)更改已生成或已構建的對象,還可以在運行時(shí)更改工廠(chǎng)。雖然聽(tīng)起來(lái)有點(diǎn)迷糊,但是對于Spring或Unity等控制反轉框架來(lái)說(shuō),它確實(shí)非常有效。
            具體的代碼如下所示:
            接口Factory <T> { T build(Metadata d)} 類(lèi)ClientFactory實(shí)現Factory <Client> { Client build(Metadata d){
                    //構建實(shí)際對象并返回
                } }
            每當我需要構建一個(gè)具體的對象,而且這個(gè)對象能夠根據配置與簡(jiǎn)單的接口相匹配時(shí),我都會(huì )嘗試使用抽象工廠(chǎng),并且我不希望使用該對象的其他所有類(lèi)知曉該對象的變化。
            這句話(huà)雖然很長(cháng),但核心思想符合其他軟件工程原理的經(jīng)典思想:即隱藏信息,一個(gè)類(lèi)只做一件事,以及小接口。更直接地說(shuō),抽象工廠(chǎng)有助于隱藏對象的繁瑣工作。



            委托

            我敢說(shuō),我們所有人都遇到過(guò)這樣的項目(無(wú)論是否是編程的工作):我們將某方面的工作委托給其他人,而不是親歷親為。
            通常我們對項目進(jìn)行進(jìn)一步“升級”的時(shí)候,就會(huì )采用委托模式:項目協(xié)調人可能會(huì )將工作委托給一組助理,然后由他們將工作委托給自愿擔任領(lǐng)導的人等。
            代碼中的委托模式也完全相同:高階類(lèi)要求低階類(lèi)為它們工作。這有助于保持高階類(lèi)的簡(jiǎn)單性,并減少對其下層結構的了解。
            具體的代碼如下所示:
            接口Validator { 

                bool validate(Object o)} 類(lèi)ValidatorHelper實(shí)現Validator { Set <Validator>委托;

                bool validate(Object o){ 
                    for(Validator v:委托){ 
                        如果(!v.validate(o))返回false 
                    } 
                    返回true 
                } } 類(lèi)RestController { ValidationHelper helper; 響應addObject(Object o){ 
                    如果(helper.validate(o))返回ErrorResponse //正常處理
                } }

            我發(fā)現委托模式可用于驗證、排序、規范化等操作。常見(jiàn)的使用可能要視特定的數據形式而定,但做出有關(guān)數據決策的類(lèi)不再需要完整地了解委托工作的細枝末節,它只需要知道工作已經(jīng)完成。

            建造/命名參數

            在所有改變了我寫(xiě)代碼方式的模式中,建造模式當屬第一。從一開(kāi)始我就用建造編寫(xiě)每個(gè)DTO(data transfer objects,數據傳輸對象)。生成器不需要大量的實(shí)際工作即可生成靈活且可擴展的代碼,此外它們還具有不可變的好處!
            其他語(yǔ)言可能沒(méi)有(甚至不需要)建造模式,因為它們的構造器中擁有命名參數,且帶有合理的默認值。從本質(zhì)上講,這是一碼事:只聲明需要設置成特定值的東西,而不必擔心其他內容。
            具體的代碼如下所示:
            類(lèi)Dto { 字符串s 
                int我私有Dto(String s,int i){ 
                    this.s = s 
                    this.i = i 
                } public DtoBuilder builder(){ 
                    return new DtoBuilder()
                } 公共靜態(tài)類(lèi)DtoBuilder { 

                    private String s =“一些字符串“ 
                    private int i = 0 public DtoBuilder withString(String s){ 
                        this.s = s 
                        return this 
                    } public DtoBuilder withInt(int it){ 
                        this.i =我
                        返回此
                    } public Dto build(){ 
                        返回新的Dto( s,i)
                    } 
                } }
            注意:在Java中,我們也使用Lombok處理所有的繁瑣代碼。
            這種模式之所以可以讓我的代碼變得如此簡(jiǎn)單,原因是當所有對象都使用一個(gè)生成器時(shí),就可以自動(dòng)化新對象的生成。在我們的代碼庫中,我們總會(huì )向需要構建的類(lèi)添加一個(gè)靜態(tài)工廠(chǎng)方法,以返回生成器。
            之后,我們只需遵循流暢的API鏈,傳入變量,然后鍵入.build()。僅此而已。你無(wú)需花時(shí)間研究構造函數。你甚至不需要查看建造代碼。你可以在寫(xiě)代碼的時(shí)候隨時(shí)使用?,F代IDE中的自動(dòng)補齊功能可以告訴你哪些變量。非常簡(jiǎn)單。

            增強器(Enricher)

            《設計模式》中沒(méi)有提及這種模式,但它與責任鏈和模板方法的關(guān)系最密切。在這種模式下,每個(gè)“鏈”都可以增強或擴充一個(gè)對象,并將增強后的對象返回給調用者。它可以對鏈中的每個(gè)增強器都進(jìn)行這種操作,而鏈也可以決定在需要時(shí)跳過(guò)鏈的其余部分。
            你可能會(huì )認為這種做法會(huì )違反“干凈的代碼”中有關(guān)函數副作用的規則。而我認為這并沒(méi)有違反這些原則的原因在于,增強器必須將增強后的對象返回給調用者,因此在很多時(shí)候,它只是在聲明對象可能會(huì )變化。
            調用者都知道,它可能是一個(gè)新對象(尤其是在不可變約束的情況下)。
            接口Enricher <T> { T rich(T something); } 類(lèi)HeadersEnricher實(shí)現Enricher <Headers> { 

                標頭
                    rich(Headers標頭){ headers.add(“ x-header”,“某物”)
                    返回標頭
                } }
            我發(fā)現當你需要用新?tīng)顟B(tài)增強一個(gè)對象時(shí),這種模式尤其管用。例如,如果你有一個(gè)來(lái)自Kafka流的對象,需要將一些數據添加到數據庫中,然后再保存到數據倉庫中,那么就可以考慮增強器模式。


            以上這些只是我在編寫(xiě)簡(jiǎn)單易懂的代碼時(shí),最喜歡的一部分模式。我無(wú)法在一篇文章中介紹日常編程工作中使用的所有模式。
            希望通過(guò)本文的介紹為你的編程工具錦上添花。
            編程快樂(lè )!
            原文:
            https://levelup.gitconnected.com/my-top-4-patterns-for-writing-simple-code-466705ac0b97


            關(guān)鍵字: 網(wǎng)站建設 晨展科技

            文章連接: http://www.gostscript.com/wzjss/633.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.