日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

梳理拯救烂怂代码?我是这么做的

發布時間:2024/4/6 windows 48 coder
生活随笔 收集整理的這篇文章主要介紹了 梳理拯救烂怂代码?我是这么做的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分享是最有效的學習方式。

博客:https://blog.ktdaddy.com/

故事

這幾天的小貓心情還不錯,修完了"冪等事件的bug",填完了"緩存擊穿的坑",前兩天組長交代給他的“整理一份系統現狀報告”任務也算是有了思路,陰霾終于散去。好像一切都朝著好的方向發展了。是的,也該過去了,畢竟這些事情折磨小貓都快個把月了。

這天,小貓提著兩杯咖啡找到了產品經理,本來么,禮多人不怪,這不效果就來了么。

“......整個業務背景呢,其實也就是這樣了,然后后面有啥其他問題,也歡迎隨時問,知無不答”。產品老汪和小貓足足聊了一半個小時,唾沫星子橫飛,似乎還有點意猶未盡。

“嗯嗯,謝謝了,汪哥,耽誤你時間了。”

“沒事兒,不用客氣,不過提醒你一下,當前系統經過太多開發的手了,系統代碼得好好看看,聽說初版本的時候都是外包搞的。你懂得......”

“嗯嗯,好,太感謝了” 小貓連連點頭,老汪的話倒是提醒了他。

內心開始嘀咕,“哎。看來搞定各種模型關系,業務背景也還是不行啊,面對現實吧,爛慫代碼還是得梳理一下的,當前系統的接口定義、以及類的封裝貌似都挺亂的......”

開啟“類圖”之旅

說到對系統代碼中的模型梳理,其實最好的方式還是使用UML類圖。上個章節中老貓沒有展開和大家分享UML類圖,一個是由于篇幅的原因,第二個是老貓覺得類圖對于咱們后續閱讀框架源碼以及底層設計模式有著相當大的幫助,所以很有必要將其作為單獨一篇來和大家分享。如下概要:

類圖的簡介

類圖是什么呢?比較專業一點的說法:在軟件工程中,類圖是一種靜態的結構圖,描述了系統的類的集合,類的屬性和類之間的關系,可以簡化了人們對系統的理解;類圖是系統分析和設計階段的重要產物,是系統編碼和測試的重要模型。

其實不僅僅是軟件工程中,其他很多時候需要理清復雜關系的時候,咱們也可以用到這種表示方式。接下來,跟著老貓揭開類圖的神秘面紗......

類圖的基本屬性

其實類圖還是相當簡單的,類圖只要概括起來就兩個比較重要的點,一個是類,第二個是類和類之間的關系,咱們弄清楚這兩個,其實類圖也就掌握了。
啥是類?對于OO程序員來說,這個類不就是咱們日常定義的class么,沒錯,其實就是這概念。其中包含類名、類的屬性、類的方法。

王者榮耀打過吧?老貓用自己比較喜歡的一個英雄“鐘馗”為案例和大家解析一下。如下圖:

上圖中咱們可以看到:

  1. 類名:最上面的矩形框中即為類名:鐘馗(Zhongkui)
  2. 類的屬性:類名下的第一個矩形圖中表示類的屬性,如上鐘馗案例中,其名稱、血條等等信息即為其屬性。
  3. 類的方法:在類屬性的下面就是類的方法,其中在鐘馗這個英雄類的方法中包含勾人--hook(),錘人--hammer()等等

上圖中我們可以看到無論是類的前面還是方法的前面其實都有不同的符號,其實這類符號就是作用域的概念。在類圖中,作用域主要有以下幾個:

  1. “+”:表示public,對所有的類都可見。
  2. “-”:表示private,僅僅只對當前類可見。
  3. “#”:表示protected,受保護的屬性或者方法,其子孫類可見。
  4. “~”:表示package,表示包內可見
  5. “=”:表示默認值,上述案例中可能沒有畫出來。大家概念知道一下即可。
  6. “_”: 下劃線,表示當前的這個類的方法或者屬性是靜態的。
  7. 斜體:老貓這里沒有畫出來,這里其實表示的是抽象,當然有的時候也會用兩個尖括號包裹來表示抽象,<<我是抽象類or接口>>。

方法和屬性冒號后面所表示的含義也不一樣,方法后面冒號后面的描述例如hammer():boolean,表示的就是返回值為boolean類型,是否錘到人。而屬性的冒號后面則表示的是當前該屬性的類型。

類之間的關系

我們再來看一個每個類和類之間的關系。直接看表示方式,如下圖:

上述圖中,咱們可能需要記住的是各種線條的表示方式。接下來,咱們一一來看

泛化(繼承)關系

我們舉一個鴨子繼承鳥類這樣一個例子。我們表示出來的話,如下:

表示方法:空心三角+實線,箭頭指向父類

上圖中我們清晰地看見子類鴨子繼承了父類所有的屬性,當然除此之外,子類還豐富了父類的方法,例如鴨子繼承下蛋的同時擴充了游泳。

小代碼:

public class Bird {
  public String feather;
  public String wing;
  public void layEggs() {

  }
}

public class Duck extends Bird {
  public String feather;
  public String wing;
  public void layEggs() {

  }
  public boolean swim() {
      return true;
  }
}

實現

抽象了飛翔這么一個接口,然后讓各種不一樣的鳥類進行實現,如下圖:

