1. 程式人生 > 其它 >高階軟體工程總結 SA20225470 韋懿

高階軟體工程總結 SA20225470 韋懿

在本學期的高軟課程中,我一共完成了五個實驗:

1.VSCode 主要是快捷鍵的使用

2.Git及其常用場景

3.正則表示式的使用

4.使用VSCode中的draw.io畫UML用例圖

5.實驗驗證軟體中的一些特殊機制

1VSCode快捷鍵

  1. Ctrl/⌘+Shift+E 檔案資源管理器
  2. Ctrl+Shift+G 原始碼管理
  1. Ctrl/⌘+Shift+F 跨檔案搜尋
  2. Ctrl/⌘+Shift+D 啟動和除錯
  1. Ctrl/⌘+Shift+P 查詢並執行所有命令
  2. Ctrl/⌘+Shift+M 檢視錯誤和警告
  1. Ctrl/⌘+Shift+X 管理擴充套件外掛
  2. Ctrl+` 切換整合終端
  1. Ctrl/⌘+O 開啟資料夾
  2. Ctrl/⌘+N 新建檔案
  1. Ctrl/⌘+S 儲存檔案
  2. Ctrl/⌘+F搜尋
  1. Ctrl+1、2、3… 選中某個檔案編輯器

2git

2.1Git 本地版本庫用法參考

git init # 初始化一個本地版本庫
git status # 檢視當前工作區(workspace)的狀態
git add [FILES] # 把檔案新增到暫存區(Index)
git commit -m "wrote a commit log infro” # 把暫存區裡的檔案提交到倉庫
git log # 檢視當前HEAD之前的提交記錄,便於回到過去
git reset —hard HEAD^^/HEAD~100/commit-id/commit-id的頭幾個字元 # 回退
git reflog # 可以檢視當前HEAD之後的提交記錄,便於回到未來
git reset —hard commit-id/commit-id的頭幾個字元 # 回退

2.2Git 遠端版本庫用法參考

git remote管理本地版本庫跟蹤的遠端儲存庫的命令
git fetch
git push
git clone
git pull(拉取)是實際上是 git fetch + git merge

同步操作

git pull
git push

合併分支原理

Git版本管理的基礎,是按行對比(line diff)將差異的部分作為一個增量補丁,通過git add新增到暫存區裡的每一個檔案都會由line diff得到該檔案的增量補丁,而git commit將暫存區裡的所有檔案的增量補丁合併起來存入倉庫就是一個commit。

2.3團隊專案中的分叉合併

git checkout -b mybranch 建立分支
git branch 檢視分支列表
git merge mybranch 合併mybranch分支到當前的master分支
git merge --no-ff mybranch 合併後保留分支

團隊專案工作流程參考

1、克隆或同步最新的程式碼到本地儲存庫;

git clone https://DOMAIN_NAME/YOUR_NAME/REPO_NAME.git
git pull

2、為自己的工作建立一個分支,該分支應該只負責單一功能模組或程式碼模組的版本控制;

git checkout -b mybranch
git branch

3、在該分支上完成某單一功能模組或程式碼模組的開發工作;多次進行如下操作:

git add FILES
git commit -m "commit log"

4、最後,先切換回master分支,將遠端origin/master同步最新到本地儲存庫,再合併mybranch到master分支,推送到遠端origin/master之後即完成了一項開發工作。

git checkout master
git pull
git merge --no-ff mybranch
git push

2.4Git Rebase

如果你想讓"mywork"分支歷史看起來像沒有經過任何合併一樣

$ git checkout mywork
$ git rebase origin

http://gitbook.liuhui998.com/4_2.html

2.5Fork + Pull request

3正則表示式

匹配多個字元 |

區分大小寫

VSCode 預設忽略大小寫 Alt+C設定

vim 預設大小寫敏感 set ignorecase 設定為忽略大小寫;通過:set noignorecase 恢復到大小寫敏感的狀態。\c 表示大小寫不敏感,\C 表示大小寫敏感,比如/ignorecase\c

萬用字元的基本用法

萬用字元“.”將匹配任意一個字元。萬用字元也可稱為 dot 和 period。你可以像正則表示式中的任何其他字元一樣使用萬用字元。例如,如果你想匹配“hug”,“huh”,“hut”和“hum”,可以使用正則表示式hu.來匹配這所有四個字串。

萬用字元“+”用來查找出現一次或多次的字元,例如hahhhhh,可以使用正則表示式hah+來匹配。

萬用字元“*”匹配零次或多次出現的字元,使用正則表示式hah*來匹配,還可以匹配ha字串。

萬用字元“?”指定可能存在的元素,也就是檢查前一個元素存在與否,如正則表示式colou?r、favou?rite中萬用字元“?”前面的u字元存在和不存在兩種情況的字串都會匹配。

{}的使用

要匹配字串"aaah"中出現 3 到 5 次的 a,你的正則表示式將是a{3,5}h;

僅匹配字串"haaah"與至少出現 3 次的字母 a,正則表示式將是/ha{3,}h;

為了僅匹配"hah"中出現 3 次的字母 a,你的正則表示式將是/ha{3}h。

匹配具有多種可能性的字符集

[] 你要匹配"bag","big"和"bug",而不是"bog"。你可以建立正則表示式/b[aiu]g 來執行此操作
- 字符集[0-5]匹配 0 和 5 之間的所有數字,包括 0 和 5。
^ [^aeiou]排除母音的所有字元。

貪婪匹配 vs. 懶惰匹配

正則表示式預設貪婪匹配,即匹配最長字串

?可以改為懶惰匹配 例如:t[a-z]*?i正則表示式會返回["ti"]

一些特殊位置和特殊字元

插入字元“^”用於表示字串的開頭。

美元字元“$”表示字串的末尾。

如在"Ricky is first and can be found”查詢開頭的 Ricky 則為^Ricky,查詢結尾的 found 則為/found$

可以使用\s 搜尋空格,這是一個小寫的 s 即 space 之意。此模式不僅匹配空格,還包括回車、製表符、換頁和新行字元。你可以將其看作與字符集[\r\t\f\n\v]類似。

使用\S 搜尋非空格,這是一個大寫的 S。此模式將不匹配空格、回車符、製表符、換頁和新行字元。你可以想象它類似於字元類[^\r\t\f\n\v]。

捕獲組

匹配字串中連續出現三次的數字,每個數字由空格分隔,如(\d+)\s\1\s\1。

Vim 中基本的字串搜尋替換方法

:n1,n2s/word1/word2/g,以:開頭,n1 與 n2 為數字,即在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 字串

其中 s 是 substitute 的簡寫,表示執行替換字串操作;最後的/g 是 global 的簡寫,表示全域性替換。另外與/g 的用法相似,/c 是 comfirm 的簡寫,表示操作時需要確認;/i 是 ignorecase 的簡寫,表示不區分大小寫。

在 100 到 200 行之間搜尋 regex 並取代為 RegEx 則為:100,200s/regex/RegEx/g。

:1,$s/word1/word2/g 或 :%s/word1/word2/g 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 字串

:1,$s/word1/word2/gc 或 :%s/word1/word2/gc 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 字串,且在取代前顯示提示資訊給使用者確認 (confirm) 是否需要取代。

複用捕獲組的方式進行替換

如果想將專案中所有的HTML標題標籤中h改為大寫H,搜尋正則表示式<h(\d)>可以查找出所有標題標籤,如<h1>、<h2>、<h3>、<h4>等,其中還定義了捕獲組(\d)。替換的正則表示式<H$1>使用$1複用了搜尋正則表示式中定義的捕獲組(\d)

在Vim中,複用捕獲組的方式進行替換的用法為:1,$s/(capture groups)/$1/g

如果想在當前檔案中將所有的HTML標題標籤中h改為大寫H則正則表示式為:1,$s/<h(\d)>/<H$1>/g

4.UML用例圖

本實驗時配置vscode,安裝draw.io外掛,並使用該外掛繪製uml用例圖,畫起來十分方便而直觀,以下是我與同學的工程實踐的一個UML用例圖,用draw.io畫出來:

5.軟體中的一些特殊機制

回撥函式

/*
* Search a LinkTableNode from LinkTable
* int Conditon(tLinkTableNode * pNode,void * args);
*/
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args);

多型

閉包

function makeFunc() {
    var name = "Mozilla";
    function displayName() {
        alert(name);
    }
    return displayName;
}

var myFunc = makeFunc();
myFunc();

非同步呼叫

var promise = new Promise(function(resolve, reject) {
  if (/* 非同步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) { // resolve(value)
  // success
}, function(value) { // reject(error)
  // failure
});