<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          寫(xiě)出好代碼的底層邏輯!

          共 6049字,需瀏覽 13分鐘

           ·

          2024-05-09 11:42

                


          程序員安身立命的手藝就是寫(xiě)代碼,可多少人知道如何才能寫(xiě)出好的代碼呢?這幾年也做過(guò)很多次的代碼 CR,可好代碼的標(biāo)準(zhǔn)在哪里呢?我們?cè)谧?CR 的時(shí)候,其實(shí)只是停留在代碼的表面,主要是跟規(guī)范相關(guān)的點(diǎn):命名、代碼行數(shù)、代碼寫(xiě)法、注釋如何,這些其實(shí)都是可以用 ESLint 做規(guī)范去解決的,也很容易形成習(xí)慣。如果在這個(gè)基礎(chǔ)上,每個(gè)人都做得不錯(cuò)的情況下,那到底什么是決定了代碼的好壞呢?

          在想這個(gè)問(wèn)題之前,我們得想想,我們每天在做的編程這件事到底是什么?

          什么是編程?

          到底什么是編程,知乎上這樣的一個(gè)問(wèn)題,編程的本質(zhì)是什么?

          www.zhihu.com/question/20…[1]

          image

          很多人都給了自己的回答,但我發(fā)現(xiàn)很多回答,要么長(zhǎng)篇大論各種編程范式,要么說(shuō)得特別抽象,比如下面的回答,毫無(wú)指導(dǎo)意義。

          image

          其實(shí),很多人對(duì)于事物本質(zhì)的理解,似乎都有道理,但是我們希望這個(gè)答案可以指導(dǎo)我們編程的行為,知道如何寫(xiě)出好代碼,如果我們從這個(gè)角度來(lái)看,那這個(gè)問(wèn)題的答案就需要非常地具體,可執(zhí)行。

          這么多解釋里,陳皓老師的解釋最為具體,當(dāng)然他也是引用的國(guó)外大佬的研究結(jié)論,但分析得相當(dāng)好。

          image

          簡(jiǎn)單的兩個(gè)公式表達(dá)得比較透徹。

          程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu)

          算法 = 邏輯 + 控制

          程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu)

          我們?cè)趯?xiě)程序的時(shí)候,本質(zhì)都是在寫(xiě)算法和數(shù)據(jù)結(jié)構(gòu),而我發(fā)現(xiàn),大家更多在寫(xiě)代碼的時(shí)候關(guān)注的是算法,而非數(shù)據(jù)結(jié)構(gòu)(數(shù)組、鏈表、棧、隊(duì)列、樹(shù)、圖等),這有可能是大家寫(xiě)不好代碼的第一個(gè)原因。就像 Linux 之父 Linus Torvalds 所說(shuō)的,「糟糕的程序員關(guān)心代碼。好的程序員關(guān)心數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系」。

          我們?cè)谒⑺惴}的時(shí)候,常常會(huì)發(fā)現(xiàn),一個(gè)合適的數(shù)據(jù)結(jié)構(gòu)可以極大地提升算法的效率,比如:

          在 leetcode 上有一個(gè) hard 的題目叫做:基本計(jì)算器

          image

          這個(gè)題如果大家做過(guò)的話,其實(shí)有很多種解法,其中如果不用數(shù)據(jù)結(jié)構(gòu)就會(huì)很復(fù)雜,如果用了棧這種數(shù)據(jù)結(jié)構(gòu),思路就會(huì)比較清晰,尤其是使用雙棧這種數(shù)據(jù)結(jié)構(gòu)。

          因此,如果想成為一個(gè)會(huì)寫(xiě)代碼的程序員,首先記住一點(diǎn),「數(shù)據(jù)比代碼更重要,代碼的唯一目的是轉(zhuǎn)換數(shù)據(jù)」。

          有太多入行前端的同學(xué),并不是計(jì)算機(jī)專業(yè)的,或者沒(méi)有學(xué)過(guò)《數(shù)據(jù)結(jié)構(gòu)》這門課,培訓(xùn)機(jī)構(gòu)的教學(xué)也是以實(shí)戰(zhàn)為主,一上來(lái)就開(kāi)始寫(xiě)代碼,長(zhǎng)久的習(xí)慣導(dǎo)致代碼的優(yōu)化只停留在規(guī)范和格式上。

          算法 = 控制 + 邏輯

          除掉數(shù)據(jù)之外,代碼就只剩下了算法,也就是我們?nèi)粘?xiě)的流程代碼,這部分依然可以拆分為控制和邏輯。這里要分清楚二者的關(guān)系:

          控制 control

          在任何語(yǔ)言中,都有對(duì)應(yīng)的語(yǔ)法操作,比如 if、for、map、reduce 等,這些都是控制語(yǔ)句。還有其他程序執(zhí)行的方式,并行還是串行,同步還是異步,以及調(diào)度不同執(zhí)行路徑或模塊,數(shù)據(jù)之間的存儲(chǔ)關(guān)系,模塊的組織方式,是函數(shù)還是類,多線程、異步、服務(wù)發(fā)現(xiàn)、部署、彈性伸縮等,這些和業(yè)務(wù)邏輯沒(méi)有關(guān)系的部分都是控制。

          邏輯 logic

          邏輯一般指業(yè)務(wù)邏輯,我們把真實(shí)的需求抽象成代碼以后的部分,比如:我們?cè)谧鲇脩舻卿涰?yè)面的時(shí)候,點(diǎn)擊登錄按鈕以后,去判斷下賬號(hào)和密碼是否符合一定的規(guī)則,這就是業(yè)務(wù)邏輯。

          業(yè)務(wù)邏輯就是問(wèn)題的定義,對(duì)于排序問(wèn)題來(lái)講,邏輯就是“什么叫做有序,什么叫大于,什么叫小于,什么叫相等”?控制就是如何合理地安排時(shí)間和空間資源去實(shí)現(xiàn)邏輯。

          兩者的關(guān)系

          • Logic 解決問(wèn)題,它決定了程序的本質(zhì)復(fù)雜度,它是代碼優(yōu)化的下限。
          • Control 只影響效率,控制是代碼優(yōu)化的重點(diǎn),需要盡量地降低復(fù)雜度。
          • Logic 和 Control 沒(méi)有關(guān)系
          • Logic 和 Control 如果分開(kāi),代碼更容易改進(jìn)和維護(hù)。
          image

          底層邏輯:有效地分離 Logic、Control 和 Data 是寫(xiě)出好程序的關(guān)鍵所在

          無(wú)論微觀層面的代碼,還是宏觀層面的架構(gòu),無(wú)論是三種編程范式還是微服務(wù)架構(gòu),它們都在解決一個(gè)問(wèn)題:分離控制和邏輯。

          第一步:選好適合的數(shù)據(jù)結(jié)構(gòu)。

          第二步:做好業(yè)務(wù)邏輯的抽象(流程+模型)。

          第三步:設(shè)計(jì)代碼的控制過(guò)程(編程范式+設(shè)計(jì)模式)。

          例子

          function check_form_x() {
              var name = $('#name').val();
              if (null == name || name.length <= 3) {
                  return { status : 1message'Invalid name' };
              }
           
              var password = $('#password').val();
              if (null == password || password.length <= 8) {
                  return { status : 2message'Invalid password' };
              }
           
              var repeat_password = $('#repeat_password').val();
              if (repeat_password != password.length) {
                  return { status : 3message'Password and repeat password mismatch' };
              }
           
              var email = $('#email').val();
              if (check_email_format(email)) {
                  return { status : 4message'Invalid email' };
              }
           
              ...
           
              return { status : 0message'OK' };
           
          }

          分離后:

          // logic
          var meta_create_user = {
              form_id : 'create_user',
              fields : [
                  { id : 'name'type : 'text'min_length : 3 },
                  { id : 'password'type : 'password'min_length : 8 },
                  { id : 'repeat-password'type : 'password'min_length : 8 },
                  { id : 'email'type : 'email' }
              ]
          };
          // control
          var r = check_form(meta_create_user);

          上面的例子,使用的是表驅(qū)動(dòng)的方法,就是用一個(gè) JSON 的數(shù)據(jù)結(jié)構(gòu)來(lái)描述業(yè)務(wù)需求,再加一個(gè)控制函數(shù),這樣就可以很好的做到了數(shù)據(jù)、邏輯和控制之間的分離,同時(shí)還具備了很好的擴(kuò)展性。

          必備知識(shí)

          代碼解耦的方法有很多,要想寫(xiě)出好代碼,需要掌握一些基礎(chǔ)的理論知識(shí)。下面我列出了需要學(xué)習(xí)的一些必備知識(shí)。

          • 數(shù)據(jù)結(jié)構(gòu):可以通過(guò)學(xué)習(xí)專業(yè)的數(shù)據(jù)結(jié)構(gòu)教材,或者刷算法題來(lái)精進(jìn)。

          • 業(yè)務(wù)邏輯的抽象:多畫(huà)業(yè)務(wù)邏輯圖,流程圖,明確完成一個(gè)邏輯必備的步驟,和可復(fù)用的模型。

          • 控制設(shè)計(jì):

          • 編程范式

          • 命令式

            • 聲明式
            • 函數(shù)式
            • 面向?qū)ο?
          • 設(shè)計(jì)原則 SOLID

          • 單一職責(zé)原則(Single responsibility principle,SRP)

            • 開(kāi)放封閉原則(Open–closed principle,OCP)
            • Liskov 替換原則(Liskov substitution principle,LSP)
            • 接口隔離原則(Interface segregation principle,ISP)
            • 依賴倒置原則(Dependency inversion principle,DIP)
          • 設(shè)計(jì)模式:有很多種設(shè)計(jì)模式,但是真正在前端常用的并不多,大家可以結(jié)合例子,系統(tǒng)性地學(xué)習(xí)。

            • 創(chuàng)建型模式:工廠、單例、創(chuàng)造者模式、原型模式。
            • 結(jié)構(gòu)型模式:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式。
            • 行為型模式:觀察者模式、策略模式、命令模式、迭代器模式、狀態(tài)模式、責(zé)任鏈模式。

          總結(jié)

          上面所描述的寫(xiě)好代碼的底層邏輯,同時(shí)給代碼 CR 提供了一個(gè)比較好的方向,在做 codereview 的時(shí)候,可以多問(wèn)問(wèn)什么是邏輯,什么是控制,是否可以用數(shù)據(jù)結(jié)構(gòu)來(lái)描述業(yè)務(wù),什么樣的數(shù)據(jù)結(jié)構(gòu)是最適合的。

          在設(shè)計(jì)代碼的時(shí)候,也可以問(wèn)一下自己上面的幾個(gè)問(wèn)題。把解耦慢慢變成自己的一個(gè)習(xí)慣,長(zhǎng)此以往代碼會(huì)具有更好的擴(kuò)展性,可讀性和穩(wěn)定性。

          作者:ES2049

          鏈接:https://juejin.cn/post/7348463942404980777

          瀏覽 94
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩成人一区二区在线观看 | 性欧美性爱豆花视频 | 成人性生活片 | 欧美日韩国产综合网 | 久久婷婷综合网 |