表示方法:空心三角+虛線,箭頭指向待實現的接口

表示實現接口中的所有的方法。

小代碼:

  public interface Fly {
    public void doFly();
  }

  public class WildGoose implements Fly {
    public void doFly() {

    }
  }

依賴

舉個例子,動物都依賴于空氣,于是咱們就有了下圖:

表示方法:尖括號+虛線,尖括號指向被依賴的類。

依賴關系表示一個類使用(依賴)另一個類的服務或信息。一般來說,依賴總是單向的,不應該存在雙向依賴。就拿上面的例子來說,動物依賴于空氣,咱們并不能說,空氣依賴于動物,可見依賴是單向的。

小代碼:

public class Animal {
   public void breath(Oxygen oxygen,Water water) {
      oxygen.supply();
      water.supply();
   }
}

public class Oxygen {
  public void supply(){

  }
}

關聯

說到關聯,種類比較多,但是理解起來還是比較簡單,即一類對象和另外一類對象之間存在某種關系。這種關聯關系分為單項關聯、雙向關聯、自關聯、多重關聯。在面向對象語言中,如果表示存在關聯關系,那么通常會將一個類的對象作為另外一個類的成員變量。

單向關聯

例如用戶在商城中購買東西之前都需要去設置地址,那么用戶和地址之間就是單向關聯關系。

表示方法:尖括號+實線,尖括號指向用戶的成員變量,即地址。

小代碼:

    public class User {
      private Address address;
      ...
    }
    public class Address{
      ...
    }
雙向關聯

例如用戶購買商品,商品同時也會被不同的人購買,那么這種行為就是雙向關聯。

表示方法:實線連接兩個類即可。

小代碼:

   public class User {
     private List<Product> products;
     ...
   }
   public class Product{
     private User user;
   }
自關聯

關于自關聯,其實我們日常開發中也遇到過,尤其是一些遞歸類的時候,例如樹形結構,大樹下面套小樹。

小代碼:

  public class Tree {
    private Tree subTree;
  }
多重關聯

多重關聯關系表示兩個關聯對象在數量上的對應關系。在UML中,對象之間的多重性可以直接在關聯直線上用一個數字或一個數字范圍表示。比如一條河上在某個時間有好幾只鴨子在上面浪,當然也可以沒有。但是在那個時刻對于那只鴨子而言,它只能在一條河里面浪。例子以及數量表示說明如下:

小代碼:

  private class River {
    private Duck[] ducks;
    ....
  }
  public class Duck {

  }

聚合

主要描述聚合關系,描述的是整體與部分的關系。對于聚合來說,成員對象是整體對象的一部分,當然成員對象也可以脫離整體獨立存在。這么說的話有點抽象了,打個比方,老貓有最近想要組裝一臺臺式電腦,于是我買了顯卡以及主板等等元器件。對于臺式機來說顯卡以及元器件是其一部分,但是顯卡以及主板又可以單獨作為商品進行售賣。于是我們就有了下面這樣一幅示意圖。

表示方法:空心菱形表示連接待聚合的那個類對象

小代碼:

  public class Computer {
    private KeyBoard keyboard;
    //構造方法注入
    public Computer(KeyBoard keyboard){
       this.keyBoard = keyboard;
    }
  }
  public class KeyBoard {

  }

組合

組合關系和聚合有點類似,也是描述整體和部分的關系,區別是聚合的話成員對象可以脫離整體單獨存在,但是組合是"同生共死"的組合對象關系。例如公司和部門之間的關系。即為組合關系。如果公司都涼涼了,那么還有部門么?
簡單一幅示意圖如下。

表示方法:實心菱形表示連接待組合的那個類對象

小代碼:

  public class Company {
    private  Department department;
    public Company(Department department){
      this.department = department;
    }
  }
  public class Department {

  }

綜合案例

若是看到此處,相信大家對類圖的各種表示方式已經了然于胸了吧。那么咱們接下來就來看看老貓繪制出來的類圖關系吧。

大家可以試試看看對照著老貓上面的梳理來讀懂這樣一個真實的模型類圖吧。

如何繪制類圖

寫了這么多,相信大家對如何繪制類圖用什么工具還是比較好奇的。

  1. 其實在idea中很多時候我們可以直接查看類圖。只要在類名上面右鍵單擊,選擇 Diagrams -> Show Diagram即可展示如下圖:

  1. 在上一篇文章中也有很多小伙伴問老貓流程圖是用什么畫的。其實都一樣的,老貓一般繪制這種圖就用兩種工具軟件,一種是drawio,另外一種是wps中的流程圖繪制。當然其實還有其他繪制工具,例如process on等等,大家可以自己去試試。

寫在最后

為了讓小貓更好地優化梳理爛慫代碼,老貓花了好幾個晚上整理出來了繪制的方法。其實無論是多么復雜的類,只要我們把握清楚其中的類圖關系,然后再結合上一篇文章中的業務模型對照起來一起看,就很清晰了。當然,前提是需要有足夠的耐心。

當然老貓費勁心血梳理uml的類圖繪制流程其實還有一個原因,就是接下來咱們要開啟“有趣的設計模式之旅”了。小伙伴們,持續關注老貓吧,相信后文更精彩。

總結

以上是生活随笔為你收集整理的梳理拯救烂怂代码?我是这么做的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。