主頁 > 軟體工程 > 一文詳解|如何寫出優雅的代碼

一文詳解|如何寫出優雅的代碼

2023-02-17 08:06:47 軟體工程

 

一、好代碼的定義

談到好代碼,我的第一想法就是優雅,那我們如何該寫出好的代碼,讓閱讀的人感受到優雅呢?首先簡單探討一下優雅代碼的定義,

關于好代碼的定義,各路大神都給出了自己的定義和見解

  • 整潔的代碼如同優美的散文,—— Grady Booch

  • 任何一個傻瓜都能寫出計算機可以理解的代碼,唯有寫出人類容易理解的代碼,才是優秀的程式員,—— Martin Fowler

首先要達成一致,我們寫的代碼,除了用于機器執行產生我們預期的效果之外,更多的時候是給人讀的,可能是后續的維護人員,更多時候是一段時間后的作者本人,因此優雅面向不同的用戶有兩層含義的解讀,

1.對人而言,代碼的整潔,清晰的邏輯;

2.對機器而言,準確性、執行性能、例外處理機制等;

這次,我們就來聊一聊,什么代碼是優雅的代碼,怎樣寫出優雅的代碼,
二、代碼整潔

1. 有意義的命名

簡單說就是類、方法、變數的命名要名副其實,要能描述清晰自己的職責,一個好的命名能輸出更多的資訊,它會告訴你,它為什么存在,它是做什么事的,應該怎么使用,一個簡單的衡量標準是,如果命名完仍需要注釋來補充語意,那就不是名副其實;
選個好名字要花時間,但省下的時間的時間比花掉的多,一旦發現有更好的名稱,就換掉舊的,
舉個例子:

public List<int[]> getItem() {
  List<int[]> list1 = new ArrayList<int[]>();
  for (int[] x: theList)
    if (x[0] == 4)
      list1.add(x);
  return list1;
}

整體邏輯沒啥問題,讀完之后,就有很多問題在腦海中產生

1. theList中是存盤什么東西的陣列?

2. theList第一個值是做什么的?

3. 值4的意義又是什么?

4. 回傳的串列該怎么使用?

代碼應該體現所處的情景,比方說上述的代碼所處情景是我們正在開發一種掃雷游戲,盤面是名為theList的單元格串列,那就將其名稱改為gameBoard,
盤面上每個單元格都用一個簡單陣串列示,零下標條目是一種狀態值,而這種狀態值為4代表“已標記”,只要改為有意義的名稱,代碼就得到了改進,
更進一步,不用int陣列來表示單元格,而是另寫一個類,該類包括一個名副其實的函式(稱為isFlagged),從而掩蓋住哪個魔術數4,得到新的函式版本,

public List<Cell> getFlaggedCells() {
  List<Cell> flaggedCells = new ArrayList<Cell>();
  for (Cell cell : gameBoard)
    if (cell.isFlagged())
     flaggedCells.add(cell);
  return flaggedCells;
}

 

2. 優雅的注釋

實際上,只要我們的代碼有足夠的表達力,能清晰的通過命名來做到名副其實,就不太需要注釋,或者根本不需要;注釋的存在往往是彌補我們無法用代碼清晰表達意圖的情況,可以想象一下,每次自己發現需要寫注釋的時候,是什么心態,擔心此處代碼明天自己看不懂或者別人看不懂,那有沒有考慮用更好的語意的代碼來替代,
但盡管有注釋,也有好有壞,有時候注釋也會撒謊,通常注釋存在的越久,就離其描述的代碼越遠,變得越來越離譜;因為代碼在變動在迭代,在注釋和代碼間可能會插入新的代碼,舊代碼我們通常copy來copy去,分離又重組,但注釋一般不會修改,就會造成注釋和描述的代碼分離,對閱讀者造成更大的迷惑,
我們在需要寫注釋的時候就要告訴自己,能不能用代碼來進行描述,以下是一些壞代碼的注釋bad case,
1. 一些被注釋掉的代碼
//something code
//something code

2. 位置標記
//begin
someting code;
//end

3. 簽名標記
/** add by xiaoli*/

4. 非公用方法的javadoc
/**
* doSomething
*/
private void doSomething(){
}

5. 日志式注釋
/** add xx
* update sometimes
* update sometimes
* update sometimes
*/

6. 誤導性注釋
//此處怎樣xx
 

3. 優雅的函式

3.1 務必要短小

方法應該有多短小?沒有明確約束,idea也不會限制你,但通常我們的方法不該長于一屏,至少多于一屏或者橫向外溢到螢屏以外最直觀的就會造成可讀性體驗差,讀了下面忘記上面,左右拖拽等,對大多數筆記本來說一屏大概就30行左右,短小精簡的方法要比30行短很多,比如:
public String renderPageWithSetupAndTeardowns(Page page, boolean isSuite) throws Exception{
  if(isTestPage(page)){
       includeSetupAndTeardownPages(page,isSuite);
    }
    return page.getHtml();
}
if陳述句、else陳述句、while陳述句等,其中的代碼應該只有一行,
改行通常是一個呼叫陳述句,這樣不但能保持短小,還可以給呼叫方法命名一個有說明性的名字,進一步增加代碼的可讀性

3.2 只做一件事

一事精,便可動人,這個普世法則甚至適用于各種場合,
像設計原則的單一職責模式,讓類只有一個職責,如果一個類有一個以上的職責,這些職責就耦合在了一起,這會導致邏輯混亂,設計耦合,當一個職責發生變化時,可能會影響其它的職責,
另外,多個職責耦合在一起,會影響復用性,針對方法而言更是如此,方法作為程式的原子單元,保持單一會有效提升復用性, 
那怎么判斷一個方法是否只做了一件事,最簡單的規則就是看看該方法是否能在拆出一個方法,且拆出去的方法是不同于該方法的詮釋和實作,但是要注意同一方法的邏輯層級務必要一致,

3.3 抽象層級一致

抽象層級一致也是對方法只做一件事的更高要求,抽象層級不一致的代碼一定是做了多件事,
我們讀代碼通常是自頂向下閱讀,我們想讓每個方法后面都跟著位于下一層級的方法,這樣我們可以依著抽象層級向下閱讀了,我們也需要這樣閱讀代碼,先有整體在展示細節,這種叫向下規則,這也是保持方法短小,確保只做一件事的訣竅,
一旦方法中混雜不同的抽象層級,會讓人很迷惑,因為沒辦法這個方法中判斷某個運算式是基礎概念還是細節,更惡劣的是,一旦細節與基礎概念混雜,更多的細節就會糾纏不清,舉例子我們想寫一個冰凍大象的需求:

//把大象裝進冰箱
public void frozenElephant(){
    //1. 捕捉大象
    //2. 運輸大象
    //3. 打開冰箱
    //4. 放入大象
    //5. 關閉冰箱
}
 
這個例子的1.2兩步就不是一個層級的邏輯,是屬于更高層級的抽象,3.4.5都是將大象放入冰箱的步驟,屬于低層級的抽象,可以將代碼拆分為如下實作,將高抽象層級的代碼聚合提取出來,細節在分別單獨實作,如下:
public void frozenElephant(){
    //1. 捕捉大象
    catchElephant();
    //2. 運輸大象
    transportElephant();
    //將大象放入冰箱
    putElephantInRefrigerator();
}
public void catchElephant(){
}
public void transportElephant(){
}
public void putElephantInRefrigerator(){
    //打開冰箱
    //放入大象
    //關閉冰箱
}
3.4 使用例外替代回傳錯誤碼
針對錯誤碼的判斷會導致更深層次的嵌套結構,回傳錯誤碼就意味著要求呼叫者跟著處理錯誤,如下:
if(deletePage() == OK){
    if(registry.deleteReference(page.name) == OK){
        if(configKeys.deleteKey(page.name.makeKey) == OK){
            logger.log("page deleted")
        }else{
            logger.log("configKey not deleted")
        }
    }else{
        logger.log("deleteReference from registry failed")
    }
}else{
    logger.log("delete failed")
    return Error;
}
 
一般我們還需要將try/Catch代碼塊給抽離出去,另外形成方法,防止代碼塊過多搞亂代碼結構,分不清錯誤處理還是正常流程,同時因為方法只做一件事,錯誤處理就是一件事,因此錯誤處理的方法不應該在做其他事,也就是如果一個方法中有try關鍵字,那try就是方法的開頭,catch/finally代碼塊后面也不應該再有內容,如下:

try{
    deletePage(page);
    registry.deleteReference(page.name);
    configKeys.deleteKey(page.name.makeKey);
}catch(Exception e){
    logger.log(e.getMessage());
}
 

3.5 使用第三方庫

比如Lombok組件通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法 舉例如下:
比如Apache Commons系列組件給我們提供了關于字串、集合、IO操作等工具方法,這些組件是個大寶庫,提供了不少輪子:
beanUtils
JavaBean進行各種操作,克隆物件、屬性等等
codec
處理常用的編碼方法的工具類包,例如DES、SHA1、MD5、Base64等.
collections
java集合框架操作
configuration
java應用程式的配置管理類別庫
io
io工具的封裝
lang
Java基本物件方法的工具類包 如StringUtils、ArrayUtils等等.
logging
提供的日志介面
net
提供了客戶端和服務器端的資料驗證框架

三、代碼重構

重構是對軟體內部結構的一種調整,目的是在不改變軟體可觀察行為的前提下,提高其可理解性,降低其修改成本,
在重構之前一定要知道,一旦開始對類和方法進行重構,就需要事前有完備的單元測驗用例來保障重構的準確性,每次重構之后都要去執行對應的單元測驗用例,驗證重構的正確性!

 

1. 識別代碼的壞味道

 

1.1 重復的代碼

如果在一個以上的地點看到相同的代碼結構,可以肯定的是,想辦法抽線出來合而為一,代碼會變得更好,一般包含幾個點的重復:

1.最單純的重復代碼就是“同一個類的兩個函式含有相同的運算式”,這時候需要做的就是采用提煉函式提煉出重復的代碼,然后讓這兩個地點都呼叫被提煉出來的那一段代碼

2.如果重復代碼只是相似而不是完全相同,需要先嘗試用移動陳述句重組代碼順序,把相似的部分放在一起以便提煉,

3.如果重復的代碼段位于同一個超類的不同子類中,可以使用函式上移來避免在兩個子類之間互相呼叫,

1.2 過長的函式

遵循這樣一條原則:每當感覺需要以注釋來說明點什么的時候,就把需要說明的東西寫進一個獨立函式中,并以其用途(而非實作手法)命名,可以對一組甚至短短一行代碼做這件事,哪怕替換后的函式呼叫動作比函式自身還長,只要函式名稱能夠解釋其用途,就要毫不猶豫地那樣做,關鍵不在于函式的長度,而在于函式“做什么”和“如何做”之間的語意距離,

1.百分之九十九的場合里,要把函式變短,只需使用提煉函式,找到函式中適合集中在一起的部分,將它們提煉出來形成一個新函式,

2.如果函式內有大量的引數和臨時變數,最終就會把許多引數傳遞給被提煉出來的新函式,導致可讀性幾乎沒有任何提升,此時可以經常運用以查詢取代臨時變數來消除這些臨時元素,引入引數物件和保持物件完整則可以將過長的引數串列變得更簡潔一些,

3.如果有多個switch陳述句基于同一個條件 進行分支選擇,就應該使用以多型取代條件運算式,

1.3 資料的可變性

對資料的修改經常導致出乎意料的結果和難以發現的bug,在一處更新資料,卻沒有意識到軟體中的另一處期望著完全不同的資料,于是出現難以預料的bug,往往比較難排查(需要排查資料流轉的整體鏈路),這就需要一些方法用于約束對資料的更新,降低資料可變性的風險,

1.可以用封裝變數來確保所有資料更新操作都通過很少幾個函式來進行,使其更容易統一監控和演進

2.如果一個變數在不同時候被用于存盤不同的東西, 可以使用拆分變數將其拆分為各自不同用途的變數,從而避免危險的更新操作,

3.使用移動和提煉函式盡量把邏輯從處理更新操作的代碼中搬移出來,將業務處理邏輯代碼與執行資料更新操作的代碼分開,

1.4 模塊單一職責

所謂模塊化,就是力求將代碼分出區域,最大化區域內部的互動、最小化跨區域的互動,但是經常出現一個函式跟另一個模塊中的函式或者資料交流格外頻繁,遠勝于與所處模塊內部的交流,這就是模塊功能不單一的典型情況,

1.總看到某個函式為了計算某個值,從另一個物件那兒呼叫半打的取值函式,如果這個函式需要跟這些資料待在一起,那就使用移動功能把它移過去,

2.一個函式往往會用到幾個模塊的功能,那么它究竟該被置于何處呢?原則是:判斷哪個模塊擁有的此函式使用的資料最多,然后就把這個函式和那些資料擺在一起, 如果先以提煉函式將這個函式分解為數個較小的函式并分別置放于不同類中,上面的步驟就會比較容易完成,

3.Strategy模式和Visitor模式是為了對抗發散式變化,但也能解決單一職責問題,最根本的原則是:將總是一起變化的東西放在一塊兒, 資料和參考這些資料的行為總是一起變化的,如果有特殊情況,我們就搬移那些行為,保持變化始終只在一地發生,

2. 函式重構的方法

 

2.1 Extract Method

提取函式
這個是最常用的操作,將大函式按模塊拆分為幾個小的函式,在重構時提倡將代碼模塊細分,因為模塊越小,可重用度就越大,不要寫大函式,如果你的函式過大,那么這意味著你的函式需要重構了,因為函式過大,可維護性,可理解性就會變差,并且當你實作類似功能的時候就容易產生重復代碼,寫代碼時,最忌諱的就是代碼重復,

2.2 Inline Method

行內函式
這個和Extract Method是相對的,如果重構程序中對模塊進行過度拆分的話,就需要使用該方法對函式進行中和,將過度拆分的函式在組裝到一起,

2.3 Replace Temp with Query

以查詢取代臨時變數
說白了就是將有著復雜運算式賦值的邏輯使用函式查詢取代,這樣一來在實作類似功能的函式時,這些復雜的臨時變數就可以進行復用,從而減少代碼的重復率,使用合理的命名解釋復雜的運算式邏輯也增強了可讀性,

2.4 Inline Temp

行內臨時變數
與2.3 Replace Temp with Query相對,就不過多贅述了,

2.5 Introduce Explaining Variable

引入解釋性變數
引入變數是為了解釋該運算式中的一部分的功能的,目的在于讓該運算式具有更好的可讀性,使用Introduce Explaining Variable規則,就相當于為該運算式添加上相應的注釋

2.6 Split Temporary Variable

分解臨時變數
具體說來就是在一個函式中一個臨時變數不能做兩種事情,也就是一個臨時變數不能賦上不同意義的值,如果你這么做了,那么對不起,請對該重復使用的臨時變數進行分解,也就是說你需要創建一個新的臨時變數來接收第二次分配給第一個臨時變數的值,并為第二個臨時變數命一個確切的名字,

2.7 Remove Assignments to Parameters

移除對引數的賦值
就是在函式中不要對函式引數進行賦值,當直接對函式的引數進行修改時,就應該對此重構,因為這樣會使引數的原始值丟失,我們需要引入臨時變數,然后對這個臨時變數進行操作,

2.8 Replace Method with Method Object

以函式物件取代函式
當一個特別長的函式,而且函式中含有比較復雜的臨時變數,使用上述方法不好進行重構時,就要考慮將該函式封裝成一個類了,這個對應的類的物件就是函式物件,我們可以將該場函式中的引數以及臨時變數轉變成類的屬性,函式要做的事情作為類的方法,將函式轉變成函式類后,我們就可以使用上述的方法對新類中的函式進行重構了,

 

四、小結

關于代碼的邏輯和重構都是很基礎的東西,在寫代碼之前我們就要思考如何做到整潔、優雅,并一直遵循這些經驗來撰寫代碼,所謂的“代碼感”就自然而然的滋養而出,
要時刻提醒自己,僅僅撰寫出可運行的代碼是遠遠不夠的!要以一個分享者的角度去寫代碼,再換位成一個閱讀者的視角去審視自己的代碼,如果能做了自己心里那一關,那一切就OK了!
作者|李星霖(小李)

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/How-to-write-elegant-code.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/544142.html

標籤:其他

上一篇:PMP工具與技術--4.8.2-1 實施定性風險分析工具與技術

下一篇:一文詳解|如何寫出優雅的代碼

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more